博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从第二个函数NVIC_PriorityGroupConfig()中了解Cortex-M3的中断
阅读量:6437 次
发布时间:2019-06-23

本文共 3408 字,大约阅读时间需要 11 分钟。

hot3.png

在第一个函数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中,优先级寄存器中高四位中的高两位说明抢占优先级,低两位说明子优先级。抢占优先级的话就是能打断低抢占优先级的中断,从而实现中断嵌套。

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

下面的截图说明优先级如何确定和嵌套规则

关于那几个需要掌握的与中断寄存器,还有一个截图:

下面的截图关于中断是如何建立的

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

那么现在具体说说这个优先级配置函数,函数定义实现如下:

/**  * @brief  Configures the priority grouping: pre-emption priority and subpriority.  * @param  NVIC_PriorityGroup: specifies the priority grouping bits length.   *   This parameter can be one of the following values:  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority  *                                4 bits for subpriority  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority  *                                3 bits for subpriority  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority  *                                2 bits for subpriority  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority  *                                1 bits for subpriority  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority  *                                0 bits for subpriority  * @retval None  */void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup){  /* Check the parameters */  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));    /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;}
此函数在misc.c原文件中,函数只有两句话。其中

assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
assert_param是定义的一个宏,用来检测表达式的正确性。如果表达式正确则什么也不做,继续执行下面的语句。如果参数有错,就会在当前行报错。这里主要检测我们输入的NVIC配置优先级是否有效。

/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
这句话才是关键,实现了优先级的配置。其中AIRCR_VECTKEY_MASK相当于个钥匙,用一个宏实现。在此源文件的开始处声明,其值为:

#define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)

因为NVIC是个很关键的寄存器,不能随便配置,于是需要一个输入标记才能进行正确配置,此标记就相当于一把钥匙。其中NVIC_PriorityGroup值的选择就是函数上方中那些宏,一共有5种情况。

/**  * @brief  Configures the priority grouping: pre-emption priority and subpriority.  * @param  NVIC_PriorityGroup: specifies the priority grouping bits length.   *   This parameter can be one of the following values:  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority  *                                4 bits for subpriority  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority  *                                3 bits for subpriority  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority  *                                2 bits for subpriority  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority  *                                1 bits for subpriority  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority  *                                0 bits for subpriority  * @retval None  */
另外发现现在有很多实时系统都是根据Cortex-M3内核量身订造的,想必其强大的NVIC就是其中一个原因吧。

转载于:https://my.oschina.net/u/1587304/blog/399850

你可能感兴趣的文章
阿里数据库内核月报:2015年11月
查看>>
swfheader 0.10 Released(已更正下载地址)
查看>>
SQL Server使用视图做权限控制
查看>>
深入浅出LVS:企业集群平台负载均衡的三种模式和算法实现
查看>>
twitter storm源码走读(二)
查看>>
jQuery学习笔记之DOM操作、事件绑定(2)
查看>>
写入指定长度的字节到文件
查看>>
删除数据表和清空数据表的内容(保存表结构)的SHELL脚本
查看>>
C# 视频监控系列(14):总结贴——VC++代码转成C#小结
查看>>
undefined与null的区别
查看>>
Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View...
查看>>
数据挖掘中的概念描述
查看>>
struts2 依赖注入boolean类型的属性时报错
查看>>
应用生命周期终极 DevOps 工具包
查看>>
RUBY的类封装,继承,多态简单演示
查看>>
(iOS开发总结)MVC模式
查看>>
python sys.argv[]用法
查看>>
切割nginx日志
查看>>
LDAP常用命令解析
查看>>
Cobbler体验小记
查看>>