EXIT(1)

EXTI介绍

在这里插入图片描述
EXTI是片上外设 NVIC是cpu内的外设 回忆起之前的GPIO和AFIO 我们是如何检测按键按下的 我们是一直用while循环读取IDR寄存器的对应位置的值 一直检测判断按键是否被按下
那么是否有第二种方式检测按键是否被按下了呢?
通过EXTI 当EXTI检测到按键的电平发生变化 就会触发一个中断 送到NVIC进行相应的处理 就会触发相应的中断函数
在这里插入图片描述

EXTI的工作原理

EXTI的作用就是检测外部信号的变化由此产生中断
在这里插入图片描述
首先外部输入一个信号 信号有上升沿和下降沿 经过边路检测分为上升沿和下降沿还有双边沿三路信号 通过边沿的选择选择是哪路信号传入下一个的或门 (这里举例的是边沿选择选择的是上升沿)进入到或门后要看中断是否屏蔽如果没有屏蔽就接着往下传输 到脉冲位产生中断 看中断挂起 脉冲置为为1 无法自己清零 需要手动清零手动清零后电平型中断就为0 还有上升沿信号传入后还可以变为事件

事件

在这里插入图片描述
中断的模型就是片上外社产生一个中断传输到NVIC(CPU内)然后进行中断仲裁 然后通过后执行相应的中断函数 有CPU的参与
事件就是外部产生一个终端信号给与EXTI产生事件给部件将部件从睡眠模式中唤醒 不需要CPU的介入
在这里插入图片描述
检测多路信号 就是多个这样的结构同时检测多路信号的输入
EXTI的20路信号有什么用?
1.让所有IO具备触发中断的能力
在这里插入图片描述
EXTI具有19个通道 一个通道对应abcde…的第0个io口 依次类推所有的io口都连接到了EXTI上都具备了触发中断的能力 当每一个 如PA0口连接到EXTI0时其他都不能连接了
只用EXTI的16个通道作为IO引脚的触发 其他四个通道具有特殊的功能
在这里插入图片描述

EXTI的寄存器组

在这里插入图片描述
每一列对应的都是一个通道 TP0这一列对应的就是第1个通道

在这里插入图片描述
这里以EXTI0为列子 如果想上升沿TR0就写1 (上面) 下面的TR0就写0 如果想双沿触发就全部写1
在这里插入图片描述
中断屏蔽寄存器对应着开关 对应的通道的寄存器位写0就断开 写1就闭合事件屏蔽寄存器也是如此

EXTI的编程接口

在这里插入图片描述
第一个line参数是要哪一个EXTI的通道 第二个参数Mode是要什么模式 是中断模式 触发中断 传输到NVIC还是要事件模式 唤醒部件 第三个参数Trigger什么触发模式 上升还是下降还是双边 第四个参数linecmd是 是否要开启中断或者事件屏蔽如果选择的是事件模式就是控制下面的事件屏蔽开关 如果选择的是中断模式那么控制的就是上面的中断屏蔽开关
声明一个结构体变量 然后填表把相应的值填进去

在这里插入图片描述
第一个函数EXTI_Init是上面的函数 第二个函数Generate 返回值是空 传入的值是通道号(后面的也是如此) 通过调用这个函数(编程接口)可以产生软件中断就是在软件触发哪里可以产生一个脉冲信号触发一个中断在这里插入图片描述
第三个函数getflag 获取标志位的值 1位set 0为reset 会返回值1或者0在这里插入图片描述
第四个函数clearflag是清除标志位当信号传输到中断挂起位置时候产生的是一个电平型的信号 需要手动清零
在这里插入图片描述
第五个函数getstatus 是需要中断屏蔽和中断挂起为1才会为1(需要使能这个中断同时出触发这个中断)同样也会返回值 0或者1 reset或set
最后一个函数同样也是清除标志位 但是会经常用的就是这个函数 这个函数和第三个完全一样 但是由于名字会经常使用这个函数清除标志位

按钮编程实验

在这里插入图片描述
回忆一下之前按钮的编程时使用while语句一直检测previous(之前的电平)和current(当前的电平)的值然后判断两个值是否相等来判断按键是否按下或松开(按键按下或者松开previous和current的值都不会相同) 一直循环的去检测两个值 使用中断来实现按键编程
选择上升沿触发 因为我们要按键松开才该改变灯的电平就是从0电位到1电位 是一个上升沿 然后要使用PA0 PA1两个IO口所以EXTI要使用EXTI0和EXTI1两个通道
编程思路梳理
在这里插入图片描述
首先要使用按钮就要初始化两个io端口 然后要配置AFIO使得端口PA0和PA1连接到EXTI0 和EXTI1(也就是EXTI的IO映射)
在这里插入图片描述
然后EXTI0和EXTI1会分别产生两路中断传输到NVIC 接着配置NVIC
在这里插入图片描述
先配置中断屏蔽先把开关打开 然后配置中断优先级 配置几个位给抢占优先级和子优先级
(红色虚线的位置)

EXTI的IO映射

在这里插入图片描述
EXTI通道初始化
在这里插入图片描述
如果自己填
在这里插入图片描述

去头文件中搜这个结构体 EXTI_InitTypeDef在头文件中找每一个要填表的值 搜索后面的ctrl+f搜索填入表中每一行对应的值如第一行在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/f1daeb5f597a4f7aa7ff35668528fd24.png)

在这里插入图片描述
中断函数的名称要在stm32中启动文件中寻找
在这里插入图片描述
这就是个弱方法 就是先占名然后用重名的函数覆盖掉
在这里插入图片描述
点灯就是写0就亮起 写1就熄灭

#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	PAL_Init();
	
	// 1. 初始化IO引脚
	// 将PA0和PA1分别设置为输入上拉模式
	// 开启GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	// PA0, PA1
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin  = GPIO_Pin_0 | GPIO_Pin_1;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIOInitStruct);
	
	// 2. 配置EXTI的引脚映射
	// 开启AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	// PA0 -> EXTI0
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
	// PA1 -> EXTI1
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
	
	// 3. 初始化EXTI
	// 3.1. 初始化EXTI0
	EXTI_InitTypeDef EXTIInitStruct;
	EXTIInitStruct.EXTI_Line = EXTI_Line0;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	// 3.2. 初始化EXTI1
	EXTIInitStruct.EXTI_Line = EXTI_Line1;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	
	// 4. 初始化NVIC
	NVIC_InitTypeDef NVICInitStruct;
	// 4.1. EXTI0
	NVICInitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVICInitStruct.NVIC_IRQChannelSubPriority = 0;
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	// 4.2. EXTI1
	NVICInitStruct.NVIC_IRQChannel = EXTI1_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVICInitStruct.NVIC_IRQChannelSubPriority = 0;
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	
	// 5. 初始化PC13
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // Open-drain
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIOInitStruct);
	
	while(1)
	{
	}
}

void EXTI0_IRQHandler(void)
{
	// 清除中断
	EXTI_ClearITPendingBit(EXTI_Line0);
	// 点亮LED PC13 <- 0
	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}

void EXTI1_IRQHandler(void)
{
	// 清除中断
	EXTI_ClearITPendingBit(EXTI_Line1);
	
	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/140365.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言ZZULIOJ1149:组合三位数之二

题目描述 把1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9&#xff0c;组成三个三位数&#xff08;每个数只能用一次&#xff09;,第二个数是第一个数的2倍&#xff0c;第三个数是第一个数的3倍&#xff0c;这三…

Hosts File Editor 实用工具

我一般手工编辑hosts文件&#xff0c;我想给hosts文件加一个开关&#xff0c;本想自己实现&#xff0c;但是忽然发现微软已经提供了官方的解决方案&#xff0c;感觉有能人。 对文件的行的修改被抽象成了一个开关。腻害&#xff01;&#xff01;&#xff01;

使用百度语音识别技术实现文字转语音的Java应用

探讨如何使用百度语音识别技术将文字转换为语音的Java应用。百度语音识别技术是一种强大的语音识别服务&#xff0c;可以将输入的文字转换为自然流畅的语音输出。我们将使用Java编程语言来实现这个应用&#xff0c;并提供相应的源代码。 首先&#xff0c;我们需要准备一些前提…

Leetcode—67.二进制求和【简单】

2023每日刷题&#xff08;二十八&#xff09; Leetcode—67.二进制求和 实现代码 void reverse(char *a, int len) {for(int i 0; i < len / 2; i) {char tmp a[i];a[i] a[len - 1 - i];a[len - 1 - i] tmp;} }char* addBinary(char* a, char* b) {int len1 strlen(a…

计算机视觉:使用opencv实现银行卡号识别

1 概述 1.1 opencv介绍 OpenCV是Open Source Computer Vision Library&#xff08;开源计算机视觉库&#xff09;的简称&#xff0c;由Intel公司在1999年提出建立&#xff0c;现在由Willow Garage提供运行支持&#xff0c;它是一个高度开源发行的计算机视觉库&#xff0c;可以…

Django路由层解析

路由层(urls.py) Django的路由层是用于将URL映射到视图函数的机制。它用于确定请求URL&#xff08;HTTP请求&#xff09;应该被哪个视图函数处理。 Django的路由层包括两个部分&#xff1a; URL模式&#xff1a;匹配请求URL&#xff0c;决定应该使用哪个视图函数来处理请求。UR…

Windows配置wxWidgets开发

1、编译 从官网下载wxWidgets源码,解压后进入build/msw目录,按自己安装的VS版本去选择sln打开,在VS的菜单拦找到【生成】菜单下的【批生成】菜单,点击进入, 点选【全选】然后点【生成】按钮。等上两、三个小时在项目目录的lib文件夹就可以看到生成的dll与lib目录,如下: …

CountDownLatch使用

常用于多线程场景&#xff0c;待多线程都结束后方可继续主线程逻辑处理 CodeConstant 常量类 import java.util.HashMap; import java.util.Map;public class CodeConstant {public static final Map<String, Map<String, String>> CODE new HashMap<>();…

真心建议测试工程师学完Pytest框架实战,跳槽必备,学完能涨薪5k

【文章末尾给大家留下了大量的福利】 应用场景&#xff1a; pytest 框架可以解决我们多个测试脚本一起执行的问题。 它提供了测试用例的详细失败信息&#xff0c;使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittest、doctest 和 nose&#xff0…

python双端队列_中间是头两边是尾_两边是头中间是尾

双端队列的顺序表存储结构以及两种特殊的双端队列 双端队列 是一种允许我们同时从前端和后端添加和删除元素的特殊队列&#xff0c;它是队列和栈的结合体。 双端队列&#xff08;deque&#xff09;与队列&#xff08;queue&#xff09;就差了两个字&#xff0c;队列里元素只能…

redis之org.springframework.data.redis.RedisSystemException: Error in execution

背景 在运行某系统时&#xff0c;在测试类向redis中存入某值&#xff0c;然后取出。 一、遇到的问题 报错&#xff1a; org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: …

基于Python实现,调用百度通用翻译API-详解

概述 在工作上需要各个国家语言的翻译方面很多地方用的上。 获取API权限: 登录百度账号,在个人信息界面,包括修改密码、绑定手机、身份人证等 https://api.fanyi.baidu.com/api/trans/product/desktop?req=developer 百度翻译开放平台 在开发者中心:需要开通个人账号…

我国陆地遥感卫星发展现状与展望

一、引言 从20世纪90年代末至今&#xff0c;我国陆地遥感卫星事业历经二十多年&#xff0c;实现了从无到有、从小到大、从弱到强的跨越发展。随着高分辨率对地观测系统重大专项&#xff08;高分专项&#xff09;、《陆海观测卫星业务发展规划&#xff08;2011—2020年&#xff…

通过Python设置及读取PDF属性,轻松管理PDF文档

PDF文档属性是嵌入在PDF文档中的一些与文档有关的信息&#xff0c;如作者、制作软件、标题、主题等。PDF属性分为默认属性和自定义属性两种&#xff0c;其中默认属性是一些固定的文档信息&#xff0c;部分信息自动生成&#xff08;如文件大小、页数、页面大小等信息&#xff09…

【ruoyi】微服务关闭登录验证码

登录本地的nacos服务&#xff0c;修改&#xff1a;配置管理-配置列表-ruoyi-gateway-dev.yml 将验证码的enabled设置成false&#xff0c;即可

c语言从入门到实战——初识指针

初识指针 前言1. 内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引用操作符 2.3 指针变量的大小 3. 指针变量类…

酷柚易汛ERP - 序列号跟踪表

1、应用场景 对于3C数码、医疗器械等行业&#xff0c;商品价值高且需要进行售后服务&#xff0c;需要对商品进行序列号管理&#xff0c;通过序列号跟踪表可查询每个序列号入库、出库、退货、调拨、盘点等流向。 2、主要操作 打开【仓库】-【序列号跟踪表】&#xff08;系统设…

c++-哈希

文章目录 前言一、unordered系列关联式容器1、unordered_map2、性能测试 二、哈希1、哈希概念2、哈希冲突3、哈希冲突解决3.1 闭散列3.2 开散列3.3 字符串Hash函数3.4 哈希桶实现的哈希表的效率 三、哈希表封装unordered_map和unordered_set容器1、unordered_map和unordered_se…

查看dll是32位还是64位

根据资料&#xff0c;用记事本打开dll文件&#xff1b;找到字符串 PE&#xff0c;其后不远如果出现L&#xff0c;是32位&#xff1b;字符串PE后出现 d? 是64位&#xff1b; 打开一个看一下&#xff1b;这个是32位&#xff1b; 这是从网上看的&#xff1b; 然后用dumpbin.exe工…

漏洞复现--IP-guard flexpaper RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…