前言
NVIC
提示:以下是本篇文章正文内容,下面案例可供参考
一、中断优先级分组配置
1、分组配置函数(在HAL_Init函数中出现):
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
//配置函数
参数选项
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \
((GROUP) == NVIC_PRIORITYGROUP_1) || \
((GROUP) == NVIC_PRIORITYGROUP_2) || \
((GROUP) == NVIC_PRIORITYGROUP_3) || \
((GROUP) == NVIC_PRIORITYGROUP_4))
//分组
组号 | 抢占优先级:响应优先级 | 解释 |
---|---|---|
0 | 0:4 | 0位抢占优先级,4位响应优先级 |
1 | 1:3 | 1位抢占优先级,3位响应优先级 |
2 | 2:2 | 2位抢占优先级,2位响应优先级 |
3 | 3:1 | 3位抢占优先级,1位响应优先级 |
4 | 4:0 | 4位抢占优先级,0位响应优先级 |
2、配置具体外设的优先级(在MSP_init中出现):
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
//配置函数
HAL_NVIC_EnableIRQ(USART1_IRQn);
//使能中断通道USART1_IRQn
HAL_NVIC_SetPriority(USART1_IRQn,3,3);
//配置USART1_IRQn中断
//抢先优先级3
//响应优先级3
3、打开中断
注意使能中断和打开中断的区别:
每一次接收完中断后都要打开一次中断
注意
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
假定设置中断优先级组为2,然后设置
中断3(RTC中断)的抢占优先级为2,响应优先级为1。
中断6(外部中断0)的抢占优先级为3,响应优先级为0
中断7(外部中断1)的抢占优先级为2,响应优先级为0。
那么这3个中断的优先级顺序为:中断7>中断3>中断6