NVIC全稱Nested vectored interrupt controller,即嵌套向量中斷控制器,用來決定中斷的優先級。
NVIC在 ARM Conrtex-M 內核中,用一個 8 位的寄存器來配置,總共可以配置2^8=256級中斷,但是 ST 公司在生產 STM32 的時候,發現一個小小的單片機根本用不了這麼多,純屬浪費,所以將該寄存器的低 4 位全部置0,只使用高 4 位來配置,這樣一來 STM32 就只有2^4=16級中斷啦。
簡化爲16級中斷後,ST發現 STM32 內部這麼豐富的外設,還是不方便配置,乾脆人工給這4位來個分組,劃分出了5個分組:
優先級分組 | 搶佔優先級佔的位數 | 子優先級佔的位數 |
NVIC_PriorityGroup_0 | 0 bit | 4 bit |
NVIC_PriorityGroup_1 | 1 bit | 3 bit |
NVIC_PriorityGroup_2 | 2 bit | 2 bit |
NVIC_PriorityGroup_3 | 3 bit | 1 bit |
NVIC_PriorityGroup_4 | 4 bit | 0 bit |
再次強調一下,這5種中斷分組規則是人爲的,用哪種規則,之後設置具體的優先級時對應就行,STM32默認使用的規則是 NVIC_PriorityGroup_0 。
STM32 的CPU判斷優先級的方法如下:
先判斷搶佔優先級,數字越小,優先級越高;
若搶佔優先級相同,判斷子優先級,同樣,數字越小,優先級越高;