NVIC 是 ARM Cortex-M 處理器的一部分。負責處理例外和中斷相關程序。spa
優先權code
在Cortex-M來說,數值越小表明優先權越高。blog
規則就是一個exception handler正在執行,其餘例外發生時,若是group priority優先權比你高就能夠插隊執行,若是跟你一樣或者比你低,就得乖乖等。ci
若是有多個相同優先權的例外處理正在 等待執行(Pending) ,那麼先比較subpriority,優先權較高的排在前面,若是還是一樣 Exception Nmber小的優先。it
NVIC_PriorityGroup
|
Preemption Priority
|
Subpriority
|
NVIC_PriorityGroup_0
|
0 (1 種設定)
|
0~15(16 種設定)
|
NVIC_PriorityGroup_1
|
0,1(2 種設定)
|
0~7(8 種設定)
|
NVIC_PriorityGroup_2
|
0,1,2,3 (4 種設定)
|
0,1,2,3(4 種設定)
|
NVIC_PriorityGroup_3
|
0,1,2,3,4,5,6,7 (8 種設定)
|
0,1(2 種設定)
|
NVIC_PriorityGroup_4
|
0~15(16 種設定)
|
0(1 種設定)
|
當我們在使用STM32的NVIC中斷時會發現,中斷的優先等級分紅了preemption priority 與subpriority 兩種而這兩優先等級有甚麼不一樣:io
在兩個interrupt channel的preemption priority相同的前提下,若是兩個subpriority不一樣的interrupt event同時發生,則subpriority高的interrupt會先被處理,可是若是低優先等級的interrupt channel event 已經在執行,則不能被打斷,高subpriority的event必須等到現有的event被處理完才能被處理。event
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x04; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x03; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct);
以上範例若是先執行 EXTI0 在觸發 EXTI15_10,會優先執行 EXTI15_10table
但若是 EXTI0 優先權比 EXTI15_10 高可是也觸發了,會等EXTI0執行完畢再執行EXTI15_10。class