STM32有43個channel的settable的中斷源;AIRC(Application Interrupt and Reset Register)寄存器中有用於指定優先級的4 bits。這4個bits用於分配preemption優先級和sub優先級,在STM32的固件庫中定義如下
#define NVIC_PriorityGroup_0 ((u32)0x700)
#define NVIC_PriorityGroup_1 ((u32)0x600)
#define NVIC_PriorityGroup_2 ((u32)0x500)
#define NVIC_PriorityGroup_3 ((u32)0x400)
#define NVIC_PriorityGroup_4 ((u32)0x300)
形象化的理解是:
你是上帝,
造了43個人,這麼多人要分社會階級和社會階層了;
因爲“階級”的詞性比較重;"階層"比較中性,
所以preemption優先級->階級;每個階級內部,有一些階層,sub優先級->階層;
如果按照NVIC_PriorityGroup_4這麼分,就分爲了16個階級(1個階層就是1個preemption優先級),0個階層;高階級的人,可以打斷低階級的正在做事的人(嵌套),最多可以完成1箇中斷和15級嵌套。
每個階級(每個preemption優先級),你來指定這43人中,誰進入該階級;一個人叫EXTI0_IRQChannel,你指定他進入“階級8”,則
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定搶佔式優先級別1,可取0-15
另外,在同一階級內部,一個人在做事的時候,另外一個人不能打斷他;(preemption優先級別相同的中斷源之間沒有嵌套關係)
還有,如果他們兩個同時想做事,因爲沒有階層,那麼就根據Vector table中的物理排序,讓排名靠前的人去做;
又有1個人SPI1_IRQChannel,設定如下
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定搶佔式優先級別1,可取0-15
SPI1_IRQChannel的階級高,EXTI0_IRQChannel做事的時候可以打斷(嵌套)。
如果按照NVIC_PriorityGroup_3這麼分,就分爲了8個階級(1個階級是1個preemption優先級),每個階級內有2個階層(sub優先級);高階級的人,可以打斷低階級的正在做事的人(嵌套),最多可以完成1箇中斷和7級嵌套。
每個階級(每個preemption優先級),你來指定這43人中,誰進入該階級;一個人叫EXTI0_IRQChannel,你指定他進入“階級3”,則:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定搶佔式優先級別1,可取0-7
還需要指定他的階層:
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定響應優先級別0,可取0-1
另有1個人叫EXTI9_5_IRQChannel,他的階級和階層設定如下
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定搶佔式優先級別0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定響應優先級別1
那麼這兩個人是同一階級的兄弟,一個人在做事的時候,另外一個人不能打斷他;(preemption優先級別相同的中斷源之間沒有嵌套關係)
如果他們兩個同時想做事,因爲前者的階層高,所以前者優先。
還有一個人叫USART1_IRQChannel,他的階級和階層設定如下
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定搶佔式優先級別0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定響應優先級別1
USART1_IRQChannel的優先級最高,當前面兩個人做事的時候,他都可以打斷(嵌套)。
以下的類推。
轉載於http://leoenglish.blog.163.com/blog/static/1750319852011823102636936/