<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32中NVIC的個人理解

          STM32中NVIC的個人理解

          作者: 時間:2016-11-09 來源:網(wǎng)絡 收藏
          STM32有43個channel的settable的中斷源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定優(yōu)先
          級的4 bits。這4個bits用于分配preemption優(yōu)先級和sub優(yōu)先級,在STM32的固件庫中定義如下
          /* Preemption Priority Group -------------------------------------------------*/
          #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
          4 bits for subpriority */
          #define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption priority
          3 bits for subpriority */
          #define NVIC_PriorityGroup_2 ((u32)0x500) /* 2 bits for pre-emption priority
          2 bits for subpriority */
          #define NVIC_PriorityGroup_3 ((u32)0x400) /* 3 bits for pre-emption priority
          1 bits for subpriority */
          #define NVIC_PriorityGroup_4 ((u32)0x300) /* 4 bits for pre-emption priority
          0 bits for subpriority */
          形象化的理解是:
          你是上帝,
          造了43個人,這么多人要分社會階級和社會階層了;
          因為“階級”的詞性比較重;"階層"比較中性,
          所以preemption優(yōu)先級->階級;每個階級內(nèi)部,有一些階層,sub優(yōu)先級->階層;
          如果按照NVIC_PriorityGroup_4這么分,就分為了16個階級(1個階層就是1個preemption優(yōu)先級),0個階層;高階級的
          人,可以打斷低階級的正在做事的人(嵌套),最多可以完成1個中斷和15級嵌套。
          每個階級(每個preemption優(yōu)先級),你來指定這43人中,誰進入該階級;一個人叫EXTI0_IRQChannel,你指定他進入“
          階級8”,則
          NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定搶占式優(yōu)先級別1,可取0-15
          另外,在同一階級內(nèi)部,一個人在做事的時候,另外一個人不能打斷他;(preemption優(yōu)先級別相同的中斷源之間沒有嵌
          套關系)
          還有,如果他們兩個同時想做事,因為沒有階層,那么就根據(jù)Vector table中的物理排序,讓排名靠前的人去做;
          又有1個人SPI1_IRQChannel,設定如下
          NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定搶占式優(yōu)先級別1,可取0-15
          SPI1_IRQChannel的階級高,EXTI0_IRQChannel做事的時候可以打斷(嵌套)。
          如果按照NVIC_PriorityGroup_3這么分,就分為了8個階級(1個階級是1個preemption優(yōu)先級),每個階級內(nèi)有2個階層(
          sub優(yōu)先級);高階級的人,可以打斷低階級的正在做事的人(嵌套),最多可以完成1個中斷和7級嵌套。
          每個階級(每個preemption優(yōu)先級),你來指定這43人中,誰進入該階級;一個人叫EXTI0_IRQChannel,你指定他進入“
          階級3”,則:
          NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定搶占式優(yōu)先級別1,可取0-7
          還需要指定他的階層:
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定響應優(yōu)先級別0,可取0-1
          另有1個人叫EXTI9_5_IRQChannel,他的階級和階層設定如下
          NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定搶占式優(yōu)先級別0,可取0-7
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定響應優(yōu)先級別1
          那么這兩個人是同一階級的兄弟,一個人在做事的時候,另外一個人不能打斷他;(preemption優(yōu)先級別相同的中斷源之
          間沒有嵌套關系)
          如果他們兩個同時想做事,因為前者的階層高,所以前者優(yōu)先。
          還有一個人叫USART1_IRQChannel,他的階級和階層設定如下
          NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定搶占式優(yōu)先級別0,可取0-7
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定響應優(yōu)先級別1
          USART1_IRQChannel的優(yōu)先級最高,當前面兩個人做事的時候,他都可以打斷(嵌套)。
          以下的類推。
          如果按照NVIC_PriorityGroup_0這么分,那么沒有階級,只有16個階層了。
          需要給各個人指定階層編號。sub優(yōu)先級的范圍0-15
          當一個人做事的時候,另外的人不能打斷他(就沒有嵌套了);當多人同時想做事的時候,按照階層編號的排序,排名靠前的先做事。
          階層編號一樣的人同時想做事,那么按照Vector Table硬件排序,排名靠前的先做。


          關鍵詞: STM32NVI

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();