购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 ARM Cortex-M4F微控制器简介

本书介绍的 MCU的内核 使用32位ARM Cortex-M4F微控制器(简称CM4F),它是ARM大家族中重要一员。

2010年ARM公司发布Cortex-M4微控制器,浮点处理器(Floating Point Unit,FPU)作为内核的可选模块,如果Cortex-M4微控制器包含FPU,则称它为Cortex-M4F。Cortex-M4与ARM在2005年发布的Cortex-M3微控制器都是基于ARMv7-M架构的,从功能上来看可以认为Cortex-M4是在Cortex-M3加上数字信号处理(DSP)指令与可选的FPU构成的,所以它们有许多的共同点。

(1)32位微控制器,内部寄存器、数据总线都为32位。

(2)采用Thumb2 技术,同时支持16位与32位指令。

(3)采用哈佛总线架构 ,使用统一存储空间编址,32位寻址,最多支持4 GB的存储空间,采用三级流水线设计。

(4)片上接口基于高级微控制器总线架构(Advanced Microcontroller Bus Architecture, AMBA)技术,能进行高吞吐量的流水线总线操作。

(5)集成嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC),根据不同的芯片设计,可支持8~256个中断优先级,最多240个中断请求。

(6)可选的存储器保护单元,具有存储器保护特性,如访问权限控制;提供时钟嘀嗒(Clcok Tick)、主栈指针、线程栈指针等操作系统特性。

(7)具有多种低功耗特性和睡眠模式。

Cortex-M3微控制器和 Cortex-M4微控制器都提供了数据操作指令、转移指令、存储器数据传送指令等基本指令,这些基本指令在2.2节会详细介绍;此外Cortex-M4微控制器还支持单指令多数据(Single Instruction Multiple Data,SIMD)、快速乘法累加(Multiply Accumulate,MAC)等数字信号处理(DSP)相关指令;Cortex-M4F微控制器还支持单精度的浮点指令。

相比其他架构的32位微控制器,Cortex-M4微控制器有较高的性能与较低的功耗,具有优秀的能耗效率,Cortex-M3微控制器和Cortex-M4微控制器性能可达到3 CoreMark/MHz、1.25 DMIPS/MHz(基于Dhrystone2.1平台 );Cortex-M3微控制器和Cortex-M4微控制器还进行了低功耗的优化。由于采用了 Thumb ISA(指令架构),在 Cortex-M3微控制器和Cortex-M4微控制器上编程可以获得较高的代码密度。

Cortex-M3微控制器和Cortex-M4微控制器易于使用,它们采用的架构针对C语言编译器进行了优化,可以使用标准C语言完成绝大多数的编程代码;此外,还提供了程序运行暂停、单步调试、捕捉程序流、数据变动等调试手段,使代码调试更加方便。

Cortex-M3微控制器和 Cortex-M4微控制器具有高性能与低功耗,可广泛应用于汽车、数据通信、工业控制、消费电子、片上系统、混合信号设计等方面。

2.1.1 ARM Cortex-M4F微控制器内部结构概要

ARM Cortex-M4F微控制器的组件结构如图2-1所示,下面简要介绍各部分。

1.M4F内核

ARM Cortex-M4F是一种低功耗、高性能、高速度的微控制器,基于ARMv7-M架构,支持Thumb指令集,同时采用Thumb2技术 ,且拥有符合IEEE 754标准的单精度FPU。在硬件方面,支持除法指令,并且有中断处理程序和线程两种模式。32位的ARM Cortex-M4F微控制器具有指令和调试两种状态。在处理中断方面,M4F内核具有自动保存微控制器状态和恢复低延迟中断。ARM Cortex-M4F 微控制器可提供更高性能,比如定点运算的速度是ARM Cortex-M3微控制器的2倍,而浮点运算速度比ARM Cortex-M3微控制器快10倍以上,同时功耗只有一半

图2-1 ARM Cortex-M4F微控制器的组件结构

2.嵌套中断向量控制器

嵌套中断向量控制器(Nested Vectored Interrupt Controller,NVIC)是一个在Cortex-M4F微控制器中内建的中断控制器。NVIC可用于对优先级进行分组,这样在选择中断时可以设置抢占级和非抢占级别。对于Cortex-M4F微控制器而言,通过在NVIC中实现中断尾链和迟到功能,意味着两个相邻的中断不用再处理状态保存和恢复了。Cortex-M4F 微控制器会自动保存中断入口,并自动恢复,没有指令开销,在超低功耗睡眠模式下也可唤醒中断控制器。NVIC还采用了向量中断的机制,在中断发生时,它会自动取出对应的中断服务例程入口地址,并且直接调用,无须软件判定中断源,从而缩短中断延时。为优化低功耗设计,NVIC 还集成一个可选唤醒中断控制器(Wakeup Interrupt Control,WIC),在睡眠模式或深度睡眠模式下,芯片可快速进入超低功耗状态,且只能被WIC唤醒源唤醒。在Cortex-M4F微控制器中,还包含一个24位倒计时定时器Systick,即使系统在睡眠模式下也能工作,它是作为嵌套中断向量控制器(NVIC)的一部分实现的,若用于实时操作系统(Real Time Operation System,RTOS)的时钟,将给RTOS在同类内核芯片间的移植带来便利。

3.存储器保护单元

存储器保护单元(Memory Protection Unit,MPU)可以对一个选定的内存单元进行保护,它将存储器划分为8个子区域,每个子区域的优先级均是可自定义的。微控制器可以禁用和使能指定的区域。

4.调试解决方案

ARM Cortex-M4F微控制器可以对存储器和寄存器进行调试访问,具有串行线 SWD或JTAG调试访问接口,或者两种接口都包括;Flash修补和断点(Flash Patch and Breakpoint, FPB)单元用于实现硬件断点和代码修补;数据观察点及跟踪(Data Watchpoint and Trace, DWT)单元用于实现观察点、跟踪资源和系统分析;指令跟踪宏(Instrumentation Trace Macrocell,ITM)单元用于提供对 printf()类型调试的支持;跟踪端口接口单元(Trace Port Interface Unit,TPIU)用来连接跟踪端口分析仪,包括单线输出模式。

5.总线接口

ARM Cortex-M4F微控制器提供先进的高性能总线(AHB-Lite)接口,其中包括的5个接口分别为:ICode 存储器接口、DCode 存储器接口、系统接口,还有基于高性能外设总线(ASB)接口,以及外部专用外设总线(PPB)接口。位段的操作可以细化到原子位段的读写操作;对内存的访问是对齐的,并且在写数据时采用写缓冲区的方式。

6.浮点运算处理器

浮点运算处理器可以处理单精度32位指令数据,并结合了乘法和累积指令用来提高计算的精度。此外,硬件能够进行加减法、乘除法及平方根等运算操作,同时也支持所有的IEEE数据四舍五入模式。浮点运算处理器拥有32个专用32位单精度寄存器,也可作为16个双字寄存器寻址,并且通过采用解耦三级流水线来加快了处理器的运行速度。

2.1.2 ARM Cortex-M4F微控制器存储器映像

Cortex-M4F微控制器直接寻址空间为4 GB,地址范围是0x0000_0000~0xFFFF_FFFF。这里所说的存储器映像,其含义是把这4 GB空间当成存储器来看待,将空间分成若干区间,然后在不同的区间安排实际的物理资源。ARM 定出的条条框框是“粗线条”的,允许芯片制造商灵活地分配存储器空间,以制造出各具特色的MCU产品。

图2-2给出了CM4F的存储器空间地址映像,CM4F的存储器系统支持小端格式和大端格式 ,芯片在出厂时由厂商定义,例如S32K系列微控制器采用小端格式

2.1.3 ARM Cortex-M4F微控制器的寄存器

学习一款微控制器时,理解其内部寄存器的用途是重要的一环。CM4F 的寄存器包含用于数据处理与控制的寄存器、特殊功能寄存器与浮点寄存器,如图2-3所示。数据处理与控制寄存器在Cortex-M系列处理器中的定义与使用基本相同,它包括R0~R15,其中R13作为堆栈指针(SP)。SP实质上有两个(MSP与PSP),但在同一时刻只能使用一个,这也就是所谓的“Banked”寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问,在Cortex-M系列微控制器中,Cortex-M0与M0+的特殊功能寄存器数量与功能相同, Cortex-M3与M4比M0与M0+多了3个用于异常或中断屏蔽的寄存器,而且在某些寄存器上的预定义不尽相同。在Cortex-M系列微控制器中浮点寄存器只存在于CM4F中。

图2-2 CM4F的存储器空间地址映像

图2-3 CM4F的寄存器

1.数据处理与控制寄存器

(1)通用寄存器R0~R12。R0~R12是最具通用目的的32位通用寄存器,通常用于数据操作。大部分能够访问通用寄存器的指令都可以访问R0~R12,低位寄存器(R0~R7)能够被所有访问通用寄存器的指令访问,高位寄存器(R8~R12)只能被所有32位通用寄存器指令访问,不能被16位指令访问。

(2)堆栈指针R13。寄存器R13是作为堆栈指针(SP)使用的,堆栈指针用于访问堆栈,因为SP会忽略[1:0]位(即最低两位永远是0),因此堆栈是按照字对齐(4个字节对齐)的。主堆栈指针(MSP)是复位后默认使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断处理程序)。Handler模式总是使用主堆栈指针(MSP),但是也可以配置成Thread模式来使用MSP或者进程堆栈指针(PSP)

(3)链接寄存器R14。寄存器R14是作为子程序链接寄存器(LR)使用的,当执行分支链接(BL)或分支链接执行交换(BLX)指令后,LR从程序计数器(PC)获取返回地址, LR也可用于异常返回。R14也可以作为通用寄存器来使用。

(4)程序计数器。程序计数器(Program Counter,PC)是中央处理器(CPU)内最为突出的一个寄存器,它是程序执行控制寄存器。ARM Cortex-M系列的R15寄存器是程序计数器(PC),指向当前的程序地址。复位时将复位向量的值加载到PC,通过修改它的值,就能改变程序的执行顺序。若该寄存器的[0]位为0,则指令总是按照字对齐或者半字对齐的。PC可以使用特权或者非特权模式进行访问。

2.特殊功能寄存器

(1)程序状态寄存器(PSR)。程序状态寄存器在内部可分为以下几个子寄存器:APSR、IPSR、EPSR,这三个子寄存器既可以单独访问,也可以两个或三个组合到一起访问。使用三合一方式访问时,把该寄存器称为xPSR。CM4F程序状态寄存器(xPSR)及其子寄存器如表2-1所示,其中xPSR、IPSR和EPSR寄存器只能在特权模式下被访问,而APSR寄存器能够在特权或者非特权模式下被访问,具体描述详见《CM4用户指南》。

表2-1 CM4F程序状态寄存器(xPSR)及其子寄存器

① 应用程序状态寄存器(APSR):显示算术运算单元(ALU)状态位的一些信息。

负标志N:若结果最高位为1,当有符号运算中结果为负时,则该位置1,否则清0。

零标志Z:若结果为0,则该位置1,否则清0。

进位标志C:若最高位有进位(减法为借位),则该位置1,否则清0。

溢出标志V:若溢出,则该位置1,否则清0。

以上各位在Cortex-M系列微控制器中M0、M0+、M3、M4定义是一样的,这些位在条件转移指令中会用到,复位之后这些位是随机的。

饱和 标志位Q:在实现DSP扩展的微控制器中,如果在运算中出现饱和,微控制器就会将该位置1,将该位置1称为饱和。该位只在Cortex-M3、Cortex-M4中存在。

大于或等标志位GE:仅用于DSP扩展,使用SIMD指令更新这些标志,GE用以指明结果来自操作的单个字节或半字,软件可以使用这些标志控制稍后的 SEL 指令,该位只在Cortex-M4中存在。更多信息请参考《ARMv7-M参考手册》。

② 中断程序状态寄存器(IPSR):每次异常完成之后,微控制器会实时更新 IPSR 内的异常号,IPSR只能被MRS指令读/写。在进程模式下(可以理解为处于无操作系统的主循环中,或者有操作系统情况下的某一任务程序中),IPSR值为0。在Handler模式(处理异常的模式,可简单地理解成中断状态)下,IPSR 存放当前异常的异常号。复位之后,IPSR 将被自动清0。复位异常号是一个暂时值,在复位时,复位异常号是不可见的。在Cortex-M系列微控制器中,M0和M0+当前异常的异常号占用0~5位、M3、M4则占用0~8位,这与微控制器所能支持的异常或中断数量有关。

③ 执行程序状态寄存器(EPSR):T 标志位指示当前运行的是否 Thumb 指令,该位是不能被软件读取的,运行复位向量对应的代码时该位置1;如果该位为0,会发生硬件异常,进入硬件中断处理程序。在Cortex-M系列处理器中这一位的定义是相同。

ICI/IT 标志位用于指示异常可继续指令状态或保存的 IT 状态,该位存在 Cortex-M3与Cortex-M4中,更多信息请参考《ARMv7-M参考手册》。

(2)中断屏蔽寄存器(PRIMASK)。中断屏蔽寄存器的D31~D1位保留,只有D0位(记为PM)有意义。当D0位被置1时,除不可屏蔽中断和硬件错误之外的所有中断都将被屏蔽,使用特殊指令(如MSR、MRS)可以访问该寄存器。此外,还有条特殊指令也能访问它,即改变处理器状态指令CPS,但是该指令只有在实时任务时才会用到。执行汇编指令“CPSID i”,则将D0位置1(关总中断);执行汇编指令“CPSIE i”,则将D0位清0(开总中断),其中i代表IRQ中断,IRQ是非内核中断请求(Interrupt Request)的缩写。

(3)错误屏蔽寄存器(FAULTMASK)。FAULTMASK 寄存器与 PRIMASK 寄存器的区别在于,它能够屏蔽掉优先级更高的硬件错误(Hard Fault)异常。错误屏蔽寄存器的D31~D1位保留,只有D0位有意义。当D0位被置1时,除不可屏蔽中断(NMI)之外的所有中断都会被屏蔽,也就是说硬件错误异常也会被屏蔽掉。该寄存器只能在特权模式下访问,使用特殊指令(如MSR、MRS)可以访问该寄存器。此外,还有条特殊指令也能访问它,即改变处理器状态指令CPS,但是该指令只有在实时任务时才会用到。执行汇编指令“CPSID F”,则将D0位置1(关总中断);执行汇编指令“CPSIE F”,则将D0位清0(开总中断),其中F代表FAULTMASK。在退出异常处理时FAULTMASK会被自动清除,但从不可屏蔽中断(NMI)中退出除外。复位时FAULTMASK寄存器将被清除。FAULTMASK寄存器存在Cortex-M3与Cortex-M4中。

(4)基本优先级屏蔽寄存器(BASEPRI)。基本优先级屏蔽(BASEPRI)寄存器提供了一种更加灵活的中断屏蔽机制,通过设置该寄存器可以屏蔽特定优先级的中断,当该寄存器设置为一个非零值时,所有优先级值大于等于(中断的优先级值越大表示优先级越低)该值的中断都会被屏蔽,当该寄存器为0时不起作用。BASEPRI寄存器只能在特权模式下访问,复位时,BASEPRI寄存器将被清除。

BASEPRI寄存器的宽度与在芯片设计时实际实现的中断优先组长数量有关,通常BASEPRI寄存器的宽度为3~8位二进制,占用D0~D7位,当不足8位时高位有效。例如,当BASEPRI寄存器的宽度为3位时,D7、D6、D5有效,BASEPRI寄存器设置值有0xE0、0xC0、0xA0、0x80、0x60、0x40、0x20、0x00,共8个。BASEPRI寄存器存在Cortex-M3与Cortex-M4中。

BASEPRI寄存器还有另一种访问方式,即通过BASEPRI_MAX访问,它们在物理上是同一个寄存器,但访问方式有些不同,使用BASEPRI_MAX访问时,不能接收大于当前中断优先级的值,例如,下面指令中0x80不会被接收(假设BASEPRI_MAX原有的值为0x40)。

MOV R0,#0x80         //R0←0x80

MSR BASEPRI_MAX,R0     //本次写操作不起作用,因为0x80优先级低于0x40

要设置为更低的优先级可以使用BASEPRI寄存器。

(5)控制寄存器(CONTROL)。Cortex-M0、M3和M4内核中的控制寄存器(CONTROL)的D31~D2位保留,D1、D0位含义如下。

D1(SPSEL):堆栈指针选择位。当SPSEL=0时,使用主堆栈指针(MSP)作为当前堆栈指针(复位后缺省值);当 SPSEL=1时,在线程模式下,使用线程堆栈(PSP)指针作为当前堆栈指针。在特权、线程模式下,可以通过软件更新SPSEL位。在Handler模式下,写该位无效。复位后,控制寄存器被清0。可用MRS指令读该寄存器,MSR指令写该寄存器。非特权模式下访问该寄存器是无效的。

D0(nPRIV):如果要扩展权限,在线程模式下定义执行特权。当nPRIV=0时,在线程模式下可以特权访问;当nPRIV=1时,在线程模式下无特权访问。在Handler模式下,总是在特权模式下访问D0位的。

Cortex-M4F中除了以上D1、D0位,还定义了D2位,D2位(FPCA)会在执行浮点指令时自动置1,当FPCA=1且发生了异常时,处理器的异常处理机制就认为当前上下文使用了浮点指令,这时就需要保存浮点寄存器,浮点寄存器的保存方式分多种,这里不再详细叙述,请读者参考《CM3/4权威指南》《ARMv7-M参考手册》。处理器硬件会在异常入口处清除FPCA位。

3.浮点寄存器

浮点控制寄存器只在 Cortex-M4F 中存在,其中包含了用于浮点数据处理与控制的寄存器,在这里只进行简单的介绍,详细内容请参考《CM3/4权威指南》《ARMv7-M参考手册》。此外,浮点单元还有一些不在内核中、可通过存储器映射的寄存器,如协处理器访问控制寄存器(CPACR)。需要注意的是,为降低功耗,浮点单元默认是被禁用的,如需使用浮点运算就要通过设置CPACR来启用浮点单元。

(1)S0~S31和D0~D15。S0~S31都是32位寄存器,每个寄存器都可用来存放单精度浮点数,它们两两组合可用来存放双精度浮点数,两两组合成双精度寄存器时可用D0~D15来访问,例如,D0是由S0和S1组合而成的。注意Cortex-M4F的浮点运算单元只能进行单精度浮点运算,不支持双精度浮点运算,但可以传输双精度浮点数。

(2)浮点状态控制寄存器(FPSCR)。浮点状态控制寄存器提供了浮点系统的应用程序级控制,包括浮点运算结果的状态信息,以及定义一些浮点运算的动作。浮点状态控制寄存器在系统复位时状态是未知的,其各位含义如表2-2所示,包括负标志(N)、零标志(Z)、进位/借位标志(C)、溢出标志(V)、交替半精度控制位(AHP)、默认模式控制位(DN)、清0模式控制位(FZ)、舍入模式控制位(RMode)、输入非正常累积异常位(IDC)、不精确累积异常位(IXC)、下溢累积异常位(UFC)、溢出累积异常位(OFC)、被零除累积异常位(DZC)、非法操作累积异常位(IOC)。

表2-2 浮点状态控制寄存器(FPSCR)的各位含义 fpM+0xdunTaFpD9BykRkK/9tPnG30RHm81T2RS2q61JunfRwWjJ+KbIuysD5FrYO

点击中间区域
呼出菜单
上一章
目录
下一章
×