您的位置 首页 芯闻

了解Cortex-M3的中止

在第一个函数SystemInit()的下一行,会有常见的另一个函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)(X代表数字1,2,3…)。此…

在第一个函数SystemInit()的下一行,会有常见的另一个函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)(X代表数字1,2,3…)。此函数跟中止装备相关,装备中止优先级,包含抢占优先级与子优先级。

关于NVIC(中止向量操控器)的介绍STM32参考手册中是找不到的。需求看《Cortex-M3威望攻略》,这本书是侧重描绘此M3内核相关的东西。NVIC也在其间,由于它是内核中很重要的一部分。

看了下这本书,关于NVIC描绘的很详细。我就直接截图咯。

跟NVIC打交道的寄存器截图阐明。操作NVIC,这些寄存器都是需求把握的,尤其是需求“挂号”的那四个寄存器。

关于中止使能与禁能

这个的话Cortex-M3分别运用了两个寄存器操控,一个担任使能与禁能,不像一些简略的单片机一个BIT位就搞定这两个功用,此功用带来的优点便是安全了,不必惧怕忧虑自己的误操作。由于此寄存器都是写1有用,写0无效。使能某寄存器则需向使能寄存器写1,禁能需向禁能寄存器写1。

下面的截图说的是关于悬起与解悬寄存器

中止优先级

每个外部中止的优先级寄存器占8位,可是答应最少只运用最高3位。STM32的话便是运用了最高4位。而且4个相邻的优先级寄存器拼接成一个32位寄存器。中止优先级又分为抢占优先级和子优先级。STM32中,优先级寄存器中高四位中的高两位阐明抢占优先级,低两位阐明子优先级。抢占优先级的话便是能打断低抢占优先级的中止,然后完成中止嵌套。

下面也是截图看看优先级有哪几种分配状况。

下面的截图阐明优先级怎么确认和嵌套规矩。

关于那几个需求把握的与中止寄存器,还有一个截图:

下面的截图关于中止是怎么树立的:

当然还有一些其它跟中止相关的寄存器,不是很常用,就没写在这儿了。

那么现在详细说说这个优先级装备函数,函数界说完成如下:

  1. /**
  2. *@briefConfigurestheprioritygrouping:pre-emptionpriorityandsubpriority.
  3. *@paramNVIC_PriorityGroup:specifiestheprioritygroupingbitslength.
  4. *Thisparametercanbeoneofthefollowingvalues:
  5. *@argNVIC_PriorityGroup_0:0bitsforpre-emptionpriority
  6. *4bitsforsubpriority
  7. *@argNVIC_PriorityGroup_1:1bitsforpre-emptionpriority
  8. *3bitsforsubpriority
  9. *@argNVIC_PriorityGroup_2:2bitsforpre-emptionpriority
  10. *2bitsforsubpriority
  11. *@argNVIC_PriorityGroup_3:3bitsforpre-emptionpriority
  12. *1bitsforsubpriority
  13. *@argNVIC_PriorityGroup_4:4bitsforpre-emptionpriority
  14. *0bitsforsubpriority
  15. *@retvalNone
  16. */
  17. voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup)
  18. {
  19. /*Checktheparameters*/
  20. assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  21. /*SetthePRIGROUP[10:8]bitsaccordingtoNVIC_PriorityGroupvalue*/
  22. SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;
  23. }

此函数在misc.c原文件中,函数只要两句话。其间

  1. assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

assert_param是界说的一个宏,用来检测表达式的正确性。假如表达式正确则什么也不做,持续履行下面的句子。假如参数有错,就会在当前行报错。这儿首要检测咱们输入的NVIC装备优先级是否有用。

[cpp]view plaincopy

print?

  1. /*SetthePRIGROUP[10:8]bitsaccordingtoNVIC_PriorityGroupvalue*/
  2. SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;

这句话才是要害,完成了优先级的装备。其间AIRCR_VECTKEY_MASK相当于个钥匙,用一个宏完成。在此源文件的开端处声明,其值为:

  1. #defineAIRCR_VECTKEY_MASK((uint32_t)0x05FA0000)

由于NVIC是个很要害的寄存器,不能随意装备,所以需求一个输入符号才干进行正确装备,此符号就相当于一把钥匙。其间NVIC_PriorityGroup值的挑选便是函数上方中那些宏,一共有5种状况。

  1. /**
  2. *@briefConfigurestheprioritygrouping:pre-emptionpriorityandsubpriority.
  3. *@paramNVIC_PriorityGroup:specifiestheprioritygroupingbitslength.
  4. *Thisparametercanbeoneofthefollowingvalues:
  5. *@argNVIC_PriorityGroup_0:0bitsforpre-emptionpriority
  6. *4bitsforsubpriority
  7. *@argNVIC_PriorityGroup_1:1bitsforpre-emptionpriority
  8. *3bitsforsubpriority
  9. *@argNVIC_PriorityGroup_2:2bitsforpre-emptionpriority
  10. *2bitsforsubpriority
  11. *@argNVIC_PriorityGroup_3:3bitsforpre-emptionpriority
  12. *1bitsforsubpriority
  13. *@argNVIC_PriorityGroup_4:4bitsforpre-emptionpriority
  14. *0bitsforsubpriority
  15. *@retvalNone
  16. */

别的发现现在有许多实时体系都是依据Cortex-M3内核量身订造的,想必其强壮的NV%&&&&&%便是其间一个原因吧。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部