目录
中断优先级:
中断优先级由两部分组成:抢占优先级(Preemption Priority)和响应优先级(Response priority)。
抢占优先级和响应优先级区别:
1.高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
2.抢占优先级相同,高响应优先级的中断不能打断低响应优先级的中断。
3.若当两个中断同时发生时,则判断中断响应优先级,高响应优先级的中断先执行,若两个中断的抢占优先级和响应优先级都相同,按照中断产生的顺序执行。
NVIC中断分组:
中断分组配置由SCB->IRCR寄存器(bit 10 ~ 8)决定的,确定IP寄存器的bit 7 ~ 4 的分配情况。
分组 | SCB->IRCR(bit 10 ~ 8)设置为 | IP寄存器的(bit 7 ~ 4)的分配情况 |
0 | 111 | 0位抢占优先级,4位响应优先级 |
1 | 110 | 1位抢占优先级,3位响应优先级 |
2 | 101 | 2位抢占优先级,2位响应优先级 |
3 | 100 | 3位抢占优先级,1位响应优先级 |
4 | 011 | 4位抢占优先级,0位响应优先级 |
若SCB->IRCR寄存器(bit 10 ~ 8)设置为:110
则IP寄存器的(bit 7 ~ 4)的分配情况:1位抢占优先级,3位响应优先级
抢占优先级分配1个位,故可设置为:0、1 (十进制:0、1 )
抢占优先级分配3个位,故可设置为:000、001、010、011......(0、1、2、3.....)
例子:
中断 | 抢占优先级 | 响应优先级 |
中断1 | 1 | 2 |
中断2 | 1 | 3 |
中断3 | 2 | 2 |
中断4 | 2 | 3 |
注意:数值越低,优先级越高(抢占优先级和响应优先级的数值越低,则优先级越高)
所以中断1、2可以打断中断3、4,因为中断1、2的抢占优先级高于中断3、4。
中断1、2同时产生,先执行中断1,因为中断1的响应优先级高于中断2。
执行顺序:中断1 > 中断2 > 中断3 > 中断4
NVIC中断优先级分组配置:
分组配置函数:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
/*NVIC_PriorityGroupConfig()函数入口参数
NVIC_PriorityGroup_0 || 设置系统中断优先级分组0
NVIC_PriorityGroup_1 || 设置系统中断优先级分组1
NVIC_PriorityGroup_2 || 设置系统中断优先级分组2
NVIC_PriorityGroup_3 || 设置系统中断优先级分组3
NVIC_PriorityGroup_4 || 设置系统中断优先级分组4
*/
中断初始化函数:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
typedef struct
{
uint8_t NVIC_IRQChannel; //设置中断通道
uint8_t NVIC_IRQChannelPreemptionPriority;//设置抢占优先级
uint8_t NVIC_IRQChannelSubPriority; //设置响应优先级
FunctionalState NVIC_IRQChannelCmd; //使能/使能
} NVIC_InitTypeDef;
//实例
usart1_NVIC(){
NVIC_InitTypeDef NVIC_InitStructure;//创建结构体
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
}
中断优先级分组注意要点:
中断优先级分组最好只设置一次,确定好分组后不要再做修改。
例如:2位抢占,2为响应
中断1设置为:11 01 和 中断2设置为: 11 10 抢占优先级相同
若改变分组:3为抢占,1为响应
中断1设置为:110 1 和 中断2设置为: 111 0 抢占优先级不同
分组改变,导致抢占优先级改变。