首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
ARM
» Cortex‐M3的NVIC与中断控制
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
Cortex‐M3的NVIC与中断控制
发短消息
加为好友
yuyang911220
当前离线
UID
1029342
帖子
9914
精华
0
积分
4959
阅读权限
90
在线时间
286 小时
注册时间
2014-5-22
最后登录
2017-7-24
论坛元老
UID
1029342
性别
男
1
#
打印
字体大小:
t
T
yuyang911220
发表于 2015-11-22 18:46
|
只看该作者
Cortex‐M3的NVIC与中断控制
控制器
,
寄存器
,
存储器
,
定时器
向量中断控制器,简称 NVIC,是 Cortex‐M3 不可分离的一部分,它与 CM3内核的逻辑紧密耦合,有一部分甚至水乳交融在一起。NVIC与 CM3内核同声相应,同气相求,相辅相成,里应外合,共同完成对中断的响应。NVIC的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外, NVIC还包含了 MPU的控制寄存器、SysTick定时器以及调试控制。 中断的使能与除能
。CM3 中可以有240 对使能位/除能位,每个中断拥有一对。这 240个对子分布在 8 对 32位寄存器中(最后一对没有用完)。欲使能一个中断,你需要写 1 到对应 SETENA 的位中;欲除能一个中断,你需要写 1 到对应的CLRENA 位中;如果往它们中写 0,不会有任何效果。
。SETENA位和CLRENA 位可以有 240 对,对应的 32位寄存器可以有 8 对,因此使用数字后缀来区分这些寄存器,如SETENA0, SETENA1…SETENA7,如表 8.1所示。但是在特定的芯片中,只有该芯片实现的中断,其对应的位才有意义。因此,如果你使用的芯片支持 32 个中断,则只有SETENA0/CLRENA0 才需要使用。SETENA/CLRENA 可以按字/半字/字节的方式来访问。又因为前 16个异常已经分配给系统异常,故而中断 0 的异常号是 16。
中断的悬起与解悬
如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响
应。此时中断被悬起。中断的悬起状态可以通过“中断设置悬起寄存器(SETPEND)”和“中
断悬起清除寄存器(CLRPEND)”来读取,还可以写它们来手工悬起中断。
悬起寄存器和“解悬”寄存器也可以有 8 对,其用法和用量都与前面介绍的使能/除能
寄存器完全相同。
优先级
每个外部中断都有一个对应的优先级寄存器,每个寄存器占用 8 位,但是允许最少只使
用最高 3 位。4 个相临的优先级寄存器拼成一个 32 位寄存器。如前所述,根据优先级组设
置,优先级可以被分为高低两个位段,分别是抢占优先级和亚优先级。优先级寄存器都可以
按字节访问,当然也可以按半字/字来访问。有意义的优先级寄存器数目由芯片厂商实现的
中断数目决定。
活动状态
每个外部中断都有一个活动状态位。在处理器执行了其 ISR 的第一条指令后,它的活动
位就被置 1,并且直到 ISR 返回时才硬件清零。由于支持嵌套,允许高优先级异常抢占某个
ISR。然而,哪怕一个中断被抢占,其活动状态也依然为 1(请仔细琢磨前文讲到的“直到 ISR
返回时才清零)。活动状态寄存器的定义,与前面讲的使能/除能和悬起/解悬寄存器相同,
只是不再成对出现。它们也能按字/半字/字节访问,但他们是只读的,如表 8.4所示。
PRIMASK 与 FAULTMASK 特殊功能寄存器
PRIMASK用于除能在 NMI 和硬 fault之外的所有异常,它有效地把当前优先级改为 0 (可
编程优先级中的最高优先级)。该寄存器可以通过 MRS和 MSR 以下例方式访问:
1. 关中断
MOV R0, #1
MSR PRIMASK,R0
2. 开中断
MOV R0, #0
MSR PRIMASK,R0
此外,还可以通过CPS指令快速完成上述功能:
CPSID i ;关中断
CPSIE i ;开中断
FAULTMASK更绝,它把当前优先级改为‐1。这么一来,连硬fault都被掩蔽了。使用方案
与PRIMASK的相似。但要注意的是,FAULTMASK会在异常退出时自动清零。
掩蔽寄存器虽然能一手遮天,却都动不了NMI,因为NMI是用在最危急的情况下的。因
此系统为它开出单行道,无需挂号只是不要迟到。当NMI激活时,“谁都是省略号,唯独是
你不得了,第一优先谁比你重要”
BASEPRI寄存器
更精巧的设计中,需要对中断掩蔽进行更细腻的控制——只掩蔽优先级低于某一阈值
的中断——它们的优先级在数字上大于等于某个数。那么这个数存储在哪里?就存储在
BASEPRI中。不过,如果往BASEPRI中写0,则另当别论——BASEPRI将停止掩蔽任何中断。
其它异常的配置寄存器
用法fault,总线fault以及存储器管理fault都是特殊的异常,因此给它们开了小灶。其中,
它们的使能控制是通过“系统Handler控制及状态寄存器(SHCSR)”(地址:0xE000_ED24)来
实现的。各种faults的悬起状态和大多数系统异常的活动状态也都在该寄存器中
中断控制及状态寄存器ICSR。对于NMI、SysTick定时器以及PendSV,可以通过此
寄存器手工悬起它们。另外,在该寄存器中,有好多位段都用于调试目的。在大多数情况下,
它们对于应用软件都没有什么用处,只有悬起位对应用程序常常比较有参考价值。
软件中断
软件中断,包括手工产生的普通中断,能以多种方式产生。最简单的就是使用相应的
SETPEND寄存器;而更专业更快捷的作法,则是通过使用软件触发中断寄存器STIR,如表8.8
所示。
表8.8 软件触发中断寄存器STIR(地址:0xE000_EF00)
位段 名称 类型 复位值 描述
8:0 INTID W ‐ 影响编号为 INTID 的外部中断,其悬起位被置位。
例如,写入 8,则悬起 IRQ #8
注意:系统异常(NMI,faults,PendSV等),不能用此法悬起。而且缺省时就不允许用
户程序改动NVIC寄存器的值。如果确实需要,必须先在NVIC的配置和控制寄存器
(0xE000_ED14)中,把比特1(USERSETMPEND)置位,才能允许用户级下访问NVIC的STIR。
SysTick定时器
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操
作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,
为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期
的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时
器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问
它的寄存器,以维持操作系统“心跳”的节律。
Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时
器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,
CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。不过,STCLK的
具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视
芯片的器件手册来决定选择什么作为时钟源。
SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一
席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3
产品间对其处理都是相同的。
收藏
分享
评分
继承事业,薪火相传
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议