代码改变世界

【STM32】中断 - 指南

2025-12-02 14:30  tlnshuju  阅读(0)  评论(0)    收藏  举报

做了两个小任务后重新回顾中断,以下使两个项目的链接,中断回调函数经常被使用,要深刻理解它的意义.另外如果有时间,会在写一篇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_CallbackEXTI线路检测回调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的缩写,表示外部中断事件控制器。
满足条件,会中断CPU的主程序,使 CPU 转而执行 EXTI 对应的就是EXTI 行监测指定 GPIO 口的电平信号变化,并在检测到指定条件时,向内核的中断控制器NVIC 发出中断申请。NVIC 在裁决后,若中断服务程序
a AFIO
AFIO Alternate Function Input/Output的缩写,表示复用作用 IO,主要用于实现 I/O 端口的复用能力以及外部中断的控制。
STM32上有很多 I/ O口以及内置外设(如I2CADCISPUSART等)。为了节省引出管脚的数量,这些内置外设通常与 I/O口共用管脚,即 I/O 管脚具有复用功能。例如,一个 GPIO 管脚除了可以作为普通的I/O端口外,还可以被复用为某个内置外设的功能引脚。

3.3 中断配置流程