ImageVerifierCode 换一换
格式:DOCX , 页数:39 ,大小:684.27KB ,
资源ID:25674867      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25674867.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(CORTEXM4知识点总结.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

CORTEXM4知识点总结.docx

1、CORTEXM4知识点总结 Cortex-M4内核知识点总结余明1 ARM处理器简介ARM处理器的种类很多,从手机上的高端处理器芯片到面向微控制器的芯片,都有ARM的身影。2011年基于ARM处理器的芯片的出货量已经到达79亿。这一章首先对ARM处理器有个简单的了解。在早期的时候,ARM处理器使用后缀表明特性。例如ARM7TDMI,T表示支持Thumb指令,D表示JTAG,M表示快速乘法器,I则表示嵌入式ICE模块。近几年,ARM改变处理器的命名方式,统一使用了Cortex处理器的名称。Cortex处理器下分为三类: Cortex-A系列:需要处理高端嵌入式系统等复杂应用的应用处理器 Cort

2、ex-R系列:实时、高性能的处理器,面向较高端的实时市场 Cortex-M系列:面向微控制器和混合信号设计等小型应用,注重低成本、低功耗。不同系列的处理器使用不同版本的架构Cortex-A系列ARMv7-A架构Cortex-R系列ARMv7-R架构Cortex-M系列ARMv7-M、ARMv6-M在Cortex-M系列中,进一步都处理器进行了划分处理器功能架构Cortex-M0、Cortex-M0+低功耗ARMv6-MCortex-M1FPGAARMv6-MCortex-M3微控制器ARMv7-MCortex-M4增加DSPARMv7E-M2 架构2.1架构简介Cortex-M3和Cortex

3、-M4处理器都是基于ARMv7-M架构。最初ARMv-7M架构是随着Cortex-M3处理器一同引进的,而在Cortex-M4发布时,架构中又额外增加了新的指令和特性,改进后的架构有时也被称为ARMv7E-M。2.2编程模型2.2.1操作模式和状态Cortex-M4处理器包括两种操作状态和模式,还有两种访问等级。1. 操作状态 调试状态:处理器被暂停后,就会进入调试状态,比如利用调试器触发断点,单步执行等。Thumb状态:处理器执行程序代码,它就是处在Thumb状态,因为Cortex-M4用的是Thumb指令,所以称为Thumb状态,并且在Cortex-M处理器中已经不支持ARM指令,也就不存

4、在ARM状态。2. 操作模式 处理模式:执行中断服务程序等异常处理。在处理模式下,处理器总是具有特权访问等级。 线程模式:执行普通的程序代码。3. 访问等级 特权访问等级:可以访问处理器中的所有资源。 非特权访问等级:有些存储器区域无法访问,有些操作也无法使用。访问等级有特殊寄存器CONTROL控制。软件可将处理器从特权访问等级转换至非特权访问等级,但反之无法直接转换,需要借助异常机制。处理器的操作模式和状态可由图1.1来表示,在上电后,默认处于特权线程模式下的Thumb状态。2.2.2 寄存器 对于ARM架构来讲,处理存储器中的数据时,需将其从存储器加载到寄存器中,处理完毕后,若有必要,还可

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

6、。 MSP和PSP的最低两位必须是0,也就是栈指针的地址操作必须4字节对齐。 3 链接寄存器(LR)R14 用于函数或子程序调用时返回地址的保存,在异常中则用来保存进异常前状态信息,包括系统模式、栈指针模式等。异常返回时参考LR中的信息返回到相应状态。 4 程序计数器(PC)R15 R15为程序计数器,读操作返回当前地址加4,写操作引起跳转。2.2.3 特殊寄存器特殊寄存器有三类:程序状态寄存器、中断/异常屏蔽寄存器、处理器控制寄存器。1 程序状态寄存器:应用PSR(APSR)、执行PSR(EPSR)、中断PSR(IPSR)。三个寄存器可以单独访问,也可以组合到一个寄存器中访问。在APSR中包

7、含N(负标志)、Z(零标志)、C(进位标志)、V(溢出标志)、Q(饱和标志)和GE(大于或等于标志,只在M4中有)。IPSR中是中断号,只读。EPSR中,T为表示Thumb状态,由于M4支持Thumb状态,不支持ARM状态,T位始终为1。ICI是中断继续指令位,保存的是中断被打断时的信息。IT指令时IF-THEN指令,用于条件执行。2 PRIMASK、FAULTMASK、和BASEPRI寄存器:这三个寄存器只能在特权模式下使用。PRIMASK可屏蔽除NMI和HardFault之外的所有异常。FAULTMASK还可屏蔽HardFault。BASEPRI可以根据设置屏蔽低优先级的中断,可控制8个或

8、16个中断,相应的改寄存器的宽度为3位或4位。3 CONTROL寄存器CONTROL寄存器主要有以下几项作用: 线程模式下的访问等级 指针的选择 当前代码是否使用了浮点单元分别对应了寄存器的低三位位功能nPRIV(第0位)0对应特权等级,1为非特权等级SPSEL(第1位)0对应主栈指针,1为进程栈指针,处理模式下始终为0。FPCA(第2位)0未使用浮点,1使用了浮点2.2.4 浮点寄存器1 S0-S31和D0-D15S0-S31都为32位寄存器,也可以D0-D15的方式成对访问,但M4不支持双精度浮点运算,只是可以传输双精度数据。2 浮点状态和控制寄存器(FPSCR)FPSCR两个功能 提供浮

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

10、据各自典型用法进行划分,他们主要用于: 程序代码访问(如CODE区域) 数据访问(如SRAM区域) 外设(如外设区域)某款芯片的存储器映射分配 一般Code放在Flash当中,数据放在RAM中。数据在RAM存放有一定的顺序,可以分为数据段,BSS段、堆和栈区域。 数据段,存储在内存的底部,包含初始化的全局变量和静态变量。 BSS段,未初始化的数据。 堆,C函数自动分配存储器区域,例如alloc()和malloc()。 栈,用于临时数据存储,局部变量,函数调用2.3.3 栈存储同几乎所有的处理器架构一样,Cortex-M处理器在运行时需要栈存储和栈指针R13。ARM处理器将系统主存储器用于栈空间

11、操作,使用PUSH指令往栈中存储数据以及POP指令从栈中提取数据。处理器使用的是满递减的模型,栈指针是向下增长的。处理器启动后,SP被设置为栈存储空间的最后的位置,也就是最低位置,PUSH时,SP指针首先减小,然后将数据压入栈中。POP的时候相反,先将当前SP所指的数据出栈,然后再修改SP,SP此时增大。可用下面两幅图加以理解,栈中主要用于: 存储局部变量 异常产生时保存处理器状态(LR、xPSR)和寄存器数值 函数调用时2.4复位和复位流程对于典型的Cortex-M处理器,复位类型有三种: 上电复位。复位微控制器中所有部分。 系统复位。只会复位处理器和外设,不包括处理的调试支持部件 处理器复

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

13、的。在取出复位向量后。Cortex-M处理器就可以从复位向量地址处执行程序,并开始正常操作。3 指令集CORTEX-M4使用的是Thumb-2指令集,不支持ARM指令集,Thumb指令集是ARM指令集的子集,但是Thumb-2技术已经不再支持ARM状态。CORTEX-M处理器间的一个区别就是指令集特性。为了将回路面积降到最低,CORTEXM0、CORTEXM0+、CORTEXM1处理器只支持多数16位指令和部分32位指令,CORTEX-M3支持的32位指令更多。CORTEX处理器支持剩下的SIMD(单指令多数据)等DSP提升指令集可选的浮点指令。3.1 CM4指令集特点CM4处理器使用ARMv

14、7-M架构,指令集为Thumb指令集中的Thumb-2技术,具有如下特点 16位与32位混合指令 加载/存储指令集,不能直接操作存储器。 指令长度可变,使用16/32位由功能决定,优先使用16位。 DSP指令,CM4中为单精度,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 汇编指令简要介绍3.3.1 处理器内传送数据MOV 源寄存器处

15、可以是立即数,立即数为8位以下,9-16位用MOVW,32位的需要使用LDR伪指令。使用浮点单元时可以使用VMOV指令。3.3.2 存储器访问指令访问可分为读和写指令,另外根据读写的大小还有其他的延伸。数据类型加载(读)存储(写)8位无符号LDRBSTRB8位有符号LDRSBSTRB16位无符号LDRHSTRH16位有符号LDRSHSTRH32位LDRSTR多个32位LDMSTM64位LDRDSTRD栈操作PUSHPOP介绍几个较为重要的1 LDR/STRLDR Rd,Rn,#offset 从存储器Rn+offset处读取字,读取到Rd中STR Rd,Rn,#offset 向存储器Rn+off

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

17、寄存器列表, 向Rn所指的存储器位置存储数据,每次存储前,地址自动减4。相当于PUSH操作。另要注意的是,先存储高寄存器的数据,后存储低寄存器的数据。同样,这两个指令都可以通过!表示写回操作,更新寄存器所指的存储器位置3 压栈与出栈 PUSH/POPPUSH和POP和上面的LDMIA和STMDB是相同的。3.3.3 算数运算加:ADC减:SUB乘:MUL除:DIV对此不做详细介绍3.3.4 逻辑运算与:AND或:ORR位清除:BIC按位异或:EOR按位或非:ORN3.3.5 移位算数右移:ASR逻辑左移:LSL逻辑右移:LSR循环右移:ROR3.3.6 异常相关指令之前说过,M4可以有特权模式

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

19、(清除FAULTMASK)CPSID F禁止中断(设置FAULTMASK),除NMI4 存储器系统4.1 存储器外设哈佛结构,程序存储器和数据存储器分开,也就是指令和数据可以同时访问。1、在第一章中的存储器映射图中,0-0.5G为代码段,主要用于程序代码,改区域一般也允许数据访问。一般此处为Flash。在keil中,代码编译后,整个代码分为几部分:Code(代码),RO-data(只读数据),RW-data,(初始化的可读写变量大小),ZI-data(Zero Initialize)未初始化的可读写变量大小,它会被自动初始化为0。ZI-data不会被算到代码里,因为它不会被初始化。简单来说呢就

20、是在烧写的时候FLASH中的被占用的空间为:Code+RO-data+RW-data。程序运行的时候,芯片内部RAM使用的空间为:RW-data+ZI-data2、0.5G-1G范围内是SRAM,主要用于连接SRAM,其大都为片上SRAM,不过对存储器的类型没有什么限制。若支持可选的位段特性,则SRAM区域的第一个1MB可位寻址,还可以在这块区域中执行程序代码。3、1G-1.5G是外设区域,多用于片上外设,和SRAM区域类似,也可以放置程序代码,若支持可选的位段特性,则外设区域的第一个1MB是可选的。4、1.5G-2.5G空间为外部RAM空间5、2G-3G空间为设备空间,用于片外外设。6、3G

21、-4G空间为系统空间。4.2 Bootloader芯片设计人员将Bootloader放入系统中的原因是多方面的。例如: 提供Flash编程功能,这样就可以利用一个简单的UART接口来编程Flash,或者当程序运行时,在自己的应用程序中编程Flash存储器的某些部分。 提供通信协议栈等额外的固件,可被软件开发人员通过API调用。 提供芯片内置的自检功能(BIST)比如在1601中,提供一个4K的info区,和128K的main区,4K的info区就是一个bootloader,提供SPI下载功能,利用拨码开关可以设置从哪里启动,mode=0时从info区启动,mode=1时从main区启动,并且m

22、ain区分两部分,软件可设置从低64K启动还是从高64K启动。这里设计存储器重映射的问题,系统启动时是从0X00开始的,不管是Boot loader还是用户flash,都得从0x00开始,然后0x04放的reset_handler的地址,mode=0,那infor区就被映射到了0x00,mode=1,main区就被映射到了0x00。4.3位段操作对存储器中某一位操作是如何实现的呢?先来看看普通模式下,写某一位:LDR R0,=0X200000000 ;设置地址LDR R1,R0 ;读数据ORR.W R1,#0X04 ;修改第2位STR R1,R0 ;写回 读某一位:LDR R0,=0X2000

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

24、要写的数据STR R1 ,R0 ;写设置了位段操作模式,对应的32MB区域将不能再使用。4.4 存储器大小端大小端指的是数据存储时的顺序问题。大端指的是高字节的数据放在低地址中,低字节放在高地址中,这种方式符合人类思维。小端则是低字节放在低地址中,高字节放在高地址中,这种方式更符合计算机思维。例如将0x12345678放到存储器0x2000-0x2003地址处大端方式地址0x20030x20020x20010x2000数据0x780x560x340x12小端方式地址0x20040x20030x20020x2001数据0x120x340x560x78CM4处理器同时支持小端和大端的存储器系统。C

25、M的微控制器大多是小端的。5 异常和中断5.1 中断简介所有的CORTEX-M处理器都会提供一个用于中断处理的嵌套向量中断控制器,也就是NVIC。中断也属于异常的一种,其他异常包括如错误异常和其他用于OS支持的系统异常。M4的NVIC支持最多240个IRQ(中断请求),1个不可屏蔽中断(NMI),1个SysTick(系统节拍)定时中断及多个系统异常。异常编号异常类型优先级描述1复位-3复位2NMI-2不可屏蔽中断3硬件错误-1硬件错误4MemManage错误可编程存储器管理错误5总线错误可编程总线错误6使用错误可编程程序错误7-10保留11SVC可编程请求管理调用12调试监控可编程调试监控13

26、保留14PendSV可编程一般用于上下文切换15SYSTICK可编程系统节拍定时器16外部中断#0可编程片上外设或外部中断源产生17外部中断#1可编程255外部中断#239可编程除了前3个异常的优先级是固定的,其余异常都可以修改优先级。5.2异常类型编号1-15为系统异常,16及以上的则为中断输入。5.3 中断管理为了简化中断和异常管理,CMSIS-Core提供了多个访问函数。函数用法Void NVIC_EnableIRQ(IRQn_Type IRQn)使能外部中断Void NVIC_DisableIRQ(IRQn_Type IRQn)禁止外部中断Void NVIC_SetPriority(I

27、RQn_Type IRQn,uint32_t priority)设置中断的优先级Void _enable_irq(void)清除PRIMASK使能中断Void _disable_irq(void)设置PRIMASK禁止所有中断Void NVIC_SetPriorityGrouping(uint32_t priorityGroup)设置优先级分组复位后,所有中断都处于禁止状态,且默认的优先级为0。在使用任何一个中断之前需要 设置所需中断的优先级(可选) 使能外设中的可以触发中断的中断产生控制 使能NVIC中的中断在M4中,中断优先级共8位宽,但芯片厂商可进行设置,范围是3-8位。中断优先级分为两

28、个部分,分组优先级(也叫抢占优先级)和子优先级。处理器首先判断的是分组优先级,分组优先级高的会被首先处理,若分组优先级相同,再比较子优先级。8为宽的优先级如何分配抢占优先级和分组优先级,可由寄存器设置。如下表优先级分组抢占优先级域分组优先级域0(默认)Bit7:1Bit01Bit7:2Bit1:02Bit7:3Bit2:03Bit7:4Bit3:04Bit7:5Bit4:05Bit7:6Bit5:06Bit7Bit6:07无Bit7:0这里要注意的是,异常编号和优先级并不是一个意思,异常编号仅仅是一个编号,就像是枚举一样,而优先级则是需要手动的进行设置的。只有在分组优先级和子优先级完全一致时,

29、异常编号才起作用,编号越小优先级越高。另外,在M4内核中,还提供了中断向量重定位功能。向量表重定位功能提供了一个名为向量表偏移寄存器(VTOR)的可编程寄存器。前面提到的Bootloder就可以使用此项功能来完成。5.4 异常或中断屏蔽寄存器5.4.1 PRIMASKPRIMASK用于禁止除NMI和HardFault外的所有异常,只能在特权状态访问如:CPSIE I ;清除PRIMASK(使能中断)CPSID I;设置PRIMASK (禁止中断)5.4.2 FAULMASK (M0中无)FAULMASK用于禁止除NMI外的所有异常,只能在特权访问,如:CPSIE F ;清除FAULMASKCOSID F;设置FAULMASK5.4.3 BASEPRI(M0中无)BASEPRI可禁止优先级低于某特定等级的中断,只能在特权状态访问,如:_set_BASEPRI(0X60); /禁止优先级在0x60-0xFF间的中断_set_BASEPRI(0X0); /取消BASEPRI屏蔽5.5 中断状态及中断行为5.5.1 中断状态中断状态:inactive, pending, active,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1