NVIC是STM32内核的一个外设,用来管理整个芯片的中断。NVIC可以设置中断的优先级,也可以使能或者禁止某个外设中断。其实相当于每个外设中断的总开关。
NVIC工作主要分为几个步骤:1.设置NVIC中断优先级分组 2.设置抢占优先级和子优先级 3.使能中断的总开关
一.设置中断优先级分组
库函数使用void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)设置中断优先级分组,总共有5个组,主要是对寄存器SCB_AIRCR中的PRIGROUP[2:0]进行配置
NVIC_PriorityGroup
|
PRIGROUP[2:0]
|
抢占优先级
|
子优先级
|
NVIC_PriorityGroup_0
|
0b111
|
0位
|
4位
|
NVIC_PriorityGroup_1
|
0b110
|
1位
|
3位
|
NVIC_PriorityGroup_2
|
0b101
|
2位
|
2位
|
NVIC_PriorityGroup_3
|
0b100
|
3位
|
1位
|
NVIC_PriorityGroup_4
|
0b011
|
4位
|
0位
|
二.设置中断源 抢占优先级和子优先级 使能中断
/* 配置中断源:按键1 */
NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
/* 配置抢占优先级 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 配置子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中断通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
优先级设置:配置NVIC_IPRx寄存器,x从0-20。每一个NVIC_IPRx寄存器里面都有4个IP[]数组,每个IP[]数组只有4位用来配置抢占和子优先级(对应上面那个表格)
中断的使能:配置NVIC_ISERx寄存器,x从0-2。每一个中断使能寄存器控制32个外设的中断使能,位对应关系与中断向量表一致,比如WWDG_IRQn是0,NVIC_ISER0的第0位就控制看门狗的中断使能
中断的禁能:配置NVIC_ICERx寄存器,x从0-2。每一个中断禁能寄存器控制32个外设的中断使能,位对应关系与中断向量表一致,比如WWDG_IRQn是0,NVIC_ICER0的第0位就控制看门狗的中断禁能