您的位置 首页 汽车

stm32 设置systick中止抢先式优先级

最近使用STM32时希望将systick的中断优先级降低,但是CMSIS里给出的例子都是类似[plain]viewplaincopyNVIC_InitStructureNVIC_IRQChanne

最近运用STM32时期望将systick的中止优先级下降,可是CMSIS里给出的比如都是相似

[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的技能参考手册,讲解了NVIC的装备。

中止分为内核中止和芯片的中止,装备的寄存器方位不同。芯片的中止装备在NVIC的IP内,内核的中止装备在SCB内。

能够直接调用core_cm3.h里的函数

[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. }

这个函数完成了两类中止优先级的装备。

可是直观上来看看不到抢先式优先级与子优先级。

首要,装备优先级组,能够运用固件库的程序,也能够用core_cm3.h的函数。

[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. }

参数规模为0~7,详细如下

随后装备各个中止的优先级,关于外设的中止能够运用固件库的程序,比较直观。如最前面所给出的比如,可是依据其完成,是不能够用来装备内核中止的,例如

[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);

这是过错的,由于内部运用IRQn寻址,而SysTick_IRQn为-1.

所以关于Sysick运用core_cm3.h的函数

[cpp]view plaincopy
  1. NVIC_SetPriority(SysTick_IRQn,4);

这时不能显式的看出抢先式优先级与子优先级,写入的优先级需求依据优先级组的装备来挑选。

[cpp]view plaincopy
  1. NVIC_SetPriority(SysTick_IRQn,n);
  2. n=0x00~0x03设置Systick为抢占优先级0
  3. n=0x04~0x07设置Systick为抢占优先级1
  4. n=0x08~0x0B设置Systick为抢占优先级2
  5. n=0x0C~0x0F设置Systick为抢占优先级3

NV%&&&&&%_SetPriority函数指定中止优先级的寄存器位(STM32只用4位来表明优先级)的数据,例如中止优先级组设置为了2,即高2位用于指定抢占式优先级,低2位用于指定呼应优先级,0x00~0x03高2位为0,所以抢占优先级为0;0x04~0x07高2位为1,所以抢占优先级为1,以此类推。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/255918.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部