NVIC(Nested Vectored Interrupt Controller) ,即内嵌向量中断控制器,NVIC位于内核中,响应速度更快,同时标准化,各厂家Cortex内核芯片NVIC都一致。
M4/M7 内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置,实际中各厂家会进行裁剪,支持的中断会少些。如STM32F40x/41x总共有92个中断,10个内核中断,82个可屏蔽中断;STM32F42x/STM32F43x则总共有97个中断,10个内核中断,87个可屏蔽中断;STM32F76x总共118个中断,10个内核中断,108个可屏蔽中断。
如何管理这么多的中断?
STM32对每个中断都设置了两个优先级:抢占式优先级(主优先级)和响应优先级(从优先级)。中断处理优先级原则:先看谁的主优先级高,高的先处理,如果一样高先到先处理,同时到才看从优先级,如果主、从优先级都一样且同时到,则按它们在中断表中的排序先后来决定处理顺序。[注:高抢占优先级的中断可以打断正在进行的低抢占优先级的中断]
stm32对中断进行分组(0~4组),分组是在寄存器SCB->AIRCR中配置,所谓分组就是分主、从优先级各占几位,比如分组为2,则有2位抢占优先级(值取0~4,值越小优先级越高)和2位响应优先级(值取0~4,值越小优先级越高)。
组 |
AIRCR[10:8] |
IP bit[7:4]分配情况 |
分配结果 |
0 |
111 |
0:4 |
0位抢占优先级,4位响应优先级 |
1 |
110 |
1:3 |
1位抢占优先级,3位响应优先级 |
2 |
101 |
2:2 |
2位抢占优先级,2位响应优先级 |
3 |
100 |
3:1 |
3位抢占优先级,1位响应优先级 |
4 |
011 |
4:0 |
4位抢占优先级,0位响应优先级 |
中断优先级设置步骤(HAL库)
1. 设置整个系统的中断优先级分组:
void HAL_NVIC_SetPriorityGrouping (NVIC_PriorityGroup_2); // 中断优先级分组为2,也就是2位抢占优先级,2位响应优先级 [注:此函数在Hal_Init()里面调用配置]
2. 针对具体每个中断,设置各自的抢占优先级和子优先级:
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); //IRQn为具体中断名,如 USART1_IRQn、EXTI9_5_IRQn等,PreemptPriority和SubPriority为优先级具体数值,分组为2时,取值0~4
3. 使能中断:
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);