ARM - Cortex-M3内核结构
更新时间:2023-10-29 16:45:01 阅读量: 综合文库 文档下载
- arm推荐度:
- 相关推荐
2.1.1 概述
ARM Cortex-M3 内核结构
ARM Cortex-M3 处理器简介
ARM公司成立于上个世纪九十年代初,致力于处理器内核研究,ARM 即 Advanced RISC Machines
的缩写,ARM公司本身不生产芯片,只设计内核,靠转让设计许可,由合作伙伴公司来生产各具特色的 芯片。这种运行模式运营的成果受到全球半导公司以及用户的青睐。目前ARM体系结构的处理器内核有: ARM7TDMI、ARM9TDMI、ARM10TDMI、ARM11以及Cortex等。2005年ARM推出的ARM Cortex系列内核,分别
为:A系列、R系列和M系列,其中A系列是针对可以运行复杂操作系统(Linux、Windows CE、Symbian 等)的处理器;R系列是主要针对处理实时性要求较高的处理器(汽车电子、网络、影像系统);M系列 又叫微控制器,对开发费用敏感,对性能要求较高的场合。
Cortex-M系列目前的产品有M0、M1、M3,其中M1用在FPGA中。Cortex-M系列对微控制器和低成本应 用提供优化,具有低成本、低功耗和高性能的特点,能够满足微控制器设计师进行创新设计的需求。其 中,ARM Cortex-M3处理器的性能是ARM7的两倍,而功耗却只有ARM7的1/3,适用于众多高性能、极其低 成本需求的嵌入式应用,如微控制器、汽车系统、大型家用电器、网络装置等,ARM Cortex-M3提供了 32位微控制器市场前所未有的优势。
Cortex-M3内核,内部的数据路径为32位,寄存器为32位,存储器接口也是32位。Cortex-M3采用了 哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问分开进行。Cortex-M3还提供一个 可选的MPU,对存储器进行保护,而且在需要的情况下也可以使用外部的cache。另外在Cortex-M3中, 存储器支持小端模式和大端存储格式。Cortex-M3内部还附赠了很多调试组件,用于在硬件水平上支持 调试操作,如指令断点,数据观察点等。另外,为支持更高级的调试,还有其它可选组件,包括指令跟 踪和多种类型的调试接口。
2.1.2 内核结构组成及功能描述
Cortex-M3微控制器内核包括处理核心和许多的组件,目的是用于系统管理和调试支持。如图2.1为 Cortex-M3内核方框图。
NMI 中断号[239:0]
SLEEPING SLEEPDEEP NVIC 中断 睡眠 调试 SysTick Cortex-M3 CM3核 指令 MPU 触发 ETM 数据 TPIU
FPB DWT ITM 专用外 设总线
SW-DP JTAG-DP 专用外设总线(内部) AHB-AP 总线矩阵 APB ROM表
I-code总线 D-code总线 系统总线 系统总线(AHB)
总线矩阵
静态 RAM 外部 RAM 外部 控制器 设备
AHB to APB 总线
Flash 存 储器 SRAM 可 选配 外部 RAM 外设总线 I/O UART PWM Timer
图 2.1 Cortex-M3 内核方框图
1.处理器内核
Cortex-M3处理器内核采用ARMv7-M架构,其主要特性如下:
? Thumb-2指令集架构(ISA)的子集,包含所有基本的16位和32位Thumb-2指令; ? 哈佛处理器架构,在加载/存储数据的同时能够执行指令取指; ? 带分支预测的三级流水线; ? 32位单周期乘法; ? 硬件除法;
? Thumb状态和调试状态;
? ? ? ? ? 处理模式和线程模式; ISR的低延迟进入和退出;
可中断-可继续(interruptible-continued)的LDM/STM、PUSH/POP; 支持ARMv6类型BE8/LE; 支持ARMv6非对齐访问。
2.NVIC(嵌套向量中断控制器)
NVIC与处理器内核是紧密耦合的,这样可实现快速、低延迟的异常处理。在Cortex-M微控制器此功 能非常强大。
3.总线矩阵
总线矩阵用来将处理器和调试接口与外部总线相连。 处理器包含4 个总线接口:
? ICode 存储器接口:从Code 存储器空间(0x0000000–0x1FFFFFFF)的取指都在这条32
位 AHBLite 总线上执行。 ? DCode 存储器接口:对Code 存储器空间(0x0000000–0x1FFFFFFF)进行数据和调试访问都
在这条32 位AHBLite 总线上执行。 ? 系统接口:对系统空间(0x20000000–0xDFFFFFFF)进行取指、数据和调试访问都在这条32 位
AHBLite 总线上执行。 ? 外部专用外设总线(PPB):对外部PPB 空间(0xE0040000–0xE00FFFFF)进行数据和调试访
问都在这条32 位APB 总线(AMBA v2.0)上执行。跟踪端口接口单元(TPIU)和厂商特定的 外围器件都在这条总线上。 注:处理器包含一条内部专用外设总线,用来访问嵌套向量中断控制器(NVIC)、数据观察点和 触发(DWT)、Flash 修补和断点(FPB),以及存储器保护单元(MPU)。
4.FPB
FPB单元实现硬件断点以及从代码空间到系统空间的修补访问,FPB有8个比较器。
5.DWT
数据观察点和跟踪,调试功能部件。
6.ITM
ITM是一个应用导向(application driven)的跟踪源,支持对应用事件的跟踪和printf类型的调 试。
7.MPU
存储器保护单元(MPU)是用来保护存储器的一个元件。处理器支持标准的ARMv7“受保护的存储器 系统结构”(PMSA)模型。如果希望向处理器提供存储器保护,则可以使用可选的MPU;MPU对访问允许 和存储器属性进行检验。它包含8个区和一个可选的执行默认存储器映射访问属性的背景区。
8.ETM
ETM支持指令跟踪的低成本跟踪宏单元。
9.TPIU
TPIU用作来自ITM和ETM(如果存在)的Cortex-M3内核跟踪数据与片外跟踪端口分析仪之间的桥接。
10.SW/JTAG-DP
Cortex-M3处理器可配置为具有SW-DP或JTAG-DP调试端口的接口,或两者都有。这两个调试端口提 供对系统中包括处理器寄存器在内的所有寄存器和存储器的调试访问。
2.2 内核寄存器组织
如图 2.2 所示,Cortex_M3 内核寄存器分为 16 个通用寄存器 R0~R15 和 7 个特殊功能寄存器。
低 寄 存 器
R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 MSP PSP
通 用 寄 存 器
高 寄 存 器
R12 R13(SP) R14(LR) R15(PC)
特 殊 功 能 寄 存 器
状态寄存器 中断屏蔽 寄存器 控制寄存器 xPSR PRIMASK FAULTMASK BASEPRI CONTROL
图 2.2 寄存器组织图
2.2.1 通用寄存器 R0-R15
R0~R12 寄存器:是真正意义上的通用。在处理器运行过程中,作数据的寄存。
R13 为堆栈指针寄存器:堆栈指针是用于访问堆栈,也即系统的 RAM 区。Cortex_M3 中采用了两个 堆栈指针:主堆栈指针(MSP)和进程堆栈指针(PSP),R13 在任何时刻只能是其中一个,默认情况为 MSP,可以通过控制寄存器(CONTORL)来改变。Cortex_M3 中堆栈方向是向低地址方向增长,为满堆栈 机制。堆栈操作是通过 PUSH 和 POP 来完成操作的。
例如 MSP 当前指针指向:0x2000_000C;R0=0x00000000。
执行:PUSH R0
此时 MSP 指向:0x2000_0008 执行示意如图 2.3 所示。
RAM
RAM 已使用 已使用 已使用 0x2000_0008 MSP 向 下 生 长
0x2000_000C MSP 已使用 已使用 上次压入的数据 未用 未用 0x00000000 未用
2.3 堆栈操作示意图
R14 程序连接寄存器(LR):在执行分支(B)和链接(BL)指令或带有交换分支(BX)和链接 指令(BLX)时,PC 的返回地址自动保存进 LR。比如在子程序调用时用保存子程序的返回地址。LR 也用于异常返回,但是在这里保存的是返回后的状态,不是返回的地址,异常返回是通过硬件自动出栈 弹出之前压入的 PC 完成的。
R15 程序计数器(PC):是程序运行的基础,具有自加的功能。该寄存器的位 0 始终为 0,因此, 指令始终与字或半字边界对齐。
2.2.2 特殊功能寄存器
特殊功能寄存器分为程序状态寄存器、中断屏蔽寄存器和控制寄存器三类。
xPSR 程序状态寄存器:系统级的处理器状态可分为 3 类,应用状态寄存器(APSR)、中断状态寄 存器(IPSR)、执行状态寄存器(EPSR),可组合起来构成一个 32 位的寄存器,统称 xPSR。
表 2.1 xPSR 寄存器
寄存 器名 APSR 位 31 N 30 Z 29 C 28 V 27 Q 26:25 24 23:20 19:16 15:10 9 8 7 6 5 4:0 中断编号 ICI/IT T EPSR IPSR ICI/IT
xPSR 寄存器的各位的功能如表 2.2:
表 2.2 xPSR 寄存器各位功能
位 31 30 29 28 名称 N Z C V 定义 负数或小于标志:1:结果为负数或小于;0 结果为正数或大于 零标志:1:结果为 0;0:结果为非 0 进位/借位标志:1:进位或借位;0 没有进位或借位 溢出标志:1:溢出;0:没有溢出
27 26:25 15:10 24 15:12 8:0 Q 粘着饱和标志:1:已饱和;0:没有饱和 IF-Then 位。它们是 if-Then 指令的执行状态位。 包含 if-Then 模块的指令数目和它们的执行条件 用于指示处理器当前是 ARM 状态还是 Thumb 状态 可中断-可继续的指令位:如果在执行 LDM 或 STM 操作时产生一次中断,则 LDM ICI ISR 或 STM 操作暂停,该位来保存该操作中下一个寄存器操作数的编号,在中断响 应之后,处理器返回由该位指向的寄存器并恢复操作。 占先异常的编号 IT T
中断屏蔽寄存器:分为三组,分别是 PRIMASK、FAULTMASK、BASEPRI。
PRIMASK 为片上外设总中断开关,该寄存器只有位 0 有效,当该位为 0 是响应所有外设中断;当该 位为 1 时屏蔽所有片上外设中断。
FAULTMASK 寄存器管理系统错误的总开关,该寄存器中有位 0 有效,当该位为 0 时,响应所有的异 常;为 1 屏蔽所有的异常。
BASEPRI 寄存器用来屏蔽优先级等于和小于某一个中断数值的寄存器。 控制寄存器:CONTROL 有两个作用,其一用于定义处理器特权级别,其二用于选择堆栈指针,如表 3.3 所示。
表 2.3 CONTROL 寄存器
位 功能 堆栈指针选择 CONTROL[1] 0:选择主堆栈指针 MSP 1:选择进程堆栈指针 PSP 0:特权级 1:用户级 CONTROL[0] CONTROL[0]:异常情况下,处理器总是处于特权模式,CONTROL[0]位总是为 0;在线程模式情况下 (非异常情况),处理器可以工作在特权级也可工作在用户级,该位可为 0 或 1。特权级下所有的资源 都可以访问,而用户级下被限制的资源不能访问,比如 MPU 被限制的资源。 CONTROL[1]:为 0 时,只使用 MSP,此时用户程序和异常共享同一个堆栈,处理器复位后默认的也 是该模式。为 1 时,用户应用程序使用进程堆栈 PSP,而中断任然得使用主堆栈 MSP。这种双堆栈机制, 特别适合在带有 OS(操作系统)的环境下使用,只要 OS 内核在特权级下执行,而用户应用程序在用户 模式下执行,就可很好的将代码隔离互不影响。
2.3 处理器操作模式
ARM Cortex-M3支持2个模式和两个特权等级。如图2.4所示,在嵌入式系统应用程序中,程序代
码 涉及异常服务程序代码和非异常服务程序代码,这些代码可以工作在处理器特权级也可以工作在用户级 级,但有区别。当处理器处在线程模式下时,既可以使用特权级,也可以使用用户级;另一方面,handler 模式总是特权级的。在复位后,处理器进入线程模式+特权级。
特权级
用户级 Handler 模式 主应用程序的代码
线程模式 线程模式 错误的用法
异常 handler 的代码 图 2.4 操作模式和特权等级
在线程模式+用户级下,对系统控制空间(SCS,0xE000E000~0xE000EFFF,包括NVIC、SysTick、
MPU以及代码调试控制所用的寄存器)的访问将被禁止。除此之外,还禁止使用MRS/MSR访问,除了APSR 之外的特殊功能寄存器。如果操作,则对于访问特殊功能寄存器的,访问操作被忽略;而对于访问SCS 空间的,将产生错误。
在特权级下不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回 后,系统将回到产生异常时所处的级别,同时特权级也可通过置位CONTROL[0]来进入用户级。用户级下 的代码不能再试图修改CONTROL[0]来回到特权级。它必须通过一个异常handler,来修改CONTROL[0], 才能在返回到线程模式后进入特权级。如图2.5所示。
特权级 handler 模式
CONTROL[0]=1
CONTROL[0]=0 异常服务 例程 异常服务 例程
特权级 线 启 动 代码 程模式
异常 异常
用户级 线 程模式
特权级的 线程 用户 程序 用户 程序
图 2.5 处理器模式转换图
把代码按特权级和用户级分开处理,有利于使Cortex-M3的架构更加稳定可靠。例如,当某个用
户 程序代码出问题时,可防止处理器对系统造成更大的危害,因为用户级的代码是禁止写特殊功能寄存器 和NVIC中寄存器的。另外,如果还配有MPU,保护力度就更大,甚至可以阻止用户代码访问不属于它的 内存区域。
在引入了嵌入式实时操作系统中,为了避免系统堆栈因应用程序的错误使用而毁坏,我们可以给 应用程序专门配一个堆栈,不让它共享操作系统内核的堆栈。在这个管理制度下,运行在线程模式的用 户代码使用PSP,而异常服务例程则使用MSP。这两个堆栈指针的切换是智能全自动的,在异常服务的始 末由Cortex-M3硬件处理。
如前所述,特权等级和堆栈指针的选择均由CONTROL负责。 当CONTROL[0]=0,在异常处理的始末,只发生了处理器模式的转换,如图2.6所示。 若CONTROL[0]=1(线程模式+用户级),则在中断响应的始末,处理器模式和特权等级都要发生变
化,如图2.7所示。 CONTROL[0]只有在特权级下才能访问。用户级的程序如想进入特权级,通常都是
使用一条“系
统服务呼叫指令(SVC)”来触发“SVC异常”,该异常的服务例程可以视具体情况而修改CONTROL[0]。
中断事件 中断服务程序 中断返回
主程序 入栈
出栈 线 程 模 式 (特权级)
线 程 模 式 (特权级) Handler 模 式 (特权级)
图 2.6 中断前后的状态转换
中断事件 中断服务程序 中断返回
主程序 入栈 出栈 线 程 模 式 (用户级)
线 程 模 式 (用户级)
Handler 模 式 (特权级)
图 2.7 中断前后的状态转换+特权等级切换
2.4 存储器系统
2.4.1 存储器映射
Cortex-M3 采用了固定的存储映射结构,如图 2.8 所示。
Cortex-M3 的地址空间是 4GB, 程序可以在代码区,内部 SRAM 区以及外部 RAM 区中执行。但是因为 指令总线与数据总线是分开的,最理想的是把程序放到代码区,从而使取指和数据访问各自使用己的总 线。
内部 SRAM 区的大小是 512MB,用于让芯片制造商连接片上的 SRAM,这个区通过系统总线来访问。 在这个区的下部,有一个 1MB 的区间,被称为“位带区”。该位带区还有一个对应的 32MB 的 “位带别 名(alias)区”,容纳了 8M 个“位变量”(对比 8051 的只有 128 个位变量),位带区对应的是最低的 1MB 地址范围,而位带别名区里面的每个字对应位带区的一个比特。位带操作只适用于数据访问,不适 用于取指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中, 像访问普通内存一样地使用它们。位带别名区中的访问操作是原子的,消灭了传统的“读-改-写”三 步。
0xE00FFFFF 0xE00FF000 0xE0042000 0xE0041000 0xE0040000
ROM 外部 PPB ETM TPIU 芯片厂商定义 外部私有外设总线 0xFFFFFFFF
0xE003FFFF 0xE000F000 0xE000E000 0xE0003000 0xE0002000 0xE0001000 0xE0000000
保留 内核 0xE0100000 私有 0xE00FFFFF 区域 512MB 0xE0040000
0xE003FFFF
0xE0000000 0xDFFFFFFF
内部私有外设总线 NVIC 保留 FPB DWT ITM 片外外设 1.0GB 0xA0000000 0x9FFFFFFF
0x43FFFFFF
32MB 位带别名区 0x42000000 0x41FFFFFF
片外 RAM 1.0GB
0x40100000 0x40000000
0x60000000 0x5FFFFFFF
31MB 片上外设区 512MB 0x40000000 0x3FFFFFFF
片上 SRAM 512MB 0x20000000 0x1FFFFFFF
代码区 512MB 0x00000000
1MB 位带区
0x23FFFFFF
32MB 位带别名区 0x22000000
0x21FFFFFF
0x20100000 0x20000000
31MB 1MB 位带区
图 2.8 Cortex-M3 存储器映射图
片上外设对应 512MB 的空间,芯片上所有与外围设备相关的寄存器都位于该区域。这个区中也有一
条 32MB 的位带别名,以便于快捷地访问外设寄存器,用法与内部 SRAM 区中的位带相同。例如,可以方 便地访问各种控制位和状态位。要注意的是,外设区内不允许执行指令。通常半导体厂商就是修改此区 域的片上外设,来达到各具特色的、个性化的设备。
还有两个 1GB 的范围,分别用于连接外部 RAM 和外部设备,它们之中没有位带。两者的区别在于外 部 RAM 区允许执行指令,而外部设备区则不允许。 最后还剩下 0.5GB 的隐秘地带,包括了系统级组件,内部私有外设总线,外部私有外设总线,以及 由提供者定义的系统外设。
私有外设总线有两条: AHB 私有外设总线,只用于 CM3 内部的 AHB 外设,它们是:NVIC, FPB, DWT 和 ITM。 APB 私有外设总线,既用于 CM3 内部的 APB 设备,也用于外部设备(这里的“外部”是对内核而言)。 Cortex-M3 允许器件制造商再添加一些片上 APB 外设到 APB 私有总线上,它们通过 APB 接口来访问。
NVIC 所处的区域叫做“系统控制空间(SCS)”,在 SCS 里的除了 NVIC 外,还有 SysTick、MPU 以 及代码调试控制所用的寄存器。
最后,未用的提供商指定区也通过系统总线来访问,但是不允许在其中执行指令。
2.4.2 位带操作
在Cotex-M3存储器映射中包括两个位操作区。分别位于SRAM和片上外设存储区的最低1MB空间中。 这两个位带中的地址除了可以像普通的RAM一样使用外,它们还都有自己的“位带别名区”,位带别名 区把每个比特膨胀成一个32位的字形成位地址。当你通过位带别名区访问这些字时,就可以达到访问原 始比特的目的,其对应关系如图2.8所。
位地址与位别名对应关系统如下: 对于 SRAM 位带区的某个位:
Aliasaddr ??0x22000000??((A ??0x20000000) ??8 ??n) ??4
??0x22000000??( A ??0x20000000) ??32 ??n ??4
对于片上外设位带区的某个位:
Aliasaddr ??0x42000000??((A ??0x40000000) ??8 ??n) ??4
??0x42000000??( A ??0x40000000) ??32 ??n ??4
在上述表达式中,A 表示要操作的位所在的字节地址,n(0≤n≤7)表示位序号。
0x23FFFFFC 0x23FFFFF8 0x23FFFFF4 0x23FFFFF0 0x23FFFFEC 0x23FFFFE8 0x23FFFFE4 0x23FFFFE0
位带别名区(共 32MB)
0x2200001C 0x22000018 0x22000014 0x22000010 0x2200000C 0x22000008 0x22000004 0x22000000
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 0x200FFFFF
0x200FFFFE 0x200FFFFD 0x200FFFFC SRAM 位带区(共 1MB)
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 0x20000003 0x20000002 0x20000001 0x20000000
2.9 位操作对应关系图
举例:将地址 0x20000000 的第 2 位置 1。通过上述计算关系,可计算出位带别名为 0x22000008。 如程序清单 L2.1 所示。
程序清单 L2.1 SRAM 位操作实例
LDR R0,=0x22000008
LDR R1,=0x01 STR R1,[R0]
将片上外设 I/O 端口的 A 口的第 0 位(也即 PORTA0)为输出,其 A 口的方向寄存器地址为 0x40004400, 设置 1 作为输出,可根据上述关系计算出位带别名为 0x42088000。如程序清单 L2.2 所示。
程序清单 L2.2 片上外设位操作实例
LDR R0,=0x42088000 LDR R1,=0x01 STR R1,[R0]
注:采用大端格式时,对位邦定别名区的访问必须以字节方式,否则访问不可预知。
2.5 异常
ARM Cortex-M3 中异常涉及异常的类型、优先级、向量表等,本节并以 Luminary 系列微控制器为 例
说明异常的具体行为。
2.5.1 异常类型
在 Cortex-M3 中有 一个 与内 核紧 耦 合部 件叫 嵌套向 量 中断 控制 器( NVIC, Nested Vectored Interrupt Controller),定义了 16 种系统异常和 240 路外设中断。通常芯片设计者可自由设计片上外 设,因此具体的片上外设中断都不会用到多达 240 路。如表 2.4 所示系统异常类型,表 2.5 所示为外设 中断类型。
Cortex-M3 中目前只有 11 种系统异常可用分别是:系统复位、NMI(不可屏蔽中断)、硬件故障、 存储器管理、总线故障、用法故障、SVCall(软件中断)、调试监视器中断、PendSV(系统服务请求)、 SysTick(24 位定时器中断)。240 路外设中断,是指片上外设的各模块,比如 I/O 口、UART 通信接口、 SSI 总线接口等所需的中断。
表 2.4 异常类型
编号 0 1 2 类型 - 复位 NMI 优先级 - -3 -2 描述 复位时载入向量表的第一项作为主堆栈栈顶地址。 复位。 不可屏蔽中断(来自外部 NMI 输入脚)。 当故障由于优先级或者是可配置的故障处理程序被禁止的原因 而无法激活时,所有类型故障都会以硬故障的方式激活。 4 5 存储器管理 总线故障 可编程 可编程 MPU 不匹配,包括访问冲突和不匹配。 预取指故障、存储器访问故障和其它地址/存储器相关的故障。 由于程序错误导致的异常,通常是使用一条无效指令,或都是非 法的状态转换。 7-10 11 保留 SVCall - 可编程 保留 执行 SVC 指令的系统服务调用。 3 硬故障 -1 6 用法故障 可编程
12 13 14 15 调试监视器 保留 PendSV SysTick 可编程 - 可编程 可编程 调试监视器(断点,数据观察点,或是外部调试请求) 系统服务的可触发(pendable)请求。 系统节拍定时器。 表 2.5 中断类型
编号 16 17 255 ? 类型 IRQ #0 IRQ #1 优先级 可编程 可编程 描述 外设中断 #0 外设中断 #1 … 外设中断 #239 IRQ #239 ? … 可编程
2.5.2 优先级
Cortex-M3 的异常功能非常强大,机制非常灵活,异常可以通过占先、末尾连锁和迟来等处理来降 低中断的延迟。优先级决定了处理器何时以及怎样处理异常。
Cortex-M3 支持 3 个固定的高优先级和多达 256 级的可编程优先级,并且支持 128 级抢占,绝大多 数芯片都会精简设计,实际中支持的优先级数会更少,如 8 级、16 级、32 级等,通常的做法是裁掉表 达优先级的几个低端有效位(防止优先级反转),以减少优先级的级数。比如 Luminary 的芯片采用 8 级优先级。
Cortex-M3 中 NVIC 支持由软件指定的可配置的优先级(称为软件优先级),其寄存器地址为: 0xE000_E400-0xE000_E4EF。通过对中断优先级寄存器的 8 位 PRI_N 区执行写操作,来将中断的优先级 指定为 0-255。硬件优级随着中断中的增加而降低。0 优先级最高,255 优先级最低。指定软件优先级 后,硬件优先级无效。例如:如果将 INTISR[0]指定为优先级 1,INTISR[31]指定为优先级 0,则 INTISR[0] 的优先级比 INTISR[31]低。 为了对具有大量中断的系统加强优先级控制,Cortex-M3 支持优先级分组,通过 NVIC 控制,设置 为占先优先级和次优先级。可通过对应用程序中断及复位控制寄存器(AIRCR,地址为:0xE000_ED00) 的[10:8]位进行设置。如果有多个激活异常共用相同的组优先级,则使用次优先级区来决定同组中的异 常优先级,这就是同组内的次优先级。如表 2.6 应用程序中断及复位控制寄存器,表 2.7 为占先优先级 和次优级的关系。
表 2.6 应用程序中断及复位控制寄存器(AIRCR,地址:0xE000ED00)
位段 [31:16] VECTKEY 名称 RW 类型 - 复位值 描述 访问钥匙:任何对该寄存器的写操作,都必须同时 把 0x05FA 写入此段,否则写操作被忽略。若读取 此半字,则读回值为 0xFA05。 15 [10:8] ENDIANESS PRIGROUP R R/W - 0 指示端设置。1:大端,0:小端。 优先级分组
2 SYSRESETREQ W - 请求芯片控制逻辑产生一次复位 清零所有异常的活动状态信息。通常只在调试时 用,或都在 OS 从错误中恢复时用。 0 VECTRESET W - 复位 Coretex-M3 微控制器内核。 1 VECTCLRACTIVE W -
表 2.7 抢占优先级和次优先级分组位置的关系
分组位置 0 1 2 3 4 5 6 7 表达抢占优先级的位段 [7:1] [7:2] [7:3] [7:4] [7:5] [7:6] [7:7] 无 表达亚优先的位段 [0:0] [1:0] [2:0] [3:0] [4:0] [5:0] [6:0] [7:0]所有位 注:表 2.7 显示了利用优先级的 8 个位来配置处理器优先级。如果使用小于 8 的位来配置处理
器的优先级,则寄存器的低位始终为 0,例如,如果使用 3 个位来配置优先级,则 PRI_N[7:5]用来配置 优先级,而 PRI_N[4:0]为 4‵b0000。
2.5.3 中断向量表
当发生了异常并且要响应它时,Cortex-M3 需要定位其服务例程的入口地址。这此入口地址存储在 所谓“异常向量表”中。缺省情况下,Cortex-M3 认为该表位于零地址处,且各向量占用 4 字节。因此 每个表项占用 4 字节,复位后的向量表如表 2.8 所列。
表 2.8 复位后向量表
地址 0x0000_0000 0x0000_0004 0x0000_0008 0x0000_000C 异常编号 - 1 2 3 MSP 的初始值 复位向量(PC 初始值) 值(32 位整数) NMI 服务例程的入口地址 硬 fault 服务例程的入口地址 … 其它异常服务例程的入口地址 … 向量表中的第 1 个字为指向堆栈栈顶的指针,复位时内核读取该地址的数据设置主堆栈。 向量表
的基地址可以通过 NVIC 中的向量偏移寄存器(0xE000ED08)来设置,如表 2.9 所示。从表 中可以看出,可以将异常向量表放在 Code 区也可以将其放在 RAM 区,起始地址也可改变,起始地址是 有要求的:必须先求出系统中共有多少个向量,再把这个数字向上记到 2 的整次幂,而起始地址必须对 齐到后者的边界上。例如,如果一共有 32 个中断,则共有 32+16(系统异常)=48 个向量,向上记到 2 的整数次幂后值为 64,因此向量表重定位的地址必须能被 64 X 4=256 整除。
表 2.9 向量偏移量寄存器(0xE000ED08)
位段 29 7-28 名称 TBLOFF TBLBASE 类型 R R/W 复位值 - 0 描述 向量表是在 Code 区(0),还是在 RAM 区(1) 向量表的起始地址 向量表中至少需要有 4 个值:栈顶地址;复位程序的位置;NMI 异常的位置;硬故障的异常的位置。
当中断使能时,不管向量表的位置在哪,它指向所有使能屏蔽的异常。并且如果使用 SVC 指令,还 需要指定 SVCCall ISR 的位置。
2.5.4 异常的进入与退出
1.异常进入
入栈:当处理器发生异常时,首先自动把 8 个寄存器(xPSR、PC、LR、R12、R3、R2、R1、R0)压 入栈,处理器自动完成,在自动入栈的过程中,把寄存器写入栈的时间顺序,并不是写入空间相对应的, 但机器会保证正确的寄存器被保存到正确的位置,如图 2.10 所示,假设入栈,栈地址为 N。
地址
N-8 N-4 N-32 N-28 N-24 N-20 N-16 N-12
数据
PC PSR R0 R1 R2 R3 R12 LR
时间
2.10 内部入栈示意图
取向量:发生异常,紧接着内核将根据向量表找出正确的异常向量,然后在服务程序的入口处预取 指,处理器将取指与取数据分别能过总线控制,使入栈与取指这两项工作能同时进行,以便快速进入中 断。
更新寄存器:入栈和取向量操作完成之后,在执行服务程序之前,还必须更新一系列寄存器。 SP:在入栈后会把堆栈指针(PSP或MSP)更新到新的位置。在执行服务例程时,将由MSP负责对堆 栈的访问。
PSR:更新IPSR位段(地处PSR的最低部分)的值为新响应的异常编号。 PC:在取向量完成后,PC将指向服务例程的入口地址, LR:在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”,在异常进 入时由系统计算并赋给LR,并在异常返回时使用它。 以上是在响应异常时通用寄存器及特殊功能寄
存器的变化。另外在NVIC中,也会更新若干个相关寄 存器。
2.异常退出
当异常服务程序最后一条指令将进入异常时的 LR 的值加载到 PC 中。该操作指示中断服务结束,在 从异常返回时处理器将执行下列操作之一:
如果激活异常的优先级比所有被压栈(等待处理)的异常的优先级都高,则处理器会末尾连锁到一 个激活异常。
如果没有激活异常,或者如果被压栈的异常的最高优先级比激活异常的最高优先级要高,则处理器 返回到上一个被压栈的中断服务程序。
如果没有激活的中断或被压栈的异常,则处理器返回线程模式。 在启动了中断返回序列后,下述的处理就将进行: 出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改
回先前的值。
更新NVIC寄存器:伴随着异常的返回,它的活动位也被硬件清除。对于外部中断,倘若中断输入再 次被置为有效,悬起位也将再次置位,新一次的中断响应序列也可随之再次开始。
异常返回值:异常返回值存放在LR中。这是一个高28位全为1的值,只有[3:0]的值有特殊含义,如 表2.10所示。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。因为LR的值是由 Cortex-M3自动设置的,所以只要没有特殊需求,就不要改动它。
表 2.10 EXC_RETURN 各位含义
位段 [31:4] 3 2 1 0
含义 EXC_RETURN的标识:必须全为1。 0=返回后进入处理器模 1=返回后进入线程模式。 0=从主堆栈中做出栈操作,返回后使用MSP 1=从进程堆栈中做出栈操作,返回使用 PSP。 保留,必须为0。 0=返回ARM状态 1=返回Thumb状态。Cortex-M3中必须为1。 因此,上述表格中EXC_RETURN的值有三种情况: 0xFFFF_FFF1:返回处理器模式;
0xFFFF_FFF9:返回线程模式,并使用主堆栈;
0xFFFF_FFFD:返回线程模式,并使用线程堆栈。 例如系统中使用了PendSV异常,服务程序结束时由处理模式返回到线程模式前使用进程堆栈,如 程序清单L2.3所示。
程序清单 L2.3 异常返回类型实例
OSPendSV
?? LDR LR,=0Xfffffffd BX LR
;异常服务程序
;返回到线程模式进程堆栈
2.5.5 Cortex-M3 异常处理机制
1.末尾连锁
末尾连锁能够在两个中断之间没有多余的状态保存和恢复指令的情况下实现异常背对背处理。如图 2.11 所示。在退出 ISR 并进入另一个中断时,处理器省略了 8 个寄存器的出栈和入栈操作。如果当前 挂起中断的优先级比所有被压栈的异常的优先级都高。则处理器执行末尾连锁机制。如果挂起中断的优 先级比被压栈的异常的最高优先级都高,则省略压栈和出栈操作,处理器立即取出挂起的中断向量。在 退出前一个 ISR 之后,开始执行被末尾连锁的 ISR。
用户程序
优先级 3 中断 1 压栈 优先级 2 中断 2
中断 1 中断 2 中断 1 结束
出栈
图 2.11 末尾连锁示意图
2.异常迟来
在 Cortex-M3 中迟来中断的意思是如果前一个 ISR 还没有进入执行阶段,并且迟来中断的优先级比 前一个中断的优先级要高,则迟来中断能够抢占前一个中断。如图 2.12 所示。
用户程序
优先级 3 中断 1 优先级 2 中断 2
中断 1 压栈 继续压栈 中断 2 出栈
图 2.12 迟来异常示意图
响应迟来中断时需执行新的取向量地址和 ISR 预取操作。迟来中断不保存状,因为状态保存已经被
最初的中断执行过了,因此不需要重复执行。
2.5.6 嵌套向量中断控制器
嵌套向量中断控制器,简称NVIC,完成对中断的响应。NVIC共支持1至240个外部中断输入(通常外 部中断写作IRQs)。具体的数值由芯片厂商在设计芯片时决定。
NVIC的访问地址是0xE000_E000。所有NVIC的中断控制/状态寄存器都只能在特权级下访问。不过有 一个例外软件触发中断寄存器可以在用户级下访问以产生软件中断。所有的中断控制、状态寄存器均可 按字、半字、字节的方式访问。
中断配置内容:
? 使能与禁止寄存器 ? 挂起与解挂寄存器 ? 优先级寄存器
? 活动状态寄存器 另外,下列寄存器也对中断
处理有重大影响: ? 异常掩蔽寄存器 ? 向量表偏移寄存器 ? 软件触发中断寄存器 ? 优先级分组寄存器 Cortex-M3 中异常及中断的行为如图 2.13 所示。分成三级,由 NVIC 负责管理。
第三级 中断挂起 NVIC_PEND 中断解挂 NVIC_CLRPEND 中断使能 NVIC_EN 中断禁止 NVIC_DIS 第二级 优先级设置 NVIC_PRI 第一级 激活位设置 NVIC_ACTIVE
外设中断源
PRIMASK
中断控制及状态 寄存器 NVIC_INT_CTRL 系统异常源 优先级设置 NVIC_SYS_PRI 内核 系统处理控制与状态 寄存器 NVIC_SYS_HAND_CTRL FLAUTMASK
图 2.13 异常和中断控制示意图
1.中断的使能与禁止
此处的中断使能与禁止,主要是针对片上外设 240 路中断的控制,使能是向 SETENA 寄存器对应位 写“1”,禁止是向 CLRENA 寄存器对应位写“1”。如表 2.11 所示。
表 2.11 SETENA/CLRENA 寄存器族
名称 类型 地址 复位值 描述 中断 0-31 的使能寄存,共 32 个使能位[n],中断 #n 使能(异常号 16+n) 中断 32-63 使能寄存器,共 32 个使能位 ? 中断 224-239 使能寄存器,16 个使能位 SETENA0 SETENA1 ? SETENA7 R/W R/W ? R/W 0xE000_E100 0xE000_E104 ? 0xE000_E11C 0 0 ? 0 CLRENA0 ? CLRENA7 R/W ? R/W 0xE000_E180 ? 0xE000_E19C 0 ? 0 0-31 禁止,共 32 个禁止位 ? 224-239 的禁止寄存器,共 16 个禁止
在 Luminary 系列的单片机中,片上外设中断对应编号如 2.12 表所示:
表 2.12 Luminary 单片机外设中断源
编号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 类型 IRQ #0 IRQ #1 IRQ #2 IRQ #3 IRQ #4 IRQ #5 IRQ #6 IRQ #7 IRQ #8 IRQ #9 IRQ #10 IRQ #11 IRQ #12 IRQ #13 IRQ #14 IRQ #15 IRQ #16 IRQ #17 IRQ #18 IRQ #19 IRQ #20 IRQ #21 IRQ #22 优先级 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 GPIOA GPIOB GPIOC GPIOD GPIOE UART0 UART1 SSI IC PWM_Fault PWM0 PWM1 PWM2 QEI ADC0 ADC1 ADC2 ADC3 Watchdog T0A T0B T1A T1B 2描述
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 IRQ #23 IRQ #24 IRQ #25 IRQ #26 IRQ #27 IRQ #28 IRQ #29 IRQ #30 IRQ #31 IRQ #32 IRQ #33 IRQ #34 IRQ #35 IRQ #36 IRQ #37 IRQ #38 IRQ #39 IRQ #40 IRQ #41 IRQ #42 IRQ #43 IRQ #44 IRQ #45 IRQ #46 IRQ #47 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 可编程 T2A T2B Analog_comparator0 Analog_comparator1 Analog_comparator2 System_Control FLASH_Control GPIOF GPIOG GPIOH UART2 SSI1 T3A T3B IC1 QEI1 CAN0 CAN1 CAN2 Ethernet Hibernate USB0 PWM3 uDMA Software Transfer uDMA Error 2这 8 个寄存器用于控制 240 外设中断的使能与禁止,向其中的对应位写入 1 可以使能相应的中断, 中断使能设置寄存器 0 的位 0 对应外部中断 0 号(GPIOA 中断),位 1 对应外部中断 1 号(GPIOB 中断), 依此类推,如表 3.2 所示。
例如使能外部中断 2 的操作,如程序清单 L2.3 所示。
程序清单 L2.3 使能外部中断
#define HWREG(x) #define NVIC_EN0
(*((volatile unsigned char *)(x))) 0xE000 E100
// IRQ0~IRQ31 中断使能设置寄存器 HWREG(NVIC_EN0)=1<<2; // 使能外部 2 号中断,即 GPIOC 中断
2.中断的挂起与解挂
当中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响应。此时中断
被挂起。中断的挂起状态可以通过“中断设置挂起寄存器(SETPEND)”和“中断解挂寄存器(CLRPEND)” 来读取,还可以写它们来手工挂起中断。 挂起寄存器和解挂寄存器也可以有8对,其用法与前面介绍的
使能、禁止能寄存器完全相同,见表2.13。
表 2.13 挂起与解挂寄存器
名称 类型 地址 复位值 描述 中断 0-31 的使能寄存,共 32 个使能位[n],中 断#n 使能(异常号 16+n) SETPEND1 ? SETPEND7 R/W ? R/W 0xE000_E204 ? 0xE000_E21C 0 ? 0 中断 32-63 使能寄存器,共 32 个挂起位 ? 中断 224-239 挂起寄存器,16 个挂起位 SETPEND0 R/W 0xE000_E200 0 CLRPEND0 ? CLRPEND7 R/W ? R/W 0xE000_E280 ? 0xE000_E29C 0 ? 0 0-31 解挂,共 32 个解挂位 ? 224-239 的解挂寄存器,共 16 个解挂
3.活动状态
每个外部中断都有一个活动状态位。在处理器执行了其ISR的第一条指令后,它的活动位就被置1,
并且直到ISR返回时才硬件清零。由于支持嵌套,允许高优先级异常抢占某个ISR。然而,哪怕中断被抢 占,其活动状态也依然为1(请仔细琢磨前文讲到的“直到ISR返回时才清零)。活动状态寄存器的定义, 与前面讲的使能、禁止和挂起、解挂寄存器相同,只是不再成对出现。它们也能按字、半字、字节访问, 但他们是只读的,如表2.14所示。
表 2.14 活动状态
名称 类型 地址 复位值 描述 中断 0-31 的活动状态寄存器,共 32 个状态位[n], 中断#n 活动状态(异常号 16+n) ACTIVE1 ? ACTIVE7 RO ? RO 0xE000_E304 ? 0xE000_E31C 0 ? 0 中断 32-63 的活状态寄存器,共 32 个状态位。 ? 中断 224-239 的活动状态寄存器,共 16 个状态位。 ACTIVE0 RO 0xE000_E300 0
4.优先级
使用优先级寄存器将 0 到 255 个优先级分别分配给各个中断。0 代表最高优先级,255 则代表最代
优先级。
优先级寄存器首先存放最高位。当优先级值为 3 位时,存放在字节的位[7:5]中。这也意味着某个 应用即使不知道可能含有多少个优先级也可以正常工作。
从 0xE000_E400 开始的地址里,每一个字节对应一个外部中断,例如:0xE000_E400 对应外部中断 GPIOA、这个字节可以设置 GPIOA 的中断优先级、0xE000_E401 对应外部中断 GPIOB、这个字节可以设置 GPIOB 的中断优先级,依次类推。如表 2.15 所示。
表 2.15 优先级表
名称 PRI_0 PRI_1 ? PRI_239 类型 R/W R/W ? R/W 地址 0xE000_E400 0xE000_E401 ? 0xE000_E4EF 复位值 0 0 ? 0 GPIOA,8 位 GPIOB,8 位 ? 外中断#239 的优先级 描述 系统部分异常也可以编程实验优先设置,如表 2.16 所示。
表 2.16 系统异常优先级寄存器 地址 0xE000_ED18 0xE000_ED19 0xE000_ED1A 0xE000_ED1B 0xE000_ED1C 0xE000_ED1D 0xE000_ED1E 0xE000_ED1F 0xE000_ED20 0xE000_ED21 0xE000_ED22 0xE000_ED23
名称 类型 复位值 描述 存储器管理 fault 的优先级 总线 fault 的优先级 用法 fault 的优先级 PRI_5 PRI_6 PRI_4 - - - - - - - - - - - - - - - - SVC 优先级 调试监视器的优先级 PRI_12 PRI_11 - - - - PendSV 的优先级 SysTick 的优先级 PRI_15 PRI_14
设置 Luminary 处理器外部中断优先级:外部 2 号中断>外部 12 号中断>外部 7 号中断>外部 4 号中 断,并且 4 号中断的优先级为最低,如程序清单 L2.4 所示。
程序清单 L2.4 设置外部中断优先级
#define #define #define #define #define
HWREGB(x) PRI2 PRI4 PRI7 PRI12
(*((volatile unsigned char *)(x))) 0xE000E402 0xE000E404 0xE000E407 0xE000E40C
// 2 号中断优先级设置寄存器 // 4 号中断优先级设置寄存器 // 7 号中断优先级设置寄存器 // 12 号中断优先级设置寄存器
// 最低优先级
HWREGB(PRI7)=6<<5; // 优先级比 4 号中断高 HWREGB(PRI12)=5<<5; // 优先级比 7 号中断高 HWREGB(PRI2)=4<<5; // 优先级比 12 号中断高 设置系统异常 PendSV 优先级为 7,如程序清单 L2.5 所示,用汇编实现。 HWREGB(PRI4)=7<<5;
程序清单 L2.5 系统异常优先设置(PendSV)
LDR LDR STR
R4, =0xE000ED22 R5, =0xFF R5, [R4]
; PendSV 的优先级寄存器
; 优先级最高三位为 b111,即为最低(8 位)
5.异常屏蔽寄存器 PRIMASK、FAULTMASK、BASEPRI
PRIMASK用于禁止在NMI和硬fault之外的所有异常,它有效地把当前优先级改为0(可编程优先级中 的最高优先级)。该寄存器可以通过MRS和MSR以下例方式访问:
①. 关中断 MOV R0, #1
MSR PRIMASK, R0
②. 开中断 MOV R0, #0
MSR PRIMASK, R0
此外,还可以通过CPS指令快速完成上述功能: CPSID i ;关中断 CPSIE i ;开中断
FAULTMASK更绝,它把当前优先级改为-1。这么一来,连硬fault都被掩蔽了。使用方案与PRIMASK 的相似。但要注意的是,FAULTMASK会在异常退出时自动清零。
BASEPRI 主要屏蔽优先级等于和低于某一个数值的异常。
6.其他异常的配置寄存器
用法fault,总线fault以及存储器管理fault都是特殊的异常,因此给它们开了小灶。其中,它们 的使能控制是通过“系统Handler控制及状态寄存器(SHCSR)”(地址:0xE000_ED24)来实现的。各种 faults的悬起状态和大多数系统异常的活动状态也都在该寄存器中,如表2.17所示。
表 2.17 系统异常控制及状态寄存器 SHCSR(地址:0xE000_ED24)
位段 18 17 16 名称 USGFAULTENA BUSFAULTENA MEMFAULTENA 类型 R/W R/W R/W 复位值 0 0 0 描述 用法 fault 服务例程使能位 总线 fault 服务例程使能位 存储器管理 fault 服务例程使能位 SVC 挂起中。本来已经要 SVC 服务例程,但是却 被更高优先级异常取代 14 BUSFAULTPENDED R/W 0 总线 fault 挂起中,细节同上 15 SVCALLPENDED R/W 0
13 12 11 10 9 8 7 6:4 3 2 1 0
MEMFAULTPENDED USGFAULTPENDED SYSTICKACT PENDSVACT - MONITORACT SVCALLACT - USGFAULTACT - BUSFAULTACT MEMFAULTACT R/W R/W R/W R/W 0 0 0 0 存储器管理 fault 挂起中,细节同上 用法 fault 挂起中,细节同上 SysTick 异常活动 PendSV 异常活动中 R/W R/W 0 0 Monitor 异常活动中 SVC 异常活动中 R/W 0 用法 fault 异常活动中 R/W R/W 0 0 总线 fault 异常活动中 存储器管理 fault 异常活动中 中断控制及状态寄存器ICSR(0xE000_ED04)。对于NMI、SysTick定时器以及PendSV,可以通过
此 寄存器手工悬起它们。另外,在该寄存器中,有好多位段都用于调试目的。在大多数情况下,它们对于 应用软件都没有什么用处,只有悬起位对应用程序常常比较有参考价值,如表2.18所示。
表 2.18 中断控制及状态寄存器 ICSR(地址:0xE000_ED04)
位段 31 28 27 26 25 23 22 21:12 名称 NMIPENDSET PENDSVSET PENDSVCLR PENDSTSET PENDSTCLR ISRPREEMPT ISRPENDING VECTPENDING 类型 R/W R/W W R/W W R R R 复位值 0 0 0 0 0 0 0 0 写 1 可挂起 NMI。 写 1 可挂起 PendSV。 写 1 可清除 PendSV。 写 1 可以挂起 SysTick。 写 1 可清除 SysTick 挂起状态 =1 表示一挂起中断将在下一步时进入活动状态 =1,当前正有外部中断被挂起(不包括 NMI) 挂起的 ISR 的编号。 如果异常返回后将回到基级,并且没有其他异常 挂起时,此位为 1。 9:0 VECTACTIVE R 0 当前活动的 ISR 编号。 描述 11 RETTOBASE R 0 中断控制与状态寄存器 31 位、28 位、26 位置位可分别挂起 NMI、PendSV、SysTick 中断,比如在
μ C/OS-II 操作系统中,任务切换实际就是去触发一次 PendSV 完成,如程序清单 L2.6 所示。
程序清单 L2.6 PendSV 实现异常
汇编实现方式: MOV R0, #0
;初值 R0=0
LDR R4,=0xE000ED04 ;中断控制及状态寄存器,第 28 位置 1 表示挂起 PendSV LDR R5,=0x10000000 ;第 28 位为 1 STR R5,[R4] PendSV
;PendSV 中断服务程序
MOV R0, #1 ; BX LR
或
C 语言实现方式: #define NVIC_INT_CTRL unsigned char i; void PendSV(void) { i=0; HWREG(NVIC_INT_CTRL)=1<<28; }
void PendSV_ISR(void) { i=1; }
0xE000 ED04 ;服务程序使 R0=1
7.软件中断
软件中断,包括手工产生的普通中断,能以多种方式产生。最简单的就是使能相应的SETPEND寄存 器;而更专业更快捷的作法,则是通过使用软件触发中断寄存器STIR,如表2.19所示。
表 2.19 软件触发中断寄存器 STIR(0xE000_EF00)
位段 名称 类型 复位值 描述 影响编号为 INTID 的外部中断,其挂起位被置位。 例如,写入 8,则挂 IRQ#8。 8:0 INTID W - 程序清单 L2.7 通过软件触发一次外部中断 GPIOC 口中断。
程序清单 L2.7 软件触发外部 2 号中断
#include
#define HWREG(x) (*((volatile unsigned long *)(x))) #define uchar unsigned char #define NVIC_EN0 uchar a=0;
void IRQ2_HandlerCode(void) {
a=1;
// 外部 2 号中断服务程序
0xE000E100
// 中断使能寄存器 SETENA/CLRENA // 软件触发中断寄存器 STIR #define NVIC_SW_TRIG 0xE000EF00
正在阅读:
ARM - Cortex-M3内核结构10-29
全抛釉瓷砖生产工艺流程详解 全抛釉瓷砖与抛光砖区别有哪些05-31
2019苏教版小学数学五年级上册第三单元《小数的意义和性质》测试卷209-12
UML习题及答案12-06
2018-2019年初中物理北师大版《第十四章 电磁现象》《七、直流电03-09
武平一中校友名单(2010~2012级)04-07
刘某某贩卖毒品、容留他人吸毒案04-12
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 内核
- 结构
- Cortex
- ARM