
1.2 ARM Cortex-M4微处理器
ARM Cortex-M4微处理器高效的信号处理功能与Cortex-M微处理器系列的低功耗、低成本和易于使用的优点组合,旨在满足专门面向电动机控制、汽车、电源管理、嵌入式音频和工业自动化市场的新兴类别的灵活解决方案。
1.2.1 ARM Cortex-M4微处理器特点
1.高能效数字信号控制
Cortex-M4提供了无可比拟的功能,以将32位控制与领先的数字信号处理技术集成来满足需要很高能效级别的市场。Cortex-M4微处理器采用一个扩展的单时钟周期乘法累加(Multiply and Accumulate,MAC)单元、优化的SIMD指令、饱和运算指令和一个可选的单精度浮点单元(Float Point Unit,FPU)。这些功能以表现ARM Cortex-M系列微处理器特征的创新技术为基础。
1)RISC微处理器内核。高性能32位CPU、具有确定性的运算、低延迟3阶段管道,可达1.25DMIPS/MHz。
2)Thumb-2指令集。16位/32位指令的最佳混合、小于8位设备3倍的代码大小、对性能没有负面影响,提供最佳的代码密度。
3)低功耗模式。集成的睡眠状态支持、多电源域和基于架构的软件控制,可满足低功耗要求。
4)嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC)。低延迟、低抖动中断响应、不需要汇编编程和以纯C语言编写的中断服务例程,能出色完成中断处理。
5)工具和实时操作系统(Real Time Operating System,RTOS)支持。广泛的第三方工具支持、Cortex微控制器软件接口标准(Cortex Microcontroller Software Interface Standard,CMSIS)、最大限度地增加软件成果重用。实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的操作系统。因而,提供及时响应和高可靠性是其主要特点。
6)CoreSight调试和跟踪。JTAG(Joint Test Action Group)接口或2针串行线调试(Serial Wire Debug,SWD)连接,支持多处理器和实时跟踪。
此外,该微处理器还提供了一个可选的MPU,提供低成本的调试、追踪功能和集成的休眠状态,以增加灵活性。嵌入式开发者可以快速设计并推出令人瞩目的终端产品,具备最多的功能以及最低的功耗和尺寸。
2.易于使用的技术
Cortex-M4通过一系列出色的软件工具和CMSIS使信号处理算法开发变得十分容易。CMSIS是Cortex-M系列微处理器与供应商无关的硬件抽象层。使用CMSIS,可以为接口外设、实时操作系统和中间件提供一致且简单的处理器软件接口,从而简化软件的重用。使用CMSIS可缩短新微控制器开发人员的学习过程,从而缩短新产品的上市时间。
ARM目前正在对CMSIS进行扩展,将加入支持Cortex-M4扩展指令集的C编译器;同时,ARM也在开发一个优化库,方便MCU用户开发信号处理程序。该优化库将包含数字滤波算法和其他基本功能,例如,数学计算、三角计算和控制功能。数字滤波算法也将可以与滤波器设计工具和设计工具包(如MATLAB和LabVIEW)配套使用。
1.2.2 Cortex-M4微处理器结构
Cortex-M4微处理器的结构如图1-2所示,其中包括处理器内核CM4 Core、内核外设、调试和跟踪接口以及多条总线接口。

图1-2 Cortex-M4微处理器的结构
1.内核外设
内核外设包括存储保护单元(MPU)、嵌套向量中断控制器(NVIC)、系统控制模块(System Control Block,SCB)和系统定时器(System Timer,SysTick)。另外,在Cortex-M4F中,还有单精度浮点运算单元(FPU)。
(1)存储保护单元(MPU)
MPU是Cortex-M4中用于内存保护的可选组件。MPU支持标准的ARMv7保护存储系统结构PMSA模型。MPU将存储器分为若干区域,定义各区域的位置、大小、访问权限和存储属性等。MPU可为每一个区以及重叠区单独设置存储属性,还可将存储属性导出至系统。
存储属性确定存储区的访问行为。Cortex-M4微控制器定义了8个独立的存储区域即0~7区域和一个背景区域。背景区域的存储属性即为默认的存储器映射的属性,可以在特权软件执行模式下访问。当存储区域发生重叠时,存储访问受存储属性最高的区域的影响。例如,区域7的存储属性将被任何与其重叠的区域优先采用。
如果程序访问被MPU禁止的存储位置,处理器将产生存储器管理故障,导致故障异常,并可能导致操作系统环境中的进程终止。在操作系统环境下,内核可以动态更新MPU区域设置。在通常情况下,嵌入式操作系统使用MPU保护内存。
(2)嵌套向量中断控制器(NVIC)
NVIC的作用是实现低延迟中断处理。NVIC对所有的异常和中断进行优先级划分和处理,包括一个不可屏蔽中断(Non Maskable Interrupt,NMI),可以提供256个中断优先级。NVIC与处理器内核紧密集成,能够快速响应中断,使得中断延迟很低。中断发生时处理器状态被自动存储到堆栈,中断服务程序结束时又自动被恢复。向量的读取与状态保存并行,使处理器高效率进入中断。称为尾链(tail-chain)的优化功能使得相邻的中断响应不需要重复的状态保存和恢复,减少了相邻中断之间的切换时间。通过软件可设置7个异常(系统处理)和96个中断的8级优先级别。NVIC操作具有如下特点。
● 可配置1~240的外部中断。
● 可配置3~8级的优先级。
● 动态优先级中断。
● 优先级分组,可以选择优先中断级和非优先中断级。
● 确定而快速的中断处理,只需要12个周期或6个周期(相邻中断切换时)。
● 外部非屏蔽中断信号可用于安全的紧急应用。
● 通过硬件实现寄存器操作,可处理特殊的中断。
(3)系统控制模块(SCB)
SCB是编程模型与处理器之间的接口,用于系统控制,包括系统异常的配置、控制和报告等。
(4)系统定时器(SysTick)
SysTick是一个24位减数(递减到零再重装)计数器,可用作RTOS的节拍定时器或者一般的计数器。
(5)单精度浮点运算单元(FPU)
FPU专门用来进行浮点运算,Cortex-M4中的Cortex-M4F才有该模块,具体特点如下。
● 具有32位单精度浮点运算指令。
● 集成了乘法和累加指令集,用于提高运算精度。
● 对于数据转换、加法、减法、乘法运算和可选的累加、除法和开方运算都有硬件支持。
● 通过硬件支持非正规的以及所有IEEE的舍入模式。
● 具有32个专用的32位单精度寄存器,同时也可当作16个64位双精度的寄存器使用。
● 采用解耦三级流水线结构。
2.总线接口
总线包括AHB-Lite和APB,AHB-Lite总线的访问性能比APB高。3条AHB-Lite总线分别为ICode总线、DCode总线和系统总线(System Bus),ICode总线和DCode总线分别用于从代码空间取指令和数据,系统总线则用于访问SRAM和其他外设。
私有外设总线(Private Peripheral Bus,PPB)基于高级外设总线(APB),包括内部和外部两条总线。
1)内部PPB供以下设备使用。
● 仪表跟踪宏单元(ITM)。
● 数据观察点和跟踪(DWT)单元。
● Flash修补和断点(FPB)。
● 系统控制空间(System Control Space,SCS),包括存储器保护单元(MPU)和嵌套向量中断控制器(NVIC)。
2)外部PPB供以下设备使用。
● 跟踪端口接口单元(TPIU)。
● 嵌入式跟踪宏单元(ETM)。
● ROM表。
● 实施特定区域PPB存储器映射。
除此之外,Cortex-M4总线接口还有以下特点。
● 内存访问对齐。
● 支持位带(bit-band),包括位带原子的读写操作。
● 配有写缓冲区。
● 在多处理器系统中能单独访问。
3.调试跟踪接口
调试跟踪接口提供低成本且功能强大的调试、跟踪和分析功能,具有如下特点。
1)可以访问所有存储器、寄存器以及存储器映射的外设,当内核停止时可以访问内核寄存器。
2)采用串行调试端口(Serial Wire Debug Port,SW-DP)或者串行JTAG调试端口(Serial Wire JTAG Debug Port,SWJ-DP)。
3)可以访问以下设备。
● Flash修补和断点(Flash Patch and Breakpoint,FPB),实现Flash断点设置和代码修补。
● 仪表跟踪宏单元(Instrumentation Trace Macrocell,ITM),实现printf()方式的调试。
● 数据观察点和跟踪(Data Watchpoint and Trace,DWT)单元,实现观察点和数据的跟踪,以及系统分析。
● 跟踪端口接口单元(Trace Point Interface Unit,TPIU),可以连接到跟踪端口分析器(Trace Port Analyzer,TPA),包括单线输出(Single Wire Output,SWO)模式。
● 嵌入式跟踪宏单元(Embedded Trace Macrocell,ETM),实现指令跟踪。
1.2.3 Cortex-M4微处理器的编程模式
Cortex-M4微处理器的编程模式是指处理器的运行模式,包括以下两种。
1)主模式(Thread Mode)。用于执行应用软件的基本模式,复位后处理器进入该模式。
2)中断模式(Handler Mode)。用于处理异常的模式,所有异常在该模式下执行,执行完成后返回主模式。
在处理器模式下,软件执行有两种模式,即特权或者非特权模式。特权模式可以执行所有指令并访问所有资源,而非特权模式将不能或有限制地执行某些指令(如MSR、MRS、CPS)及访问某些资源(如系统时钟、NVIC、SCB、某些存储器及外设等)。主模式可以执行特权或者非特权模式,中断模式则总是执行特权模式。
1.2.4 Cortex-M4微处理器的堆栈
堆栈是一种寄存器的使用模型,由一块连续的内存和一个堆栈指针组成,用于实现“后进先出”的缓冲区。其典型应用是在发生中断时,执行中断处理程序前后保护和恢复现场数据。对于具体的堆栈形式,既可以“向上生长”,又可以“向下生长”。
1. Cortex-M4的堆栈
Cortex-M4使用的是“向下生长”的堆栈模型,即堆栈指针SP指向最后一个被压入堆栈的32位数值,在下一次压栈时,SP先自动减4,再存入新的数值。初始化堆栈时,堆栈指针SP指向的第一个地址,叫作栈顶地址。
在Cortex-M4中,堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
栈顶地址即堆栈大小的选择需要谨慎考虑。如果栈顶地址选择过低,即堆栈较小,则在中断嵌套大量消耗堆栈的情况下容易造成堆栈溢出,进而可能改写其他内存数据,出现不可预料的后果;如果栈顶地址偏高,即堆栈过大,则容易造成内存浪费,影响其他场合对内存的使用。
2.双堆栈机制
在Cortex-M4中,堆栈分为两个:主堆栈(Main Stack,MS)和进程堆栈(Process Stack,PS)。两个堆栈分别存储在内存中,是两个不同的栈顶地址,但在同一时刻只能使用其中一个,不能同时使用。两个堆栈的选择是通过控制寄存器(CONTROL)的第1位,即CONTROL[1]来决定的,使用说明如下。
1)当CONTROL[1]=0时,只使用MS,这也是复位后的默认使用方式,一般用于普通用户的程序堆栈。
2)当CONTROL[1]=1时,使用PS,一般供OS(操作系统)使用,其作用是在使用OS的环境下防止用户的程序堆栈破坏OS使用的堆栈。
1.2.5 Cortex-M4微处理器的内核寄存器
Cortex-M4微处理器的内核寄存器如图1-3所示,包括以下寄存器。
1)13个32位的通用寄存器R0~R12。寄存器R0~R7可被所有指定了通用寄存器的指令访问;R8~R12则只能被指定了通用寄存器的32位指令访问,不能被16位指令访问。
2)堆栈指针寄存器(SP)即R13。在线程模式下采取双堆栈机制。
3)链接寄存器(LR)即R14。用于从程序计数器PC接收跳转指令(BL、BLX)的程序返回地址,也可用于存储子程序、函数调用、中断等的返回信息,其他时间则可作为一般寄存器。
4)程序计数器(PC)即R15。用于保存当前程序地址。
5)特殊用途的程序状态寄存器(xPSR)。用于保存当前程序的执行状态信息。

图1-3 Cortex-M4微处理器的内核寄存器
1.2.6 Cortex-M4微处理器的存储器映射
Cortex-M4微处理器的存储器空间大小为4GB,共分为8个区域,如图1-4所示。各区简介如下。
1)代码区(Code):大小为0.5GB,存储程序代码,指令通过ICode总线访问,数据通过DCode总线访问。
2)内部SRAM区:大小为0.5GB,存储数据,指令和数据均通过系统总线访问。
3)内核外设区(Peripheral):大小为0.5GB,指令和数据均通过系统总线访问。
4)外部RAM区(External RAM):大小为1GB,指令和数据均通过系统总线访问。
5)外部设备区(External device):大小为1GB,指令和数据均通过系统总线访问。
6)内部私有外设总线区(Private Peripheral Bus-Internal):大小为256KB,通过内部PPB访问,该区域为不可执行区域(Execute Never,XN)。
7)外部私有外设总线区(Private Peripheral Bus-External):大小为768KB,通过外部PPB访问,该区域为不可执行区域。
8)系统区(System):大小为511MB,为器件制造商的系统外设区,该区域为不可执行区域。

图1-4 Cortex-M4F的存储器空间
1.2.7 Cortex-M4指令集
由于历史原因,从ARM7TDMI开始,ARM微处理器一直支持两种形式上相对独立的指令集。
1)32位的ARM指令集:效率较高,对应ARM状态。
2)16位的Thumb指令集:理论上代码密度比32位的ARM指令集提高了一倍,对应Thumb状态。
处理器在执行不同的指令集时,对应不同的状态。在ARM状态下,左右指令均是32位的;而在Thumb状态下,左右指令都是16位的,代码密度提高一倍。不过,Thumb状态下的指令功能只是ARM下的一个子集,可能需要更多条指令去完成相同的工作,导致处理性能下降。
为了取长补短,很多应用程序都采用ARM和Thumb混合编程的方法,但是这种混合编程在时间和空间上有额外开销,这些开销主要发生在状态切换之时。另一方面,ARM代码和Thumb代码需要不同的编译方式,这也增加了软件开发管理的复杂度。
Cortex-M4采用Thumb-2指令集,支持32位字、16位半字和8位字节数据类型,支持32位和16位指令,同时还支持64位数据传输指令。Cortex-M4的指令集除了包括常规的数据传输、存储器读/写、堆栈操作、算术运算、算术逻辑、条件转移和单周期硬件乘除等指令外,还包括浮点运算、32位数乘以32位数的长乘法指令等。此外还有一些特殊用途指令。
1. Thumb指令集
Thumb指令集是ARM体系结构中的一种16位指令集。Thumb指令集可以看作是ARM指令压缩形式的子集,是为了提高代码密度而提出的,理论上代码密度比32位的ARM指令集提高了一倍。
Thumb指令集并不完整,只支持通用功能,必要时仍需要使用ARM指令(如异常和中断都需要在ARM状态下处理)。另外,在Thumb模式下,较小的指令码其功能也较少。例如,只有分支可以是条件式的,且许多指令码无法存取所有的CPU的暂存器。
2. Thumb-2指令集
在ARMv6内核中,出现了32位的Thumb-2指令集。Thumb-2技术在基于ARMv7体系结构的处理器中,扮演了重要的角色。Thumb-2技术具有以下特点。
1)Thumb-2技术是以ARM Cortex体系为基础的指令集,提升了众多嵌入式应用的性能、能效和代码密度。
2)Thumb-2技术以Thumb为基础进行构建,增强了ARM微处理器的内核功能,从而使开发人员能够开发出低成本且高性能的系统。
3)Thumb-2技术使用少于31%的内存以降低系统成本,同时提供比现在高密度代码高出38%的性能,因此可延长电池寿命,或丰富产品功能集。
4)Thumb-2指令集是16位指令集的一个超集。在Thumb-2中,16位指令与32位指令并存,兼顾了代码密度与处理性能。
Cortex-M4支持Thumb和Thumb-2指令集,这样便不需要在不同的状态下切换,避免了不必要的切换带来的额外开销。同时不需要分开编译,降低了编译难度。这意味着Cortex-M4内核不再完全兼容之前的ARM汇编程序,使用ARM指令集编写的汇编语言程序不能直接进行移植。不过,Cortex-M4支持绝大多数传统的Thumb指令,因此用Thumb指令编写的汇编程序可以相对容易地进行移植。
1.2.8 Cortex-M4的中断与异常处理
1.中断与异常处理特点
Cortex-M4微处理器及其NVIC在中断模式下处理所有异常。当出现异常时,将产生中断,处理器的状态将被自动存储到堆栈中,并在中断服务程序(Interrupt Service Routine,ISR)结束时自动从堆栈中恢复。NVIC取出中断向量和保存状态是同时进行的,因此提高了进入中断的效率。另外,处理器还具有中断末尾连锁功能,即当有两个相邻的中断发生时,前一个中断处理结束后,后一个中断无须保存和恢复状态便可执行连续的中断,减少了中断响应时间。
2.异常类型
异常共包括10种异常和96个中断,如表1-2所示。异常包括复位、不可屏蔽中断(NMI)、硬故障、存储器管理故障、总线故障、使用故障、监管调用(SVCall)、调试监控器、PendSV和SysTick。
3.异常优先级
除复位、NMI和硬故障有固定优先级外,软件可以针对其余7种异常和96种中断设置8种优先级。异常的优先级通过NVIC的系统处理寄存器SYSPRIn设置,中断的优先级通过NVIC的中断优先级寄存器PRIn设置。中断使能通过NVIC的中断使能设置寄存器ENn设置。可以通过将优先级分成抢占优先级和子优先级来进行分组。
表1-2 异常类型

异常优先级如表1-2所示,优先级号码越小,级别越高,最高优先级为-3。可编程优先级的默认优先级可由软件设定为0~7,默认优先级为0,也是用户可编程优先级的最高级别,仅次于复位、NMI以及硬件故障。
当有多个优先级相同的异常处于悬挂状态时,异常向量号(如表1-2所示)较小的优先处理。当有更高优先级别的异常发生时,正在处理的异常将被抢占。
4.异常状态
异常状态包括4种,分别如下。
1)待用:即没发生异常。
2)悬挂:一个异常正在等待处理器处理。外设或者软件的中断请求可使中断进入悬挂状态。
3)激活:一个异常请求正在被处理器处理,但还没有完成。
4)激活并悬挂:一个异常请求正在被处理器处理,但是又有一个同样的异常被悬挂。
5.异常处理器
所有异常和中断分别通过以下3种异常处理器来处理异常。
1)中断服务程序(ISR):所有中断通过ISR处理。
2)故障处理器:硬故障、存储器管理故障、总线故障和使用故障由故障处理器处理。
3)系统处理器:10种异常,包括4种故障异常,都属于系统异常,都由系统处理器处理。