新聞中心

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

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

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

本文引用地址:http://m.butianyuan.cn/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);
還是沒有配置systick。

后來閱讀CM3的技術(shù)參考手冊,講解了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. }
這個函數(shù)實(shí)現(xiàn)了兩類中斷優(yōu)先級的配置。

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

首先,配置優(yōu)先級組,可以使用固件庫的程序,也可以用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,具體如下

隨后配置各個中斷的優(yōu)先級,對于外設(shè)的中斷可以使用固件庫的程序,比較直觀。如最前面所給出的例子,但是根據(jù)其實(shí)現(xiàn),是不能夠用來配置內(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);
這是錯誤的,因?yàn)閮?nèi)部使用IRQn尋址,而SysTick_IRQn為-1.

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

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

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

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



評論


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

關(guān)閉