STM32的優先級NVIC_PriorityGroupConfig的理解及其使用

        STM32目前支持的中斷共爲84個(16個內核+68個外部),16級可編程中斷優先級的設置(僅使用中斷優先級設置8bit中的高4位)和16個搶佔優先級(因爲搶佔優先級最多可以有四位數)。AIRC(Application Interrupt and Reset Register)寄存器中有用於指定優先級的4bits。這4個bits用於分配preemption優先級和sub優先級,在STM32的固件庫中定義如下

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority  4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority  3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority  2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority  1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority  0 bits for subpriority */

  

        搶斷優先級,顧名思義,能在別人中斷實現中斷,是搶佔別人中斷,實現中斷嵌套。響應優先級則只能排隊,不能搶在前面插別人的對,即不能嵌套。


        NVIC_PriorityGroup_0 => 選擇第0組:所有4位用於指定響應優先級
        NVIC_PriorityGroup_1 => 選擇第1組:最高1位用於指定搶佔式優先級,最低3位用於指定響應優先級
        NVIC_PriorityGroup_2 => 選擇第2組:最高2位用於指定搶佔式優先級,最低2位用於指定響應優先級
        NVIC_PriorityGroup_3 => 選擇第3組:最高3位用於指定搶佔式優先級,最低1位用於指定響應優先級
        NVIC_PriorityGroup_4 => 選擇第4組:所有4位用於指定搶佔式優先級


        形象化的理解是:

        你是上帝,
        造了43個人,這麼多人要分社會階級和社會階層了;
        因爲“階級”的詞性比較重;"階層"比較中性,
        所以preemption優先級->階級;每個階級內部,有一些階層,sub優先級->階層;

        如果按照NVIC_PriorityGroup_4這麼分,就分爲了16個階級(1個階層就是1個preemption優先級),0個階層;高階級的人,可以打斷低階級的正在做事的人(嵌套),最多可以完成1箇中斷和15級嵌套。
        一個人叫EXTI0_IRQChannel,你指定他進入“階級8”,則
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定搶佔式優先級別8,可取0-15
        另外,在同一階級內部,一個人在做事的時候,另外一個人不能打斷他;(preemption優先級別相同的中斷源之間沒有嵌套關係)
        還有,如果他們兩個同時想做事,因爲沒有階層,那麼就根據Vector table中的物理排序,讓排名靠前的人去做;

        又有1個人SPI1_IRQChannel,設定如下
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定搶佔式優先級別0,可取0-15
        SPI1_IRQChannel的階級高,EXTI0_IRQChannel做事的時候可以打斷(嵌套)。

        如果按照NVIC_PriorityGroup_3這麼分,就分爲了8個階級(1個階級是1個preemption優先級),每個階級內有2個階層(sub優先級);高階級的人,可以打斷低階級的正在做事的人(嵌套),最多可以完成1箇中斷和7級嵌套(同階級內做事不能打斷)。

        一個人叫EXTI0_IRQChannel,你指定他進入階級3,階級0,則:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定搶佔式優先級別3,可取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優先級別相同的中斷源之間沒有嵌套關係)
如果他們兩個同時想做事,因爲EXTI0_IRQChannel的階層高,所以EXTI0_IRQChannel優先。

        還有一個人叫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://blog.chinaunix.net/uid-22670933-id-3443085.html
        權侵刪    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章