中断:
让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫做中断。
中断执行机制,分为三步:
- 中断请求:外设产生中断请求(GPIO外部中断、定时器中断等);
- 响应中断:CPU停止执行当前程序,转而去执行中断处理程序(ISR);
- 退出中断:执行完毕,返回被打断的程序处,继续往下执行。
中断优先级分组设置:
中断的优先级使用中断优先级配置寄存器控制,这个寄存器位宽为8位。但是STM32只使用了寄存器的高4位,所以可以提供的最大优先级为16位中断优先级。
STM32的中断优先级可以分为抢占优先级和子优先级。
- 抢占优先级:抢占优先级高的中断可以打断正在执行但是抢占优先级低的中断;
- 子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行。
- 中断优先级的数值越小,优先级越高。
中断优先级的分组:
中断优先级可以分为5组:
FreeRTOS采用分组4的方式,其设置方式为:在HAL_Init
中通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)
来设置。
中断相关的寄存器:
三个系统中断优先级配置寄存器:
- SHPR1,地址为:0xE000ED18
- SHPR2,地址为:0xE000ED1C
- SHPR3,地址为:0xE000ED20
三个中断屏蔽寄存器
- PRIMASK
- FAULTMASK
- BASEPRI
当BASEPRI设置为0x50时:
在中断服务函数中调用FreeRTOS的API函数时需要注意:
- 中断服务函数的优先级须在FreeRTOS所管理的范围内;
- 在中断服务函数中调用FreeRTOS的API函数时,必须使用带有
FromISR
后缀的函数。