2022年CORTEXM知识点归纳总结_第1页
2022年CORTEXM知识点归纳总结_第2页
2022年CORTEXM知识点归纳总结_第3页
2022年CORTEXM知识点归纳总结_第4页
2022年CORTEXM知识点归纳总结_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学习资料收集于网络,仅供参考 Cortex-M4 内核学问点总结 余 明 学习资料 第 1 页,共 41 页学习资料收集于网络,仅供参考 目录 Cortex-M4 内核学问点总结 .1. 1 ARM 处理器简介 . 5. 2架构 . 6. 架构简介 . 6. 编程模型 . 6. 储备器系统 . 9. 复位和复位流程 .1.3 3指令集 .1.5. CM4 指令集特点 .1.5. Cortex-M 处理器间的指令集比较 汇编指令简要介绍 .1.5处理器内传送数据 .1.5 储备器拜望指令 .1.6 算数运算 .1.7 规律运算 .1.8 移位 .1.8. 反常相关指令 .1.8 4储备器系统 .

2、1.9. 4.1 储备器外设 .1.9 Bootloader .1.9. 位段操作 .2.0. 储备器大小端 .2.0 5反常和中断 .2.2. 中断简介 .2.2. 反常类型 .2.2. 中断治理 .2.3. 学习资料 第 2 页,共 41 页学习资料收集于网络,仅供参考 反常或中断屏蔽寄存器 .2.4 5.4.1 PRIMASK.2.4 5.4.2 FAULMASK(M0 中无) .2.4 5.4.3 BASEPR(I M0中无) .2.4中断状态及中断行为 .2.4 5.5.1 中断状态 .2.4 5.5.2 中断行为 .2.5 各 Cortex-M 处理器 NVIC 差异 .2.86

3、反常处理 .2.9. C 实现的反常处理 .2.9 栈帧 .2.9. EXC_RETURN .3.0. 反常流程 .3.1. 反常进入和压栈 反常返回和出栈 .3.1 .3.27 低功耗和系统把握特性 .3.3 7.1 低功耗模式 .3.3 7.1 SysTick 定时 器 .3.3 8 OS 支持特 性 .3.5. OS 支持特性简介 .3.5. SVC和 PendSV .3.5. 实际的上下文切换 学习资料 .3.6第 3 页,共 41 页学习资料收集于网络,仅供参考 学习资料 第 4 页,共 41 页学习资料收集于网络,仅供参考 1 ARM 处理器简介 ARM 处理器的种类许多,从手机上

4、的高端处理器芯片到面对微把握器的芯 片,都有 ARM 的身影;2022 年基于 ARM 处理器的芯片的出货量已经到达 这一章第一对 ARM 处理器有个简洁的明白; 79 亿; 在早期的时候, ARM 处理器使用后缀说明特性;例如 ARM7TDMI,T 表示支 持 Thumb指令, D表示 JTAG,M 表示快速乘法器, I 就表示嵌入式 ICE 模块; 近几年, ARM 转变处理器的命名方式,统一使用了 Cortex 处理器的名称; Cortex 处理器下分为三类: Cortex-A 系列:需要处理高端嵌入式系统等复杂应用的应用处理器 Cortex-R 系列:实时,高性能的处理器,面对较高端的

5、实时市场 Cortex-M 系列:面对微把握器和混合信号设计等小型应用, 留意低成本, 低功耗; 不同系列的处理器使用不同版本的架构 Cortex-A 系 列 Cortex-R 系 列 Cortex-M 系列 ARMv7-A 架 构 ARMv7-R 架 构 ARMv7-M,ARMv6-M 在 Cortex-M 系列中,进一步都处理器进行了划分 处理器 功能 架构 Cortex-M0,Cortex-M0+ 低功耗 ARMv6-M Cortex-M1 FPGA ARMv6-M Cortex-M3 微把握器 ARMv7-M Cortex-M4 增加 DSP ARMv7E-M 学习资料 第 5 页,共

6、 41 页学习资料收集于网络,仅供参考 2 架构 2.1 架构简介 Cortex-M3 和 Cortex-M4 处理器都是基于 ARMv7-M 架构;最初 ARMv-7M 架构是随着 Cortex-M3 处理器一同引进的,而在 Cortex-M4 发布时,架构中 又额外增加了新的指令和特性,改进后的架构有时也被称为 ARMv7E-M; 2.2 编程模型 操作模式和状态 Cortex-M4 处理器包括两种操作状态和模式,仍有两种拜望等级; 1. 操作状态 调试状态: 处理器被暂停后, 就会进入调试状态, 比如利用调试器触 发断点,单步执行等; Thumb 状态:处理器执行程序代码,它就是处在 T

7、humb 状态,由于 Cortex-M4 用的是 Thumb 指令,所以称为 Thumb 状态,并且在 Cortex-M 处理器中已经不支持 ARM 指令,也就不存在 ARM 状态; 2. 操作模式 处理模式: 执行中断服务程序等反常处理; 是具有特权拜望等级; 线程模式:执行一般的程序代码; 3. 拜望等级 在处理模式下, 处理器总 特权拜望等级:可以拜望处理器中的全部资源; 非特权拜望等级:有些储备器区域无法拜望,有些操作也无法使用; Thumb 状态 处理模式 启动 异 执处行理异模常式处理 异 调试大事 调试状态 常 执行反常处理 常 请 请 求 软件转 求 解除调试 (处理器停止 指

8、令执行) 线程模式 线程模式 (特权等级) (非特权等级) 换 学习资料 第 6 页,共 41 页学习资料收集于网络,仅供参考 拜望等级有特殊寄存器 CONTROL 把握;软件可将处理器从特权拜望等级换至非特权拜望等级,但反之无法直接转换,需要借助反常机制; 转 处理器的操作模式和状态可由图 模式下的 Thumb 状态; 2.2.2 寄存器 来表示,在上电后,默认处于特权线程 对于 ARM 架构来讲,处理储备器中的数据时,需将其从储备器加载到寄 存 器中,处理完毕后,如有必要,仍可以再写回储备器;这种方式被称作“加载 -储备架构” LOAD-STOR;E Cortex-M4 处理器的寄存器组中

9、有 和 3 个有特殊用途的寄存器; 1 通用寄存器 R0-R1216 个寄存器,其中包括 13 个通用寄存器 R0-R7 被称作低寄存器, 许多 16 位指令只能拜望低寄存器; R8-R12 称作高 寄 存器,可用 32 位指令和几个 16 位指令拜望; R0-R12 初始值未定义; 2 栈指针 R13R13 为栈指针,可通过 PUSH 和 POP 操作实现栈储备的拜望;栈指针包括个:主栈指针 MSP 和进程栈指针 PSP; MSP 为默认指针,复位后或处理模式 只能是 MSP,而 PSP 只能在线程模式使用;栈指针的选择 CONTROL 寄存器 有 控 制; MSP 和 PSP 的最低两位必

10、需 是 0,也就是栈指针的地址操作必需 4 字节对齐; R0 R1 R2 R3 R4 R5 R5 R6 R7 R8 R9通用寄存 R10器 R11R12 栈指针 链接寄存器 LR 程序计数器 PC R13( SP) R14 R15 3 链接寄存器( LR) R14学习资料 第 7 页,共 41 页学习资料收集于网络,仅供参考 用于函数或子程序调用时返回地址的储存 ,在反常中就用来储存进反常前状 态信息,包括系统模式,栈指针模式等;反常返回时参考 LR 中的信息返回到应状态; 相 4 程序计数器( PC) R15R15 为程序计数器,读操作返回当前地址加 2.2.3 特殊寄存器 特殊寄存器有三类

11、:程序状态寄存器,中断 寄存器; 4,写操作引起跳转; / 反常屏蔽寄存器,处理器把握 1程序状态寄存器 :应用 PSR( APSR),执行 PSR(EPSR),中断 PSR(IPSR); 三个寄存器可以单独拜望,也可以组合到一个寄存器中拜望; 31 N Z CV 26 23 20 GE0-3 16 ICI/IT 10 8ISR NUM 0Q ICI/IT T 在 APSR 中包含 N(负标志),Z(零标志), C(进位标志),V(溢出标Q(饱和标志)和 GE(大于或等于标志,只在 M4 中有); IPSR 中是中断号,只 读; EPSR 中,T 为表示 Thumb 状态,由于 M4 支持 T

12、humb 状态,不支持 ARM 态, T 位始终为 1;ICI 是中断连续指令位,储存的是中断被打断时的信 IT 指 息; 令时 IF-THEN 指令,用于条件执行; 2 PRIMASK, FAULTMAS,K和 BASEPR寄I 存器: 这三个寄存器只能在特权模 式下使用; PRIMASK可屏蔽除 NMI 和 HardFault 之外的全部反常; FAULTMASK可屏蔽 HardFault;BASEPR可I 以依据设置屏蔽低优先级的中 可把握 8 个或 16 断, 个中断,相应的改寄存器的宽度为 3 位或 4 位; 3 CONTROL 寄存 器 CONTROL寄存器主要有以下几项作用 :

13、线程模式下的拜望等级 指针的选择 当前代码是否使用了浮点单元 分别对应了寄存器的低三位 位 功能 nPRIV(第 0 位) 0 对应特权等级, 1 为非特权等级 SPSE(L第 1 位) 0 对应主栈指针, 1 为进程栈指针,处理模式下始终为 0; 学习资料 第 8 页,共 41 页学习资料收集于网络,仅供参考 FPCA(第 2 位) 0 未使用浮点, 1 使用了浮点 2.2.4 浮点寄存器 1 S0-S31 和 D0-D15 S0-S31 都为 32 位寄存器, 也可以 D0-D15 的方式成对拜望, 但 M4 不支持 双 精度浮点运算,只是可以传输双精度数据; 2 浮点状态和把握寄存器(

14、FPSCR) FPSCR两个功能 供应浮点运算结果的状态信息,如负标志,进位标志等; 定义一些浮点运算动作,如何舍入等 3 经过储备器映射的浮点单元把握寄存器( CPACR) 该寄存器经过了映射,也就是说需要通过通用寄存器加载进行设置,寄存器 的功能是可以设置浮点单元的拜望权限,拒绝拜望,特权拜望,全拜望; 2.3 储备器系统 储备器系统特性 4GB 线性地址空 间 架构定义的储备器映射; 4GB 的储备器空间被划分为多个区 域, 用于 预定义的储备器和外设; 支持大端和小端的储备器系统; 位段拜望; 写缓冲 储备器爱惜单元 MPU 非对齐传输支持 储备器映射 CORTEX-M处理器的 4GB

15、 地址空间被分为了多个储备器区域,如以下图;区 域依据各自典型用法进行划分,他们主要用于: 程序代码拜望(如 CODE 区 域) 学习资料 第 9 页,共 41 页学习资料收集于网络,仅供参考 数据拜望(如 SRAM 区 域) 外设(如外设区域) 系统 外部设备 1GB 外部 RAM 1GB 外设 SRAM CODE 某款芯片的储备器映射支配 学习资料 第 10 页,共 41 页学习资料收集于网络,仅供参考 PWM register GPIO register 0 x50F0_0000 0 x50D0_0000 Analog control ADC/TP/Analog Reg/1k sram

16、0 x50C0_0000 IO control 0 x50B0_0000 0 xFFFF_FFFF 7816 register 0 x5090_0000 Reserved SPI3 register 0 xF000_0000 SPI2 register 0 x5073_0000 0 xE000_0000 Private Peripheral Bus SPI1 register 0 x5072_0000 0 x5071_0000 SPI0 register 0 x5070_0000 Reserved Timer_2 register 0 x5062_0000 Timer_1 register 0

17、 x5061_0000 Timer_0 register 0 x5060_0000 APBBRG device WDT register 0 x5000_0000 0 x5050_0000 RTC register 0 x5040_0000 CRC register 0 x5030_0000 0 x4010_0000 FLASH CTRL 32KBy tes UART3 register 0 x5023_0000 0 x4000_0000 DMA UART2 register 0 x5022_0000 UART1 register Reserved 0 x5021_0000 UART0 reg

18、ister 0 x3000_0000 0 x5020_0000 0 x2000_0000 SRAM 8KBytes I2C_1 register 0 x5011_0000 I2C_0 register Reserved 0 x5010_0000 0 x60_0000 SCU clock Reset Pmu calendar FLASH MEMORY 0 x5000_0000 0 x0000_0000 128K+4K FLASH 一般 Code 放在 Flash 当中,数据放在 RAM 中;数据 RAM 存放有确定的顺 序,可以分为数据段, BSS 段,堆和栈区 域; 数据段,储备在内存的底部,

19、包含初始化的全局变量和静态变量; 学习资料 第 11 页,共 41 页学习资料收集于网络,仅供参考 BSS 段,未初始化的数据; 堆, C 函数自动支配储备器区域,例 alloc()和 malloc(); 如 栈,用于临时数据储备,局部变量,函数调用 储备器 栈(向下增 长) 堆堆(向向上上增增 长长) BSS 段 数据段 0 x20000000 2.3.3 栈储备 同几乎全部的处理器架构一样, Cortex-M 处理器在运行时需要栈储备和栈指 针 R13;ARM 处理器将系统主储备器用于栈空间操作,使用 PUSH 指令往栈中 储数据以及 POP 指令从栈中提取数据; 存 处理器使用的是满递减

20、的模型,栈指针是向下增长的;处理器启动后, SP 被设置为栈储备空间的最终的位置,也就是最低位置, 小,然后将数据压入栈中; POP 的时候相反,先将当 后再修改 SP,SP 此时增大;可用下面两幅图加以懂 得, PUSH 操 作 栈空间 寄存器 0 x12345678 PUSH 时,SP 指针第一 减 SP 所指的数据出栈,然 0 x99999999 R13SP 0 x12345678 R13SP 学习资料 第 12 页,共 41 页学习资料收集于网络,仅供参考 POP 操 作 栈空间 0 x99999999 R13SP R13SP 寄存器 0 x12345678 栈中主要用于: 储备局部变

21、量 反常产生时储存处理器状态( LR,xPSR)和寄存器数值 函数调用时 2.4 复位和复位流程 对于典型的 Cortex-M 处理器,复位类型有三种: 上电复位;复位微把握器中全部部分; 系统复位;只会复位处理器和外设,不包括处理的调试支持部件 处理器复位;只复位处理器; 在复位后以及处理器开头执行程序前,处理器会从储备器中读出头两个字 节;第一个字表示主栈指针的初始值; 其次个字代表复位处理起始地址的复位向 量;处理器读出这两个自己后,就会将这些数值赋给 MSP 和 PC; 读取复位向量 表示的地址 取第一条指令 读地址 读地址 0 x00000000 0 x00000004 复位 取 M

22、SP 初取复位向 始 量 值 时间 之前在栈储备时讲到过, Cortex-M 处理器的栈操作时基于满递减的,所以 S P 的初始值应当设置在栈顶的位置;例如,如储备器区域 0 x20007C0000 x200 为 07FFF( 1KB),初始的栈指针就应当为 0 x20008000; 另外,对于 Cortex-M 处理器, 向量表中向量地址的最低位应当为 1,以代表 他们为 Thumb 状态;对于下图中的例子,复位向量为 0 x101,而启动代码是从 0学习资料 第 13 页,共 41 页学习资料收集于网络,仅供参考 x100 开头的;在取出复位向量后; 行程序,并开头正常操作; Cortex

23、-M 处理器就可以从复位向量地址处执 其他储备器 0X20008000 第一个压栈顶 SP 初始值 0X20007FFC 其次个压栈顶 0X20007FF8 0X20000000 SRAM 起始地址 0X00000100 启动代码 复 0X00000004 其他反常向量 位 向 0X00000101 量 0X00000000 0X20008000 学习资料 第 14 页,共 41 页学习资料收集于网络,仅供参考 3 指令集 CORTEX-M4使用的是 Thumb-2指令集,不支持 ARM 指令集, Thumb 指令集 是 ARM 指令集的子集,但是 Thumb-2 技术已经不再支持 ARM 状

24、态; CORTEX-M处理器间的一个区分就是指令集特为了将回路面积降到最低, CORTEXM,0 CORTEXM0,+ CORTEXM1处理器只支持多 16 位指令和部分 32 位 指令, CORTEX-M3支持的 32位指令更多; CORTEX处理器支持剩下 SIMD(单 的 指令多数据)等 DSP 提升指令集可选的浮点指令; CM4 指令集特点 CM4 处理器使用 ARMv7-M 架构,指令集为 术,具有如下特点 16 位与 32 位混合指令 Thumb 指令集中的 Thumb-2 技 加载 / 储备指令集,不能直接操作储备器; 指令长度可变,使用 16/32 位由功能准备,优先使用 16

25、 位; DSP 指令, CM4 中为单精度, CM7 中可以双精度 Cortex-M 处理器间的指令集比较 Cortex-M 处理器的架构有三类, ARMv6-M,ARMv7-M, ARMv7E-M; ARMv6-M 内核 性能 M0/M0+/M1 一般数据处理, IO 把握人物 ARMv7-M M3 高级数据处理,硬件除法 ARMv7E-M M4 SIMD,快速 MAC 饱和运算 3.3 汇编指令简要介绍 3.3.1 处理器内传送数据 MOV 源寄存器处可以是马上数,马上数为 要使用 LDR 伪指令; 使用浮点单元时可以使用 VMOV 指令; 学习资料 8 位以下, 9-16 位用 MOVW

26、,32 位的需 第 15 页,共 41 页学习资料收集于网络,仅供参考 3.3.2 储备器拜望指令 拜望可分为读和写指令,另外依据读写的大小仍有其他的延长; 数据类型 加载(读) 储备(写) 8 位无符号 LDRB STRB 8 位有符号 LDRSB STRB 16 位无符号 LDRH STRH 16 位有符号 LDRSH STRH LDR STR 32 位 多个 32 位 LDM STM 64 位 LDRD STRD 栈操作 PUSH POP 介绍几个较为重要的 1 LDR/STR LDR Rd,Rn,#offset从储备器 Rn+offset 处读取字,读取到 Rd中 STR Rd,Rn,

27、#offset向储备器 Rn+offset 处储备字,数据来自 Rd; LDRR0,R1,#0X08从储备器 R1+0 x08 处读取字,放 R0 中 到 支持写回功能,加!即可,上面可以写成 LDRR0,R1,#0X08! 这样表示储备器位置的 R1 被更新为 R1+0 x08 2 LDM/STM 读/ 写多个字 上述命令是为了从储备器中读写多个字;一般会加后缀协作使用 LDMIA Rn, Rn 是储备器位置, reg list 是寄存器列表, 从 Rn 所指的储备器位置读取数放入寄存器中,每次读取完成后,地址就会自动加 据, 4;作用相当于 POP;另外要 留意的是,先读取的数据放置在低寄

28、存器中,后读取的数据放置到高寄存器; 学习资料 第 16 页,共 41 页学习资料收集于网络,仅供参考 LDMIA 操 作 栈空间 0 x88888888 R13SP 0 x99999999 R13SP 寄存器 R1 R13SP R0 STMIA Rn, Rn 是储备器位置,reg list 是寄存器列表 , 向 Rn 所指的储备器位置储备数每次储备前,地址自动减 4;相当于 PUSH 操作;另要留意的是,先储备高寄器的数据,后储备低寄存器的数据; 存 STMDB 操作 栈空间 寄存器 R1 未存 R1 时 R0 SP 0 x99999999 R13SP 0 x12345678 R13SP 同

29、样,这两个指令都可以通过! 表示写回操作, 更新寄存器所指的储备器位 置 3压栈与出栈 PUSH/POP PUSH 和 POP 和上面的 LDMIA 和 STMDB 是相同的; 3.3.3 算数运算 加: ADC 减: SUB 乘: MUL 除: DIV 学习资料 第 17 页,共 41 页学习资料收集于网络,仅供参考 对此不做详细介绍 3.3.4 规律运算 与: AND 或: ORR 位清除: BIC 按位异或: EOR 按位或非: ORN 3.3.5 移位 算数右移: ASR 规律左移: LSL 规律右移: LSR 循环右移: ROR 3.3.6 反常相关指令 之前说过, M4 可以有特权

30、模式和非特权模式,并且非特权模式不能直接转 换到特权模式,只能在反常中修改 CONTROL 寄存器;这里就可以通 SVC 指 来进入反常; 过 令 SVC # 这样就可以进入 SVC 中断中,然后修CONTROL寄存器;要留意的是,调 用 SVC 指令后,需尽快进入中断中,假如有其他高优先级的中断打断 SVC,就 了 会引起 HardFault; CPS 指令使用时需要带上后 :IE(中断使能),ID(中断禁止),仍需指定要 设置的中断屏蔽寄存器,如之前讲到的 缀 PRIMASK 和 FAULTMASK 指令 操作 CPSIE I 使能中断(清除 PRIMASK) CPSID I 禁止中断(设

31、置 PRIMASK) ,除 NMI 和 HardFaultCPSIE F 使能中断(清除 FAULTMAS)CPSID F 禁止中断(设置 FAULTMAS)K ,除 NMI 学习资料 第 18 页,共 41 页学习资料收集于网络,仅供参考 4 储备器系统 4.1 储备器外设 哈佛结构,程序储备器和数据储备器分开, 也就是指令和数据可以同时拜望; 1,在第一章中的储备器映射图中, 改区域一般也答应数据拜望;一般此处为 为代码段,主要用于程序代码, Flash; 在 keil 中,代码编译后,整个代码分为几部分: Code(代码), RO-data(只 读数据),RW-data,(初始化的可读写

32、变量大小) ,ZI-data(Zero Initialize)未初 始化的可读写变量大小 ,它会被自动初始化为 0;ZI-data 不会被算到代码里, 由于 它不会被初始化; 简洁来说呢就是在烧写的时候 Code+RO-data+RW-dat;FLASH 中的被占用的空间 为: 程序运行的时候,芯片内部 RAM 使用的空间为: RW-data+ZI-data 2,范畴内是 SRAM,主要用于连接 SRAM,其大都为片上 SRAM, 不过对储备器的类型没有什么限制; 如支持可选的位段特性, 就 SRAM 区域的一个 1MB 可位寻址,仍可以在这块区域中执行程序代码; 3,是外设区域,多用于片上外

33、设,和 SRAM 区域类似,也可以放程序代码,如支持可选的位段特性,就外设区域的第一个 1MB 是可选的; 4,空间为外部 RAM 空间 5,2G-3G 空间为设备空间,用于片外外设; 6,3G-4G 空间为系统空 间; Bootload er 芯片设计人员将 Bootloader 放入系统中的缘由是多方面的;例如: 供应 Flash 编程功能,这样就可以利用一个简洁的 UART 接口来编程 Flash,或者当程序运行时,在自己的应用程序中编程 Flash 储备器某些部分; 的 供应通信协议栈等额外的固件,可被软件开发人员通过 API 调 用; 供应芯片内置的自检功能( BIST) 比如在 1

34、601 中,供应一个 4K 的 info 区,和 128K 的 main 区, 4K 的 info 区就 是一个 bootloader,供应 SPI 下载功能,利用拨码开关可以设置从哪里启 动, mode=0 时从 info 区启动, mode=1 时从 main 区启动,并且 main 区分两部分, 软件可设置从低 64K 启动仍是从 64K 启动;这里设计储备重视映射的问题, 系 高 学习资料 第 19 页,共 41 页学习资料收集于网络,仅供参考 统启动时是从 0X00 开头的,不管是 Boot loader 仍是用户 flash,都得从 0 x00 开 始,然后 0 x04放的 res

35、et_handler的地址,mode=0,那 infor区就被映射到了 0 x00, mode=1,main 区就被映射到了 0 x00; 4.3 位段操作 对储备器中某一位操作是如何实现的呢?先来看看一般模式下, 写某一位: LDR R0,=0X200000000设 ; 置地址 LDR R1,R0 ;读数据 R1,#0X04 ;修改第 2 位 STR R1,R0 ;写回 读某一位: LDR R0,=0X200000000设 ; 置地址 LDR R1,R0 ;读数据 UBFX.W R,1 R1,#2,#1;提取第 2 位 这种操作无法保证原子性, 比如输出端口的第 0 位被主程序使用, 而第一

36、位 被中断使用,这样有可能显现数据冲突;位段操作模式下,这种现象可以防止, 由于位段操作是在硬件等级下修改的; 位段操作只在两个区域支持, SRAM 的第 1MB,外设区域的 1MB;每 1MB 会对应一个 32M 的区域,只需操作这 32M 的某个字,就能对应那 1MB 区域的 某一位;例如写 0 x22000008 为 1,就设置了 0 x20000000 第 3 位为 1;在指令上 也会更加简化; 位段写操作 LDR R0, =0X2200000设 ; 置 add MOV R1, #1 ;要写的数据 STR R1 ,R0 ;写 设置了位段操作模式,对应的 32MB 区域将不能再使用; 4

37、.4 储备器大小端 大小端指的是数据储备时的次序问题; 大端指的是高字节的数据放在低地址 中,低字节放在高地址中, 这种方式符合人类思维; 小端就是低字节放在低地址 中,高字节放在高地址中,这种方式更符合运算机思维; 学习资料 第 20 页,共 41 页学习资料收集于网络,仅供参考 例如将 0 x12345678 放到储备器 大端方式 0 x2000-0 x2003 地址 处 地址 0 x2003 0 x2002 0 x2001 0 x2000 数据 0 x78 0 x56 0 x34 0 x12 小端方式 地址 0 x2004 0 x2003 0 x2002 0 x2001 数据 0 x12

38、 0 x34 0 x56 0 x78 CM4 处理器同时支持小端和大端的储备器系统; CM 的微把握器大多是小端 的; 学习资料 第 21 页,共 41 页学习资料收集于网络,仅供参考 5 反常和中断 5.1 中断简介 全部的 CORTEX-M 处理器都会供应一个用于中断处理的嵌套向量中断把握 器,也就是 NVIC;中断也属于反常的一种,其他反常包括如错误反常和其他用 于 OS 支持的系统反常; M4 的 NVIC 支持最多 240 个 IRQ(中断请求),1 个不行屏蔽中断 NMI),1( 个 SysTick(系统节拍)定时中断及多个系统反常; 反常编号 反常类型 优先级 描述 1 复位 -

39、3 复位 2 NMI -2 不行屏蔽中断 3 硬件错误 -1 硬件错误 4 MemManage 错误 可编程 储备器治理错误 5 总线错误 可编程 总线错误 6 使用错误 可编程 程序错误 7-10 保留 11 SVC 可编程 请求治理调用 12 调试监控 可编程 调试监控 13 保留 14 PendSV 可编程 一般用于上下文切换 15 SYSTICK 可编程 系统节拍定时器 16 外部中断 #0 可编程 17 外部中断 #1 可编程 片上外设或外部中断源产生 255 外部中断 #239 可编程 除了前 3 个反常的优先级是固定的,其余反常都可以修改优先级; 5.2 反常类型 编号 1-15

40、 为系统反常, 16 及以上的就为中断输入; 学习资料 第 22 页,共 41 页学习资料收集于网络,仅供参考 5.3 中断治理 为了简化中断和反常治理, CMSIS-Core 供应了多个拜望函数; 函数 用法 VoidNVIC_EnableIRQ(IRQn_Type IRQ)VoidNVIC_DisableIRQ(IRQn_Type IRQ)Void NVIC_SetPriorityIRQn_Type IRQn,uint32_t priority Void _enable_irqvoid Void _disable_irqvoid Void NVIC_SetPriorityGroupingu

41、int32_t priorityGroup 使能外部中断 禁止外部中断 设置中断的优先级 清除 PRIMASK 使能中 断 设置 PRIMASK 禁止全部 中 断 设置优先级分组 复位后,全部中断都处于禁止状态,且默认的优先级为 0;在使用任何一个 中断之前需要 设置所需中断的优先级(可选) 使能外设中的可以触发中断的中断产生把握 使能 NVIC 中的中 断 在 M4 中,中断优先级共 8 位宽,但芯片厂商可进行设置,范畴是 3-8 位; 中断优先级分为两个部分,分组优先级(也叫抢占优先级)和子优先级;处理器 第一判定的是分组优先级,分组优先级高的会被第一处理,如分组优先级相同, 再比较子优先

42、级; 8 为宽的优先级如何支配抢占优先级和分组优先级,可由寄存 器设置;如下表 优先级分组 抢占优先级域 分组优先级域 0(默认) Bit7:1 Bit0 1Bit7:2 Bit1:0 2Bit7:3 Bit2:0 3Bit7:4 Bit3:0 4Bit7:5 Bit4:0 5Bit7:6 Bit5:0 6Bit7 Bit6:0 7无 Bit7:0 学习资料 第 23 页,共 41 页学习资料收集于网络,仅供参考 这里要留意的是, 反常编号和优先级并不是一个意思, 反常编号仅仅是一个 编号,就像是枚举一样, 而优先级就是需要手动的进行设置的; 只有在分组优先 级和子优先级完全一样时,反常编号才

43、起作用,编号越小优先级越高; 另外,在 M4 内核中,仍供应了中断向量重定位功能;向量表重定位功能提 供了一个名为向量表偏移寄存器 ( VTOR)的可编程寄存器; 前面提到的 Bootloder就可以使用此项功能来完成; 5.4 反常或中断屏蔽寄存器 PRIMASKPRIMASK 用于禁止除 NMI 和 HardFault 外的全部反常,只能在特权状态拜如: 访 CPSIE I清; 除 PRIMASK(使能中 断) CPSID 设 I; 置 PRIMASK(禁止中断) FAULMASK ( M0 中无) FAULMASK 用于禁止除 NMI 外的全部反常,只能在特权拜望,如: CPSIE F清

44、; 除 FAULMASK COSID F设; 置 FAULMASK 5.4.3 BASEPR(IM0 中无) BASEPR可I 禁止优先级低于某特定等级的中断,只能在特权状态拜望,如: _set_BASEPRI0X60;禁/ 止优先级在 0 x60-0 xFF间的中断 _set_BASEPRI0X0; 取 / 消 BASEPR屏I 蔽 5.5 中断状态及中断行为 5.5.1 中断状态 中断状态: inactive, pending, active,active and pending 中断状态之间的转换: 学习资料 第 24 页,共 41 页学习资料收集于网络,仅供参考 Inactive Pe

45、nding Active andPending Active Inactive(非活跃):没有挂起或激活的状态 Pending(挂起):反常已经被触发但是处理仍未处理; 比如当前中断被触发, 但是有高优先级或同等优先级的中断正在执行,或是中断使能被禁止; Active(活跃):中断正在被处理 Active and pending(活跃并挂起) 反常被处理时,同一个反常再次被触发; 上述反常对应的是每一个反常状态,不是整体的反常; 5.5.2 中断行为 每个中断都有多个属性: 每个中断都可以被禁止或使能 每个中断都可以被挂起或解除挂起 每个中断都可以处于活跃或非活跃状态 这样中断就会产生多种行为

46、,先来看一下最简洁的中断下中断状态的转换 学习资料 第 25 页,共 41 页学习资料收集于网络,仅供参考 中断请求 处理器开头处理中断请求后,中断请求被清除 中断挂起状态 处理器模式 进入中断处理 中断活跃状态 进入中断处理后活跃状态被置位 中断的挂起状态是可以手动设置的,有一个寄存器是中断挂起状态寄存器, 例如上下文切换的 PendSV 反常,就是手动设 PendSV 挂起,然后进入了 反常中;同样,挂起状态是可以清除的;如中断请求产生时,处理器正在处理更 置 PendSV 高优先级的请求, 然后在处理器对该中断请求作出相应之前, 挂起状态被清除掉 了,那么该中断请求也就不会被处理了; 中

47、断请求 中断挂起状态 挂起状态被软件清除 处理器模式 但是,假如外设保持某中断为请求状态,那样即使软件清除掉挂起状态,挂 起状态仍会再次置位; 中断请求 中断挂起状态 处理器模式 中断处理完成后,假如中断请求仍在连续保持,中断就再次进入挂起状态, 再次得到处理器的服务 学习资料 第 26 页,共 41 页学习资料收集于网络,仅供参考 中断请求保持活跃 中断请求 中断挂起状态 中断活跃状态 再次进入中断 处理器模式 对于脉冲中断请求, 如在处理器开头处理前, 被当做一次请求 中断请求 中断挂起状态 中断活跃状态 处理器模式 中断请求产生了多次, 它只会 中断的挂起状态可以在其正在被处理时再次置位

48、,也就是之前所说的 and pend 状态;中断处理完成后会再次处理该中断; active 再次产生中断请求 中断请求 中断再次挂起 中断挂起状态 中断活跃状态 再次进入中断 处理器模式 另外有一种情形需要留意, 即使禁止了某中断, 中断的挂起状态仍然可以使 用,只是无法转化为活跃状态,并且,假如中断被使能后,如没有高优先级中断 在执行, 挂起状态就会被转换为活跃状态, 进而进入中断处理, 假如不期望此类 状况发生,那应当在中断使能之前清除掉中断挂起状态; 学习资料 第 27 页,共 41 页学习资料收集于网络,仅供参考 5.6 各 Cortex-M 处理器 NVIC 差异 Cortex-M

49、处理器的中断治理有确定区分 中断数量 CM0 CM0+ CM1 CM3 CM4 1-32 1-32 1/8/16/32 1-240 1-240 NMI Y Y Y Y Y 优先级宽度 2223-8 3-8 寄存器拜望 字 字 字 字,半字,字 字,半字,字 PRIMASK Y Y Y 节 节 Y Y FAULTMASK NNNY Y BASEPRI NNNY Y 向量表偏移 NY(可选) NY Y 寄存器 动态修改优 NNNY Y 先级 中断活跃状 NNNY Y 态 错误处理 硬件错误 硬件错误 硬件错误 硬件错误 +3 个 硬件错误 +3 个 调试监控异 NNN其他错误反常 其他错误反常 Y

50、 Y 常 学习资料 第 28 页,共 41 页学习资料收集于网络,仅供参考 6 反常处理 6.1 C 实现的反常处理 C 函数在 ARM 架构上是如何工作的,用 ARM 架构的 C 编译器遵循 的一个名为 AAPCS 的规范; 依据这份标准, C 函数可以修改 R0-R3,R12,ARM R14LR 以及 PSR;如 C 函数需要使用 R4-R11,就应当将这些寄存器储存到栈空间中,并且在函数终止前将他们复原; R0-R3,R12, R14,PSR 被称作“调用者储存寄存器” ; R4-R11 为“被调用者储存寄存器” ; 一般来说,函数调用将 R0-R3 作为输入参数, R0 就用作返回结果

51、;如返 值为 64 位, R1 也会用于返回结果; 反常机制需要在反常入口处自动储存 R0-R3, R12,R14,PSR,反常退出时 将其复原,这些都要由处理器硬件把握;另外,与一般的 C 函数调用不同,返 地址 PC 并没有储备 LR 中,进入反常时 LR 储备的是 EXC_RETUR,N反常返回 在 将会用到;因此,反常流程也需要将 返回地址 储存,所以,不算浮点单元,反常 时 处理期间储存的寄存器为 8 个;对于带浮点单元的 Cortex-M4 处理器,反常机制 仍会储存 S0-S15 以 FPSCR; 及 C 函 数 第一个参数 R0R0返回 其次个参数 R1结果 R1R2 第三个参

52、数 R2第四个参数 R3R3在函数调用 R4R4R5R5R5 R5R6R6R7R7被调用者 R8后会被修改 R8的寄存器 R9R9储存寄存 R10R10器 R11R11R12 R12 栈指针 R13( SP) R13(SP) 链接寄存器 LR R14 R14R15 程序计数器 PC R15 浮点单元 PSR PSR S0-S15 S0-S15被调用者储存寄存器 S16-S31S16-S31 FPSCR FPSCR 6.2 栈帧 学习资料 第 29 页,共 41 页学习资料收集于网络,仅供参考 在反常入口处被压入栈空间的数据块为栈帧;不具有浮点单元的 M4 处理 器,栈帧是 8 个字大小;带浮点

53、的栈帧可能是 8 个或 26 个字大小;与上一个小 节中所说的反常处理期间储存的寄存器为 8 个是一个意思; AAPCS 要求栈指针的数值在函数入口和出口处应是双字对齐 双字栈对齐 特性可编程, 该特性可以关闭; M0 中不行设置; 压栈的 xPSR 的第 9 位表示栈指 针的数值是否调整过, 0 未调整, 1 调整过,也就是会自动插入一个字的空间; 所以,栈帧最大为 9 或 27 个字; EXC_RETURN 小节中说到过,处理器进入反常时, 明一下, EXC_RETUR的 N详细细节; LR 储备的是 EXC_RETUR,N 这里 说 EXC_RETUR是 N一个字大小,位域表示如下 数值

54、 0 xF 0Xefffff 1:8 字 0:26 字 1:返回线程模式 位 描述 31:28 EXC_RETURN指示 27:5 保留 全为 1 4栈帧类型 M0 中无 3返回模式 0:返回处理模式 2返回栈 1:返回线程栈 0:返回主栈 1保留 0浮点使用 FPCA=0 0保留 1EXC_RETUR的 N合法浮点未使用 FPCA=1 值 返回处理模式,总使用主栈 0XFFFFFFE1 0XFFFFFFF1 返回线程模式,返回后使用主栈 0XFFFFFFE9 0XFFFFFFF1 返回线程模式,返回后使用进程栈 0XFFFFFFED 0XFFFFFFFD asm void vPortSVCH

55、andler void PRESERVE8 学习资料 第 30 页,共 41 页学习资料收集于网络,仅供参考 ldr r3, =pxCurrentTCB /* Restore the context. */ ldr r1, r3 ldr r0, r1 ldmia r0., r4-r11 msr psp, r0 /* Restore the task stack pointer. */ isb mov r0, #0 msr basepri, r0 orr r14, #0 xd /* 或上 0b1101,返回线程栈,线程模式 */ bx r14 6.4 反常流程 6.4.1 反常进入和压栈 当反常

56、产生且被处理器接受时,压栈流程会将寄存器压入栈中并组织栈帧; 要留意的是,压栈期间的栈拜望次序和栈帧中的次序不同,第一压栈的是 xPSR,这样在取向量时会尽快更新 PC; PC 和 这里再复习一下主栈与进程栈的使用, 在处理模式, 必需使用主栈, 在进程 模式,由 CONTROL寄存器把握使用主栈仍是进程; 在处理器处于进程模式并且使用进程栈时, 压栈操作使用进程栈, 然后就进 入了处理模式,直到反常返回之前,始终使用的是主栈,如反常嵌套的情形,在 一个反常中又进入了另一个反常,仍然使用的是主栈进行压栈; 另外,我们在使用 OS 的时候会有两个栈空间,系统栈空间和任务栈空系统栈空间是在启动文件

57、中进行了设置,如图 间, 6-1,这个栈空间是留给反常使用 的,也就是处理模式下的 MSP;而在创建任务的时候都会有对栈空间的设置, 我 们称为任务栈空间,也就是在线程模式下的 PSP; 学习资料 第 31 页,共 41 页学习资料收集于网络,仅供参考 进入反常时,会将 R0-R3,R12, LR 和返回地址(带浮点单元时包 S0-S15 和 FPSCR)硬件自动压栈储存,其他的 R4-R11需要软件储存; 6.4.2 反常返回和出栈 出栈时就是对 EXC_RETUR数 N值的判定,也就 EXC_RETURN中位域所表示 的那几项, 用什么栈进行压栈的仍返回什么栈, 操作模式和栈帧类型也类似;

58、 出 是 栈操作终止时, 仍要检查 xPSR 的第 9 位,如置 1 就去除压栈时插入的额外空间; 对于栈空间中的数据,同入栈一样, R0-R3,R12,和 LR(带浮点单元时包 括 S0-S15 和 FPSCR)是自动出栈的,其余的需要软件出栈; 学习资料 第 32 页,共 41 页学习资料收集于网络,仅供参考 7 低功耗和系统把握特性 7.1 低功耗模式 CORTEX-M系列处理器供应两种休眠模式:休眠模式和深度休眠模式;由系 统把握寄存器 SCR 把握; 处理器供应了两个用于进入休眠模式的指令: WFI,进入休眠模式,等待中 断,可由中断,调试,复位唤醒; WFE:等待大事,条件进入休眠

59、模式;内部事 件寄存器为 0,进入休眠,否就内部大事寄存器被清除,处理器连续执行,除了 中断,调试,复位唤醒外,仍能由大事唤醒; WFE 中的大事唤醒包括大事输入信号脉冲 RXEV);该信号属于大事通信接口特性的一部分;处理器仍存在一个名为 ( TXEV(发送大事)的输出信号,当执 行 SEV(发送大事)指令时, TXEV 会输出一个周期的脉冲信号; 大事通信接口的主要设计目标位, 在一个特定大事发生前让处理器始终处于 休眠模式;例如: 答应外设和处理器之间的通信 答应多个处理器间的通信 SysTick 定时器 Cortex-M 处理器内集成了一个小型的名为 Systick 的定时器, 它属于

60、 NVIC一部分,可以产生 Systick 反常; Systick 为简洁的向下计数 24 位计数器; 的 Systick 的主要作用是用于 OS 中任务治理和上下文切换,处理器可以在在 不 同时间片内处理不同任务; 设计这个定时器的目的是为了增加软件的可移植性; 全部 CORTEX-M 系列芯片都有相同的定时器;定时器的时钟可以是处理器时钟或者是外部参考时钟 的 STCLK;定时器的使用很简洁,只有四个寄存器 地址 寄存器 作用 0XE000E010 Systick 把握和状态寄存使能以及设置 Systick 0XE000E014 器 Systick 重装载值寄存Systick 计时周0XE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论