CORTEX-M4知识点总结_第1页
CORTEX-M4知识点总结_第2页
CORTEX-M4知识点总结_第3页
CORTEX-M4知识点总结_第4页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、Cortex-M4内核知识点总结余明目录Cortex-M4 内核知识点总结 .11 ARM 处理器简介 .42 架构 .52.1架构简介 .52.2编程模型 .52.3存储器系统 .82.4复位和复位流程 .113 指令集 .133.1 CM4 指令集特点 .133.2Cortex-M 处理器间的指令集比较 .133.3汇编指令简要介绍 .133.3.1处理器内传送数据 .133.3.2存储器访问指令 .143.3.3算数运算 .153.3.4逻辑运算 .163.3.5移位 .163.3.6异常相关指令 .164 存储器系统 .174.1存储器外设 .174.2Bootloader .174.

2、3位段操作 .184.4存储器大小端 .185 异常和中断 .205.1中断简介 .205.2 异常类型 .205.3中断管理 .215.4异常或中断屏蔽寄存器 .225.4.1 PRIMASK .225.4.2 FAULMASK (M0 中无) .225.4.3 BASEPRI (M0 中无) .225.5中断状态及中断行为 .225.5.1中断状态 .225.5.2中断行为 .235.6各 Cortex-M 处理器 NVIC 差异 .256 异常处理 .276.1C 实现的异常处理 .276.2栈帧 .276.3 EXC_RETURN .286.4 异常流程 .296.4.1异常进入和压栈

3、 .296.4.2异常返回和出栈 .307 低功耗和系统控制特性 .317.1低功耗模式 .317.1SysTick 定时器 .318 OS 支持特性.338.1 OS 支持特性简介338.2 SVC 和 PendSV338.3 实际的上下文切换341 ARM 处理器简介ARM 处理器的种类很多,从手机上的高端处理器芯片到面向微控制器的芯片,都有 ARM 的身影。 2011 年基于 ARM 处理器的芯片的出货量已经到达 79 亿。这一章首先对 ARM 处理器有个简单的了解。在早期的时候, ARM 处理器使用后缀表明特性。例如 ARM7TDMI ,T 表示支持 Thumb 指令, D 表示 JT

4、AG ,M 表示快速乘法器, I 则表示嵌入式 ICE 模块。近几年, ARM 改变处理器的命名方式,统一使用了Cortex 处理器的名称。Cortex 处理器下分为三类:· Cortex-A 系列:需要处理高端嵌入式系统等复杂应用的应用处理器· Cortex-R 系列:实时、高性能的处理器,面向较高端的实时市场· Cortex-M 系列:面向微控制器和混合信号设计等小型应用, 注重低成本、低功耗。不同系列的处理器使用不同版本的架构Cortex-A 系列ARMv7-A 架构Cortex-R 系列ARMv7-R 架构Cortex-M 系列ARMv7-M 、ARMv6

5、-M在 Cortex-M 系列中,进一步都处理器进行了划分处理器功能架构Cortex-M0 、低功耗ARMv6-MCortex-M0+Cortex-M1FPGAARMv6-MCortex-M3微控制器ARMv7-MCortex-M4增加DSPARMv7E-M2 架构2.1 架构简介Cortex-M3 和 Cortex-M4 处理器都是基于 ARMv7-M 架构。最初 ARMv-7M 架构是随着 Cortex-M3 处理器一同引进的, 而在 Cortex-M4 发布时,架构中又额外增加了新的指令和特性,改进后的架构有时也被称为ARMv7E-M 。2.2 编程模型操作模式和状态Cortex-M4

6、处理器包括两种操作状态和模式,还有两种访问等级。1. 操作状态·调试状态:处理器被暂停后, 就会进入调试状态, 比如利用调试器触发断点,单步执行等。·Thumb 状态:处理器执行程序代码,它就是处在Thumb 状态,因为Cortex-M4 用的是 Thumb 指令,所以称为Thumb 状态,并且在Cortex-M 处理器中已经不支持ARM 指令,也就不存在ARM 状态。2. 操作模式·处理模式:执行中断服务程序等异常处理。 在处理模式下, 处理器总是具有特权访问等级。· 线程模式:执行普通的程序代码。3. 访问等级· 特权访问等级:可以访问处理

7、器中的所有资源。· 非特权访问等级:有些存储器区域无法访问,有些操作也无法使用。Thumb 状态处理模式异处理模式异调试事件执行异常处理常执行异常处理常请请调试状态求求(处理器停止启动线程模式指令执行)线程模式解除调试(特权等级)软件转(非特权等级)换访问等级有特殊寄存器 CONTROL 控制。软件可将处理器从特权访问等级转换至非特权访问等级,但反之无法直接转换,需要借助异常机制。处理器的操作模式和状态可由图 1.1 来表示,在上电后,默认处于特权线程模式下的 Thumb 状态。寄存器对于 ARM 架构来讲,处理存储器中的数据时,需将其从存储器加载到寄存器中,处理完毕后,若有必要,还

8、可以再写回存储器。这种方式被称作“加载 -存储架构”(LOAD-STORE) 。Cortex-M4 处理器的寄存器组中有16 个寄存器,其中包括 13 个通用寄存器和 3 个有特殊用途的寄存器。1 通用寄存器 R0-R12R0-R7 被称作低寄存器,许多 16 位指令只能访问低寄存器。 R8-R12 称作高寄存器,可用 32 位指令和几个 16 位指令访问。 R0-R12 初始值未定义。2 栈指针 R13R13 为栈指针,可通过 PUSH 和 POP 操作实现栈存储的访问。栈指针包括两个:主栈指针 MSP 和进程栈指针 PSP 。MSP 为默认指针,复位后或处理模式时只能是 MSP ,而 PS

9、P 只能在线程模式使用。栈指针的选择有 CONTROL 寄存器控制。MSP 和 PSP 的最低两位必须是 0,也就是栈指针的地址操作必须 4 字节对齐。R0R1R2R3R4R5R5R6R7R8R9通用寄存R10器R11R12栈指针R13( SP)链接寄存器 LRR14程序计数器 PCR153 链接寄存器( LR )R14用于函数或子程序调用时返回地址的保存,在异常中则用来保存进异常前状态信息,包括系统模式、栈指针模式等。异常返回时参考LR 中的信息返回到相应状态。4 程序计数器( PC )R15R15 为程序计数器,读操作返回当前地址加4,写操作引起跳转。特殊寄存器特殊寄存器有三类:程序状态寄

10、存器、中断 /异常屏蔽寄存器、处理器控制寄存器。1 程序状态寄存器 :应用 PSR ( APSR )、执行 PSR (EPSR )、中断 PSR( IPSR )。三个寄存器可以单独访问,也可以组合到一个寄存器中访问。31262320161080N ZC V Q ICI/ITTGE0-3ICI/ITISR NUM在 APSR 中包含 N(负标志)、Z(零标志)、C(进位标志)、V(溢出标志)、Q(饱和标志)和GE (大于或等于标志,只在M4 中有)。IPSR 中是中断号,只读。EPSR 中,T 为表示 Thumb 状态,由于 M4 支持 Thumb 状态,不支持 ARM 状态,T 位始终为 1。

11、ICI 是中断继续指令位, 保存的是中断被打断时的信息。 IT 指令时 IF-THEN 指令,用于条件执行。2 PRIMASK 、FAULTMASK 、和 BASEPRI 寄存器: 这三个寄存器只能在特权模式下使用。 PRIMASK 可屏蔽除 NMI 和 HardFault 之外的所有异常。FAULTMASK 还可屏蔽 HardFault 。BASEPRI 可以根据设置屏蔽低优先级的中断,可控制 8 个或 16 个中断,相应的改寄存器的宽度为3 位或 4 位。3 CONTROL 寄存器CONTROL 寄存器主要有以下几项作用:· 线程模式下的访问等级· 指针的选择·

12、; 当前代码是否使用了浮点单元分别对应了寄存器的低三位位功能nPRIV (第0 位)0 对应特权等级,1 为非特权等级SPSEL(第1 位)0 对应主栈指针,1 为进程栈指针,处理模式下始终为0。FPCA (第2 位)0 未使用浮点,1 使用了浮点浮点寄存器1 S0-S31 和 D0-D15S0-S31 都为 32 位寄存器,也可以 D0-D15 的方式成对访问, 但 M4 不支持双精度浮点运算,只是可以传输双精度数据。2 浮点状态和控制寄存器(FPSCR )FPSCR 两个功能· 提供浮点运算结果的状态信息,如负标志、进位标志等。· 定义一些浮点运算动作,如何舍入等3 经

13、过存储器映射的浮点单元控制寄存器(CPACR )该寄存器经过了映射,也就是说需要通过通用寄存器加载进行设置,寄存器的功能是可以设置浮点单元的访问权限,拒绝访问、特权访问,全访问。2.3 存储器系统存储器系统特性· 4GB 线性地址空间· 架构定义的存储器映射。 4GB 的存储器空间被划分为多个区域,用于预定义的存储器和外设。· 支持大端和小端的存储器系统。· 位段访问。· 写缓冲· 存储器保护单元 MPU· 非对齐传输支持存储器映射CORTEX-M 处理器的 4GB 地址空间被分为了多个存储器区域,如图所示。区域根据各自典型

14、用法进行划分,他们主要用于:· 程序代码访问(如CODE 区域)· 数据访问(如 SRAM 区域)· 外设(如外设区域)系统 0.5GB外部设备1GB外部 RAM 1GB外设 0.5GBSRAM 0.5GBCODE 0.5GB某款芯片的存储器映射分配0xFFFF_FFFF0xF000_00000xE000_00000x5000_00000x4010_00000x4000_00000x3000_00000x2000_00000x60_00000x0000_0000ReservedPrivate Peripheral BusReservedAPBBRG deviceF

15、LASH CTRL32KByDMAtesReservedSRAM8KBytesReservedFLASH MEMORY128K+4K FLASHPWM register0x50F0_0000GPIO register0x50D0_0000Analog control(ADC/TP/AnalogReg/1k sram)0x50C0_0000IO control0x50B0_00007816 register0x5090_0000SPI3 register0x5073_0000SPI2 register0x5072_0000SPI1 register0x5071_0000SPI0 register

16、0x5070_0000Timer_2 register0x5062_0000Timer_1 register0x5061_0000Timer_0 register0x5060_0000WDT register0x5050_0000RTC register0x5040_0000CRC register0x5030_0000UART3 register0x5023_0000UART2 register0x5022_0000UART1 register0x5021_0000UART0 register0x5020_0000I2C_1 register0x5011_0000I2C_0 register

17、0x5010_0000SCU(clockResetPmucalendar)0x5000_0000一般 Code 放在 Flash 当中,数据放在 RAM 中。数据在 RAM 存放有一定的顺序,可以分为数据段,BSS 段、堆和栈区域。· 数据段,存储在内存的底部,包含初始化的全局变量和静态变量。· BSS 段,未初始化的数据。· 堆, C 函数自动分配存储器区域,例如alloc ()和 malloc ()。· 栈,用于临时数据存储,局部变量,函数调用存储器栈(向下增长)堆(向上增堆(向上增长)长)BSS段数据段0x20000000栈存储同几乎所有的处理器架

18、构一样,Cortex-M 处理器在运行时需要栈存储和栈指针 R13 。ARM中存储数据以及处理器将系统主存储器用于栈空间操作,使用POP 指令从栈中提取数据。PUSH指令往栈处理器使用的是满递减的模型,栈指针是向下增长的。处理器启动后, SP 被设置为栈存储空间的最后的位置,也就是最低位置, PUSH 时, SP 指针首先减小,然后将数据压入栈中。 POP 的时候相反,先将当前 SP 所指的数据出栈,然后再修改 SP ,SP 此时增大。可用下面两幅图加以理解,PUSH操作栈空间寄存器0x123456780x99999999R13(SP)0x12345678R13(SP)POP操作栈空间0x99

19、999999R13(SP)R13(SP)寄存器0x12345678栈中主要用于:· 存储局部变量· 异常产生时保存处理器状态(LR 、xPSR )和寄存器数值· 函数调用时2.4 复位和复位流程对于典型的 Cortex-M 处理器,复位类型有三种:· 上电复位。复位微控制器中所有部分。· 系统复位。只会复位处理器和外设,不包括处理的调试支持部件· 处理器复位。只复位处理器。在复位后以及处理器开始执行程序前,处理器会从存储器中读出头两个字节。第一个字表示主栈指针的初始值。第二个字代表复位处理起始地址的复位向量。处理器读出这两个自己后,就

20、会将这些数值赋给MSP 和 PC。读地址读地址读取复位向量0x000000000x00000004表示的地址复位取MSP初始取复位向取第一条指令值量时间之前在栈存储时讲到过, Cortex-M 处理器的栈操作时基于满递减的,所以 SP 的初始值应该设置在栈顶的位置。例如,若存储器区域为0x20007C0000x20007FFF (1KB ),初始的栈指针就应该为0x20008000 。另外,对于 Cortex-M 处理器,向量表中向量地址的最低位应该为1,以代表他们为 Thumb 状态。对于下图中的例子,复位向量为0x101 ,而启动代码是从 0x100 开始的。在取出复位向量后。 Corte

21、x-M 处理器就可以从复位向量地址处执行程序,并开始正常操作。其他存储器SP初始值0X200080000X20007FFC第一个压栈顶0X20007FF8第二个压栈顶0X20000000SRAM起始地址0X00000100启动代码复位其他异常向量向量0X000000040X000001010X000000000X200080003 指令集CORTEX-M4 使用的是 Thumb-2 指令集,不支持 ARM 指令集, Thumb 指令集是 ARM 指令集的子集,但是 Thumb-2 技术已经不再支持 ARM 状态。CORTEX-M 处理器间的一个区别就是指令集特性。为了将回路面积降到最低, CO

22、RTEXM0 、 CORTEXM0+ 和部分 32 位指令, CORTEX-M3 剩下的 SIMD (单指令多数据)等、CORTEXM1 处理器只支持多数 16 位指令支持的 32 位指令更多。 CORTEX 处理器支持 DSP 提升指令集可选的浮点指令。3.1 CM4 指令集特点CM4 处理器使用 ARMv7-M 架构,指令集为Thumb 指令集中的 Thumb-2技术,具有如下特点· 16 位与 32 位混合指令· 加载 /存储指令集,不能直接操作存储器。· 指令长度可变,使用 16/32 位由功能决定,优先使用 16 位。· DSP 指令, CM4

23、 中为单精度, CM7 中可以双精度3.2 Cortex-M处理器间的指令集比较Cortex-M 处理器的架构有三类, ARMv6-M ,ARMv7-M ,ARMv7E-M 。内核性能ARMv6-MM0/M0+/M1一般数据处理, IO 控制人物ARMv7-MM3高级数据处理、硬件除法ARMv7E-MM4SIMD 、快速 MAC 饱和运算3.3 汇编指令简要介绍处理器内传送数据MOV <Rn目的寄存器> < Rm源寄存器 >源寄存器处可以是立即数,立即数为8 位以下,9-16位用MOVW,32位的需要使用LDR伪指令。使用浮点单元时可以使用VMOV指令。存储器访问指令访

24、问可分为读和写指令,另外根据读写的大小还有其他的延伸。数据类型加载(读)存储(写)8 位无符号LDRBSTRB8 位有符号LDRSBSTRB16 位无符号LDRHSTRH16 位有符号LDRSHSTRH32 位LDRSTR多个32位LDMSTM64 位LDRDSTRD栈操作PUSHPOP介绍几个较为重要的1LDR/STRLDR Rd,Rn,#offset从存储器Rn+offset处读取字,读取到Rd中STR Rd,Rn,#offset向存储器Rn+offset处存储字,数据来自Rd 。LDR R0 ,R1 ,#0X08从存储器 R1+0x08 处读取字,放到R0 中支持写回功能,加!即可,上面

25、可以写成LDR R0 ,R1 ,#0X08 !这样表示存储器位置的R1 被更新为 R1+0x082 LDM/STM 读 /写多个字上述命令是为了从存储器中读写多个字。一般会加后缀配合使用LDMIA Rn,<reg list>Rn 是存储器位置, reg list 是寄存器列表,从Rn 所指的存储器位置读取数据,放入寄存器中,每次读取完成后,地址就会自动加4。作用相当于 POP 。另外要注意的是, 先读取的数据放置在低寄存器中, 后读取的数据放置到高寄存器。LDMIA操作栈空间0x88888888R13(SP)0x99999999R13(SP)寄存器R13(SP)R1R0STMIA

26、Rn,<reg list>Rn 是存储器位置, reg list 是寄存器列表 , 向 Rn 所指的存储器位置存储数据,每次存储前,地址自动减 4。相当于 PUSH 操作。另要注意的是,先存储高寄存器的数据,后存储低寄存器的数据。STMDB操作寄存器栈空间R1未存 R1时 SPR00x99999999R13(SP)0x12345678R13(SP)同样,这两个指令都可以通过! 表示写回操作, 更新寄存器所指的存储器位置3压栈与出栈PUSH/POPPUSH 和 POP 和上面的 LDMIA 和 STMDB 是相同的。算数运算加: ADC减: SUB乘: MUL除: DIV对此不做详细

27、介绍逻辑运算与: AND或: ORR位清除: BIC按位异或: EOR按位或非: ORN移位算数右移: ASR逻辑左移: LSL逻辑右移: LSR循环右移: ROR异常相关指令之前说过, M4 可以有特权模式和非特权模式,并且非特权模式不能直接转换到特权模式, 只能在异常中修改CONTROL 寄存器。这里就可以通过 SVC 指令来进入异常。SVC #<immed>这样就可以进入 SVC 中断中,然后修改CONTROL 寄存器。要注意的是,调用SVC指令后,需尽快进入中断中,如果有其他高优先级的中断打断了SVC ,就会引起HardFault。CPS指令使用时需要带上后缀:IE (中断

28、使能),ID (中断禁止),还需指定要设置的中断屏蔽寄存器,如之前讲到的PRIMASK和FAULTMASK指令操作CPSIE I使能中断(清除PRIMASK)CPSID I禁止中断(设置PRIMASK),除NMI和HardFaultCPSIE F使能中断(清除FAULTMASK)CPSID F禁止中断(设置FAULTMASK) ,除NMI4 存储器系统4.1 存储器外设哈佛结构,程序存储器和数据存储器分开, 也就是指令和数据可以同时访问。1、在第一章中的存储器映射图中, 0-0.5G 为代码段,主要用于程序代码,改区域一般也允许数据访问。一般此处为 Flash 。在 keil 中,代码编译后,

29、 整个代码分为几部分: Code(代码),RO-data (只读数据),RW-data ,(初始化的可读写变量大小) , ZI-data (Zero Initialize )未初始化的可读写变量大小 ,它会被自动初始化为 0。ZI-data 不会被算到代码里,因为它不会被初始化。简单来说呢就是在烧写的时候FLASH 中的被占用的空间为:Code+RO-data+RW-data。程序运行的时候,芯片内部RAM 使用的空间为: RW-data+ZI-data2、0.5G-1G 范围内是 SRAM ,主要用于连接 SRAM ,其大都为片上 SRAM ,不过对存储器的类型没有什么限制。若支持可选的位段

30、特性,则SRAM 区域的第一个 1MB 可位寻址,还可以在这块区域中执行程序代码。3、1G-1.5G 是外设区域,多用于片上外设,和SRAM 区域类似,也可以放置程序代码,若支持可选的位段特性,则外设区域的第一个1MB 是可选的。4、1.5G-2.5G 空间为外部 RAM 空间5、2G-3G 空间为设备空间,用于片外外设。6、3G-4G 空间为系统空间。4.2 Bootloader芯片设计人员将 Bootloader 放入系统中的原因是多方面的。例如:· 提供 Flash 编程功能,这样就可以利用一个简单的UART程 Flash ,或者当程序运行时,在自己的应用程序中编程接口来编Fl

31、ash 存储器的某些部分。· 提供通信协议栈等额外的固件,可被软件开发人员通过API调用。· 提供芯片内置的自检功能(BIST )比如在 1601 中,提供一个 4K 的 info 区,和 128K 的 main 区, 4K 的 info 区就是一个 bootloader ,提供 SPI 下载功能,利用拨码开关可以设置从哪里启动, mode=0 时从 info 区启动, mode=1 时从 main 区启动,并且 main 区分两部分,软件可设置从低 64K 启动还是从高 64K 启动。这里设计存储器重映射的问题,系统启动时是从 0X00 开始的,不管是 Boot load

32、er 还是用户 flash ,都得从 0x00 开始,然后 0x04 放的 reset_handler 的地址, mode=0 ,那 infor 区就被映射到了 0x00 ,mode=1 ,main 区就被映射到了 0x00 。4.3 位段操作对存储器中某一位操作是如何实现的呢?先来看看普通模式下,写某一位:LDRR0 ,=0X200000000 ;设置地址LDRR1,R0; 读数据ORR.W R1,#0X04;修改第2 位STRR1 ,R0; 写回读某一位:LDRR0 ,=0X200000000 ;设置地址LDRR1,R0; 读数据UBFX.W R1 , R1 ,#2, #1; 提取第 2

33、位这种操作无法保证原子性, 比如输出端口的第 0 位被主程序使用, 而第一位被中断使用,这样有可能出现数据冲突。位段操作模式下,这种现象可以避免,因为位段操作是在硬件等级下修改的。位段操作只在两个区域支持, SRAM 的第 1MB ,外设区域的第 1MB 。每 1MB 会对应一个 32M 的区域,只需操作这 32M 的某个字,就能对应那 1MB 区域的某一位。例如写 0x22000008 为 1,就设置了 0x20000000 第 3 位为 1。在指令上也会更加简化。位段写操作LDRR0 , =0X2200000 ; 设置 addMOV R1 ,#1;要写的数据STRR1 ,R0; 写设置了位

34、段操作模式,对应的32MB 区域将不能再使用。4.4 存储器大小端大小端指的是数据存储时的顺序问题。 大端指的是高字节的数据放在低地址中,低字节放在高地址中, 这种方式符合人类思维。 小端则是低字节放在低地址中,高字节放在高地址中,这种方式更符合计算机思维。例如将 0x12345678 放到存储器 0x2000-0x2003地址处大端方式地址0x20030x20020x20010x2000数据0x780x560x340x12小端方式地址0x20040x20030x20020x2001数据0x120x340x560x78CM4 处理器同时支持小端和大端的存储器系统。CM 的微控制器大多是小端的。5 异常和中断5.1 中断简介所有的 CORTEX-M 处理器都会提供一个用于中断处理的嵌套向量中断控制器,也就是 NVIC 。中断也属于异常的一种,其他异常包括如错误异常和其他用于 OS 支持的系统异常。M4 的 NVIC 支持最多 240 个 IRQ(中断请求),1 个不可屏蔽中断( NMI ),1 个 SysTick (系统节拍)定时中断及多个系统异常。异常编号异常类型优先级描述1复位-3复

温馨提示

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

评论

0/150

提交评论