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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32 設(shè)置systick中斷搶先式優(yōu)先級(jí)

          stm32 設(shè)置systick中斷搶先式優(yōu)先級(jí)

          作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
          最近使用STM32時(shí)希望將systick的中斷優(yōu)先級(jí)降低,但是CMSIS里給出的例子都是類似

          本文引用地址:http://www.ex-cimer.com/article/201611/322685.htm
          [plain]view plaincopy
          1. NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_IRQn;
          2. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
          3. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
          4. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
          5. NVIC_Init(&NVIC_InitStructure);
          還是沒(méi)有配置systick。

          后來(lái)閱讀CM3的技術(shù)參考手冊(cè),講解了NVIC的配置。

          中斷分為內(nèi)核中斷和芯片的中斷,配置的寄存器位置不同。芯片的中斷配置在NVIC的IP內(nèi),內(nèi)核的中斷配置在SCB內(nèi)。

          可以直接調(diào)用core_cm3.h里的函數(shù)

          [cpp]view plaincopy
          1. static__INLINEvoidNVIC_SetPriority(IRQn_TypeIRQn,uint32_tpriority)
          2. {
          3. if(IRQn<0){
          4. SCB->SHP[((uint32_t)(IRQn)&0xF)-4]=((priority<<(8-__NVIC_PRIO_BITS))&0xff);}
          5. else{
          6. NVIC->IP[(uint32_t)(IRQn)]=((priority<<(8-__NVIC_PRIO_BITS))&0xff);}
          7. }
          這個(gè)函數(shù)實(shí)現(xiàn)了兩類中斷優(yōu)先級(jí)的配置。

          但是直觀上來(lái)看看不到搶先式優(yōu)先級(jí)與子優(yōu)先級(jí)。

          首先,配置優(yōu)先級(jí)組,可以使用固件庫(kù)的程序,也可以用core_cm3.h的函數(shù)。

          [cpp]view plaincopy
          1. voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup)
          2. {
          3. SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;
          4. }

          [cpp]view plaincopy
          1. static__INLINEvoidNVIC_SetPriorityGrouping(uint32_tPriorityGroup)
          2. {
          3. uint32_treg_value;
          4. uint32_tPriorityGroupTmp=(PriorityGroup&0x07);
          5. reg_value=SCB->AIRCR;
          6. reg_value&=~(SCB_AIRCR_VECTKEY_Msk|SCB_AIRCR_PRIGROUP_Msk);
          7. reg_value=(reg_value|
          8. (0x5FA<<SCB_AIRCR_VECTKEY_Pos)|
          9. (PriorityGroupTmp<<8));
          10. SCB->AIRCR=reg_value;
          11. }
          參數(shù)范圍為0~7,具體如下

          隨后配置各個(gè)中斷的優(yōu)先級(jí),對(duì)于外設(shè)的中斷可以使用固件庫(kù)的程序,比較直觀。如最前面所給出的例子,但是根據(jù)其實(shí)現(xiàn),是不能夠用來(lái)配置內(nèi)核中斷的,例如

          [cpp]view plaincopy
          1. NVIC_InitStructure.NVIC_IRQChannel=SysTick_IRQn;
          2. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
          3. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
          4. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
          5. NVIC_Init(&NVIC_InitStructure);
          這是錯(cuò)誤的,因?yàn)閮?nèi)部使用IRQn尋址,而SysTick_IRQn為-1.

          所以對(duì)于Sysick使用core_cm3.h的函數(shù)

          [cpp]view plaincopy
          1. NVIC_SetPriority(SysTick_IRQn,4);
          這時(shí)不能顯式的看出搶先式優(yōu)先級(jí)與子優(yōu)先級(jí),寫入的優(yōu)先級(jí)需要根據(jù)優(yōu)先級(jí)組的配置來(lái)選擇。

          [cpp]view plaincopy
          1. NVIC_SetPriority(SysTick_IRQn,n);
          2. n=0x00~0x03設(shè)置Systick為搶占優(yōu)先級(jí)0
          3. n=0x04~0x07設(shè)置Systick為搶占優(yōu)先級(jí)1
          4. n=0x08~0x0B設(shè)置Systick為搶占優(yōu)先級(jí)2
          5. n=0x0C~0x0F設(shè)置Systick為搶占優(yōu)先級(jí)3

          NVIC_SetPriority函數(shù)指定中斷優(yōu)先級(jí)的寄存器位(STM32只用4位來(lái)表示優(yōu)先級(jí))的數(shù)據(jù),例如中斷優(yōu)先級(jí)組設(shè)置為了2,即高2位用于指定搶占式優(yōu)先級(jí),低2位用于指定響應(yīng)優(yōu)先級(jí),0x00~0x03高2位為0,所以搶占優(yōu)先級(jí)為0;0x04~0x07高2位為1,所以搶占優(yōu)先級(jí)為1,以此類推。



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁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); })();