STM32中断
- 68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。
- 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
就是NVIC为中断管理器,覆盖主要外设和系统事件,分配中断优先级。而EXIT则是管理外部中断的。
- 抢占优先级(先占pre-emption priority):抢占优先级高的中断来时,暂停当前执行程序,转到中断程序执行。
- 响应优先级(从占subpriority):执行完再转到中断程序。
NVIC
一个外设有多条中断通道,而NVIC只有一个输出口。
对于每个中断有16个优先级,而这16个又可以设置为抢占优先级和响应优先级。
EXTI
- EXTI可以检测GPIO口的电平变化从而向NVIC提出中断申请。
- 支持上升沿、下降沿、双边沿和软件触发。
- 支持所有GPIO口。但相同Pin口不能同时触发中断,如PA1和PB1不能,但PA1和PA2可。
- 提供16个GPIO_Pin作为外部中断通道,同时还支持一些其他外部事件,如PVD输出、RTC闹钟、USB唤醒和以太网唤醒等。
AFIO只选择一个Pin口,因此不能选择相同的Pin口。
GPIO先经过AFIO的选择,再进入到EXTI,然后再通过NVIC中断控制。
外部中断配置代码
1. 开启时钟。使用RCC开启时钟,因为这里选择GPIOA,而GPIOA和AFIO都是APB2外设的。
2. 配置GPIO口,输入模式。开启完GPIO时钟后,初始化。
3. 配置AFIO,选择输出连接到EXTI。使用GPIO_EXTILineConfig()函数来,配置AFIO数据选择器选择中断引脚。
4. 配置EXTI,选择边沿触发方式和触发响应方式。
EXTI库函数:
这里就使用初始化函数配置EXTI。
5. 配置NVIC,给中断配置合适优先级。
NVIC库函数
第一个为设置中断分组,第二个初始化,第三个设置中断向量表,第四个系统低功耗配置。(后两个用的不多)
要配置NVIC,先要指定一下分组,然后再初始化。
用PriorityGroupConfighan()确定抢占优先级和响应优先级的分配位数,这个自己决定。
数字小等级高,一个中断配置好抢占和响应的位数后,抢占优先级高的可以打断抢占优先级低的程序,当抢占优先级一样,响应优先级高的先执行。
注:中断优先级分组只需要在系统初始化阶段设置一次,设置好后不改变保证中断管理的一致性。
然后是NVIC的初始化。
还是一样,创建结构体变量,给结构体成员赋值。可以转到定义查看参数是什么。
第一个选择中断通道,转到定义,跳转到stm32f10x.h文件查看要选择的中断通道。
根据自己的芯片选择相应的中断通道列表,这里用的是stm32103C8T6,选的是md。
展开找到我们选用的EXTI14,10-15都公用一个通道。结构体第一个参数指定完成,第二个中断通道使能ENABLE。
第三个和第四个是指定所选通道的优先级。三是抢占,四是响应。
优先级是在多个中断同时申请,产生拥挤时起作用。
配置完成后就可以开始写中断程序了,中断程序放在中断函数里。而中断函数的名字时固定的,每个中断通道有对应的中断函数名,可以在启动文件中查找。
找到EXTI14对应的EXTI15_10_IRQHandler,然后编写程序。(中断函数都是无参无返回值,也不需要声明)
首先要进行中断标志位判断,确保是需要的中断源触发。
在最后也需要清除标志位,因为只要中断标志为1就会进入中断函数,如果不清除,就会一直在中断函数里。