这是做了两个小项目后重新回顾中断,以下使两个项目的链接,中断回调函数经常被使用,要深刻理解它的意义.另外如果有时间,会在写一篇HAL库的名称介绍,感谢支持
电动车报警系统
https://blog.csdn.net/2301_76153977/article/details/154188748?spm=1001.2014.3001.5501
智能排队控制系统
https://blog.csdn.net/2301_76153977/article/details/154238447?spm=1001.2014.3001.5501
本篇将围绕三个大版块并结合上面两个小项目的经验来讲述中断
1 什么是中断
中断是单片机正在执行程序时,由于内部或外部事件的触发,打断当前程序,转而去处理这一事件,当处理完成后再回到原来被打断的地方继续执行原程序的过程。
要深入理解上面这个中断图,比如
systick模拟多线程实验时,为什么两个小灯不同频率闪烁的代码写在中断服务函数里,就能实现功能呢?
答:SysTick 通常配置为每 1ms 产生一次中断
每次中断时,这个函数自动被调用,执行完中断程序再回到断点
函数内部维护两个任务的计时器,实现:
- 任务1:每秒执行一次(1000ms)
- 任务2:每0.5秒执行一次(500ms)
在main函数的HAL_Init()函数中默认设置的是每过1ms调用一下中断函数systick_isr(),相当于每过1ms都会检测task1和task2的cnt计数情况。就是每过1ms调用一次中断函数systick_isr(),这1ms后就实现systick_isr()中1000ms的led1和500ms的led2闪烁
2 为什么要中断
2.1 中断的意义
中断的主要意义在于提高 CPU 的效率,而不会一直占用 CPU ,实现对突发事件的实时处理,以及实现程序的并行化和嵌入式系统进程之间的切换。相较于轮询方式(即按照一定的频率和周期不断地检测某些事件的发生),中断在处理一些偶然发生的事情时效率更高。
- 在链接1中,当振动传感器感受到振动时,PA4收到低电平,用HAL_GPIO_ReadPin读PA4,如果是低电平0(GPIO_PIN_RESET),则标志位为1,此代码在中断回调函数中实现
- 在链接2中,通过中断实现红外传感器功能,即如果PB4是低电平,则为检测到有人,此代码也在中断回调函数中实现
通过链接1可能初识了中断,这两个案例中还出现了中断服务函数,其实不只这些,中断其实很丰富的,都有什么呢
2.2 中断执行流程
当中断发生时,STM32的执行流程如下:首先,由外设发出中断请求;然后,处理器暂停当前执行的任务,保护现场(如将当前位置的PC地址压栈);接着,程序跳转到对应的中断服务程序(ISR)并执行;中断服务程序执行完毕后,恢复现场(如将栈顶的值送回PC);最后,处理器返回到被中断的位置,继续执行下一个指令。
链接1电动车报警系统中,振动传感器一感受到振动PB4就输出低电平给STM32开发板,相当于PB4发出中断请求,程序跳到中断服务程序并执行,它执行完处理器返回到被中断的位置执行下一个指令
3 STM32中断
3.1 函数名词解释
|--------------------------|------------|-------------------------------------------------------------------|
| HAL_NVIC_SetPriority | 设置中断线的优先级 | HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0); // 设置EXTI15_10中断线的优先级 |
| HAL_NVIC_EnableIRQ | 使能中断 | HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); // 使能中断 |
| HAL_GPIO_EXTI_IRQHandler | 处理中断请求 | HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12); |
| HAL_GPIO_EXTI_Callback | EXTI线路检测回调 | void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) |
中断服务函数HAL_GPIO_EXTI_IRQHandler会自动调用中断回调函数HAL_GPIO_EXTI_Callback,
看链接1的一部分代码
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}
对于上面代码,结合HAL库定义,意思是先检查指定的EXTI中断线是否被声明,即是否拿到12号中断线,如果它不为0,清除12号中断线,调用关于12引脚的中断回调函数
常用的函数有这几种,不要慌,下面将会讲到它们之间的关系,和什么时候调用~
3.2 STM32****中断框图
3.2.1 NVIC
是 STM32 中的中断控制器。它负责管理和协调处理器的中断请求,是STM32 中处理异步事件的重要机制。
当一个中断请求到达时,NVIC 会确定其优先级 并决定是否应该中断当前执行的程序,以便及时响应和处理该中断请求。

NVIC配置方法
设置中断分组 → 设置中断优先级 → 使能中断
设置中断分组一般在 HAL_Init 函数中进行。

3.2.2 EXTI
EXTI 是 External Interrupt 的缩写,表示外部中断事件控制器。
EXTI 可以监测指定 GPIO 口的电平信号变化,并在检测到指定条件时,向内核的中断控制器NVIC 发出中断申请。NVIC 在裁决后,如果满足条件,会中断CPU的主程序,使 CPU 转而执行 EXTI 对应的中断服务程序。

a AFIO
AFIO 是 Alternate Function Input/Output 的缩写,表示复用功能 IO ,主要用于实现 I/O 端口的复用功能以及外部中断的控制。
STM32 上有很多 I/ O 口以及内置外设(如 I2C 、 ADC 、 ISP 、 USART 等)。为了节省引出管脚的数量,这些内置外设通常与 I/O 口共用管脚,即 I/O 管脚具有复用功能。例如,一个 GPIO 管脚除了可以作为普通的 I/O端口外,还可以被复用为某个内置外设的功能引脚。
3.3 中断配置流程



