关于STM32中NVIC中断分组的介绍
NVIC简介
NVIC的全称是Nested vectored interrupt controller,即嵌套向量中断控制器。对于这个NVIC,有几个重要的知识点就是优先级分组、抢占优先级和子优先级。STM32F1xx,F4xx和H7都是只使用了这个8位寄存器的高四位[7:4],所以对应优先级范围是0~15,主要数值越小优先级越大,即优先级0最大,优先级15最小,这一点与FreeRTOS中任务优先级大小相反。
NVIC特点
对于抢占优先级和子优先级,有几点需要注意:
- 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。
- 在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。
- 在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。
总结下来就是抢占优先级支持中断嵌套,若抢占优先级相同则比较子优先级,子优先级高的先执行,但子优先级不支持中断嵌套。(中断嵌套就是指高优先级抢断低优先级执行)
常用的NVIC API
- HAL_NVIC_SetPriority
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
/*
函数功能:此函数主要用于设置中断的抢占优先级和子优先级
函数参数:IRQn为中断号,PreemptPriority用于设置抢占优先级,SubPriority用于设置子优先级
举例:HAL_NVIC_SetPriority(ADC_IRQn, 1, 0),设置ADC中断的抢占优先级是1,子优先级是0
*/
- HAL_NVIC_EnableIRQ
/*
函数功能:主要用于使能中断
函数参数:RQn是中断号
举例:HAL_NVIC_EnableIRQ (ADC_IRQn),使能ADC中断
*/
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)