NVIC的全稱是Nested vectoredinterrupt controller,即嵌套向量中斷控制器。
對於M3和M4內核的MCU,每個中斷的優先級都是用寄存器中的8位來設置的。8位的話就可以設置2^8 =256級中斷,實際中用不了這么多,所以芯片廠商根據自己生產的芯片做出了調整。比如ST的STM32F1xx和F4xx只使用了這個8位中的高四位[7:4],低四位取零,這樣2^4=16,只能表示16級中斷嵌套。
對於這個NVIC,有個重要的知識點就是優先級分組,搶占優先級和子優先級,下面就以STM32為例進行介紹,STM32F1xx和F4xx都是只使用了這個8位寄存器的高四位[7:4]。
具有高搶占式優先級的中斷可以在具有低搶占式優先級的中斷服務程序執行過程中被響應,即中斷嵌套,或者說高搶占式優先級的中斷可以搶占低搶占式優先級的中斷的執行。在搶占式優先級相同的情況下,有幾個子優先級不同的中斷同時到來,那么高子優先級的中斷優先被響應。
在搶占式優先級相同的情況下,如果有低子優先級中斷正在執行,高子優先級的中斷要等待已被響應的低子優先級中斷執行結束后才能得到響應,即子優先級不支持中斷嵌套。Reset、NMI、Hard Fault 優先級為負數,高於普通中斷優先級,且優先級不可配置。
對於初學者還有一個比較糾結的問題就是系統中斷(比如:PendSV,SVC,SysTick)是不是一定比外部中斷(比如SPI,USART)要高,答案:不是的,它們是在同一個NVIC下面設置的。