前言
本文详细介绍了STM32中的中断机制,包括中断的概念、中断优先级、NVIC的作用、EXTI的外部中断功能、AFIO的复用功能IO以及中断实验示例。重点阐述了中断服务流程、中断优先级管理和EXTI的配置方法。`
一、中断相关概念(了解)
1、什么是中断
中断是单片机正在执行程序时,由于内部或外部事件的触发,打断当前程序,转而去处理这一事件,当处理完成后再回到原来被打断的地方继续执行原程序的过程。
在ARM体系结构中,中断通常由外设或外部输入产生,有时也可以由软件触发。中断是单片机系统处理紧急或突发事件的重要方式,如定时器溢出、按键输入、串口数据到达等。
2、中断的意义
中断的主要意义在于提高CPU的效率,而不会一直占用CPU,实现对突发事件的实时处理,以及实现程序的并行化和嵌入式系统进程之间的切换。相较于轮询方式(即按照一定的频率和周期不断地检测某些事件的发生),中断在处理一些偶然发生的事情时效率更高。
3、中断优先级
中断具有优先级高低之分,两个中断同时触发,则优先响应高优先级中断,再响应低优先级中断。
4、中断嵌套
如果一个高优先级的中断发生,它会立即打断当前正在处理的中断(如果其优先级较低),并首先处理这个 高优先级的中断,这就是所谓的中断嵌套。
5、中断执行流程
当中断发生时,STM32的执行流程如下:首先,由外设发出中断请求;然后,处理器暂停当前执行的任务,保护现场(如将当前位置的PC地址压栈);接着,程序跳转到对应的中断服务程序(ISR)并执行;中断服务程序执行完毕后,恢复现场(如将栈顶的值送回PC);最后,处理器返回到被中断的位置,继续执行下一个指令。
6、STM32中断
(1)中断数量(以SMT32F103C8T6为例)
SMT32F103C8T6支持的中断共有70个,其中包括10个内核中断和60个外部中断。其中外部中断包含EXTI、TIM、ADC、I2C、SPI等等。
(2)中断向量表
STM32的中断向量表是一个存储中断处理函数地址的数组,位于Flash区的起始位置。每个数组元素对应一个中断源,其地址指向相应的中断服务程序。当中断发生时,处理器会根据中断号查找向量表,然后跳转到对应的中断服务程序执行。
中断向量表的主要作用是解决中断函数地址不固定与中断必须跳转到固定地方执行程序之间的矛盾。由于编译器每次编译都会为中断函数随机分配地址,但硬件要求中断必须跳转到固定的位置,因此,中断向量表就作为这样一个固定的地址列表,其中包含了中断函数的地址以及跳转到这些地址的程序。当中断发生时,处理器会跳转到这个固定的中断向量表,然后根据其中的信息跳转到相应的中断处理函数从而执行中断。
(3)STM32中断框图
二、NVIC(熟悉)
1、NVIC基本概念
2、NVIC相关寄存器介绍
NVIC相关函数介绍:
在contex.c中可以查看到以下函数:
其中,只有DisableIRQ(中断失能函数)、EnableIRQ(中断使能函数)、GetPriority(中断优先级函数)、GetPriorityGrouping(中断优先级分组函数)经常使用。
3、NVIC工作原理
4、STM32中断优先级基本概念
NVIC可以管理多个中断请求,并按优先级处理它们。在STM32中,中断优先级被划分为抢占式优先级和响应 优先级,可以根据具体的应用需求进行配置。不同的优先级分组方式会影响中断的响应和处理顺序。
(1)抢占优先级
如果一个中断的抢占优先级高于当前正在执行的中断,那么它可以打断当前中断,优先得到执行。数值越小,优先级越高。
(2)响应优先级
如果两个中断同时到达,且它们的抢占优先级相同,那么响应优先级高的中断将首先得到响应。数值越小,优先级越高。
(3)自然优先级
自然优先级是由硬件固定并预先设定的,用户无法更改。当抢占优先级和响应优先级都相同时,自然优先级将决定哪个中断先得到处理。
(4)优先级执行顺序
当多个中断同时发生时,执行顺序首先由抢占优先级决定。如果抢占优先级相同,则进一步由响应优先级决。如果响应优先级也相同,则最终由自然优先级决定。
在中断嵌套的情况下,高抢占优先级的中断可以打断低抢占优先级的中断,但高响应优先级的中断不能打断低响应优先级的中断(当它们具有相同的抢占优先时)。
5、STM32中断优先级分组
6、STM32 NVIC的使用
三、EXTI(熟悉)
1、EXTI基本概念:管理控制器(芯片内外部)的中断/事件线,实现外部中断和事件的检测与处理
EXTI 是 External Interrupt 的缩写,表示外部中断事件控制器。EXTI 可以监测指定 GPIO 口的电平信号变化,并在检测到指定条件时,向内核的中断控制器 NVIC 发出中断申请。NVIC 在裁决后,如果满足条件,会中断CPU的主程序,使 CPU 转而执行EXTI 对应的中断服务程序。
EXTI 支持的触发方式:上升沿、下降沿、双边沿或软件触发。
EXTI 支持所有的 GPIO 口,但需要注意的是,相同的 Pin 不能同时触发中断。例如,PA0 和 PB0 不能同时被配置为中断源。
EXTI 提供了 16 个 GPIO_Pin 的中断线,以及额外的中断线如 PVD 输出、RTC 闹钟、USB唤醒和以太网唤醒。
通过适当的配置,EXTI可以实现丰富多样的功能,如响应按键的按下、传感器的状态变化等外部事件。
2、中断/事件
(1)中断会打断CPU当前正在执行的程序,转而去执行中断服务程序,待中断服务程序执行完毕后,CPU会返回到原来的程序执行点继续执行。
(2) 事件只是简单地表示某个动作或状态的变化,而不会打断CPU当前正在执行的程序。当事件发生时,它会根据配置来决定是否触发相应的中断。如果开放了对应的中断屏蔽位,事件就可以触发相应的中断,否则事件只会作为一个信号存在,不会被CPU处理。
3、EXTI基本结构
4、EXTI基本框图
5、EXTI寄存器(结合EXTI基本框图进行理解)
(1)中断屏蔽寄存器(EXTI_IMR)
(2)事件屏蔽寄存器(EXTI_EMR)
(3)上升沿触发选择寄存器(EXTI_RTSR)
(4)下降沿触发选择寄存器(EXTI_FTSR)
(5)软件中断事件寄存器(EXTI_SWIER)
(6)挂起寄存器(EXTI_PR)
6、EXTI相关函数
这两个函数在gpio.c文件中,Callback函数是回调函数,IRQHandler函数是中断处理函数。
四、EXTI和IO映射关系(熟悉)
1、AFIO简介(复用功能IO)
AFIO 是 Alternate Function Input/Output 的缩写,表示复用功能 IO,主要用于实现 I/O 端口的复用功能以及外部中断的控制。
STM32上有很多 I/ O口以及内置外设(如I2C、ADC、ISP、USART等)。为了节省引出管脚的数量,这些内置外设通常与 I/O 口共用管脚,即 I/O 管脚具有复用功能。例如,一个 GPIO 管脚除了可以作为普通的 I/O端口外,还可以被复用为某个内置外设的功能引脚。
然而,为了优化64脚或100脚封装的外设数量,有时需要将一些复用功能重新映射到其他引脚上。这时,就可以使用AFIO的复用重映射功能。通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR),可以实现引脚的重新映射,使得复用功能不再映射到它们的原始分配上。此外,AFIO 还用于控制外部中断,用来配置 EXTI 中断线 0~15 对应哪个具体 IO 口。
当需要使能外部中断线或进行外部中断线的映射时,通常需要开启AFIO的时钟。
2、AFIO与IO对应关系
3、AFIO寄存器
外部中断配置寄存器(AFIO_EXTICR)
五、如何使用中断(掌握)
1、GPIO外部中断和外设中断配置步骤
2、STM32 EXTI配置步骤(GPIO外部中断)
3、STM32 EXTI的HAL库设置步骤(GPIO外部中断)
六、通用外设模型驱动(四步法)(掌握)
七、HAL库中断回调处理机制介绍(掌握)