定义
让CPU打断正常运行的程序,转而去处理紧急的程序,就叫中断。
中断执行机制
- 中断请求:外设产生中断请求(GPIO外部中断,定时器中断);
- 响应中断:CPU停止执行当前程序,转而去执行中断处理程序(ISR);
- 退出中断:执行完毕,返回被打断的程序处,继续往下执行。
中断优先级
中断优先级,值越低,优先级越高。
ARM Cortex-M使用了8位宽的寄存器,来配置中断的优先等级(0~255)。
STM32只用了中断优先级配置寄存器的高4位,所以STM32提供了最大16级的中断优先级。
STM32优先级分为抢占优先级和子优先级。
抢占优先级:抢占优先级高的中断可以打断正在执行但抢占优先级低的中断。
子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行。
分组设置
一共有5种分配方式,对应着中断优先级分组的5个组
优先级分组 | 抢占优先级 | 子优先级 | 优先级配置寄存器高4位 |
---|---|---|---|
NVIC_PriorityGroup_0 | 0级抢占优先级 | 0-15级子优先级 | 0bit用于抢占优先级,4bit用于子优先级 |
NVIC_PriorityGroup_1 | 0-1级抢占优先级 | 0-7级子优先级 | 1bit用于抢占优先级,3bit用于子优先级 |
NVIC_PriorityGroup_2 | 0-3级抢占优先级 | 0-3级子优先级 | 2bit用于抢占优先级,2bit用于子优先级 |
NVIC_PriorityGroup_3 | 0-7级抢占优先级 | 0-1级子优先级 | 3bit用于抢占优先级,1bit用于子优先级 |
NVIC_PriorityGroup_4 | 0-15级抢占优先级 | 0级子优先级 | 4bit用于抢占优先级,0bit用于子优先级 |
通过调用函数来设置组4
HAL_NVIC_SetPriorityGrouping(NVIC_PriorityGroup_4);
特点
- 低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS的API函数。
- 建议将所有优先级位指定为抢占优先级,方便FreeRTOS管理。
- 中断优先级数值越小越优先(0-15),任务优先级数值越大越优先(0-31)。
中断相关寄存器
三个系统中断优先级配置寄存器,SHPR1,SHPR2,SHPR3:
SHPR1寄存器地址:0xE000ED18
SHPR2寄存器地址:0xE000ED1C
SHPR3寄存器地址:0xE000ED20
三个中断屏蔽寄存器,PRIMASK、FAULTMAKS、BASEPRI
PRIMASK:这是个只有1个位的寄存器,当它置1时,就关掉所有可屏蔽的异常,只剩下NMI和硬fault可以响应,它的缺省值是0,表示没有关中断。
FAULTMAKS:这是个只有1个位的寄存器,当它置1时,只有NM才能响应,所有其他的异常,包括中断和fault,通通闭嘴,缺省值是0,表示没有关异常。
BASEPRI:这个寄存器最多有9位(由表达优先级的位数决定),它定义了被屏蔽优先级的阈值,当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低),但若被设成0,则不关闭中断,0是缺省值。
FreeRTOS所使用的中断管理就是利用BASEPRI寄存器。
BASEPRI屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断。