1.2 ARM Cortex-M3微处理器
Cortex-M3是首款基于ARMv7-M架构的处理器,具有门数少、低功耗、中端延迟时间短、调试的开销低等特点,能实现快速的中断响应,是专门为了在微控制器、汽车车身系统、工业控制系统和无线网络等对功耗和成本敏感的深度嵌入式应用领域实现高系统性能而设计的,它大大简化了可编程的复杂性,使ARM架构成为各种应用方案的上佳选择。
Cortex-M3处理器整合了以下组件:
① 处理器内核。这款门数目少,中断延迟短的处理器具备以下特性:
· ARMv7-M构架:Thumb-2指令集(ISA)子集;
· 只有分组的SP堆栈指针;
· 硬件除法指令,SDIV和UDIV(Thumb 32位指令);
· 处理模式(Handler mode)和线程模式(Thread mode);
· Thumb状态和调试状态;
· 可中断-可继续(Interruptible-continued)的LDM/STM,PUSH/POP指令,实现低中断延迟;
· 自动保存和恢复处理器状态,可以实现低延迟地进入和退出中断服务程序ISR;
· 支持ARMv6架构BE8/LE(字节不变大端/小端)访问;
· 支持ARMv6非对齐访问。
② 嵌套向量中断控制器(NVIC)。它与处理器内核紧密结合实现低延迟中断处理,并具有以下特性:
· 外部中断可配置为1~240个;
· 优先级位可配置为3~8位;
· 中断优先级可动态地重新配置;
· 优先级分组,分为占先中断等级和非占先中断等级;
· 支持末尾连锁(Tail-chaining)和迟来(Late arrival)中断;
· 处理器状态在进入中断时自动保存,中断退出时自动恢复,不需要多余的指令。
③ 存储器保护单元(MPU)。MPU功能可选,用于对存储器进行保护,它具有以下特性:
· 8个存储器区;
· 子区禁止功能(SRD),实现对存储器区的有效使用;
· 可使能背景区,执行默认的存储器映射属性。
④ 总线接口:
· AHB-Lite I-Code、D-Code和系统总线接口;
· 基于APB总线接口的专用外设总线PPB;
· 位带(Bit band)支持,位带的原子写和读访问;
· 存储器访问对齐;
· 写缓冲区,用于缓冲写数据;
· 多处理器系统的独占访问传送器(Exclusive access transfers)。
⑤ 低成本调试解决方案。其具有以下特性:
· 对系统中包括存储器映像设备、内核寄存器在内的所有存储器和寄存器进行调试访问;
· 串行线(SW-DP)或串行线JTAG(SWJ-DP)调试访问,或两种都包括;
· Flash修补和断点单元(FPB),实现断点和代码修补;
· 数据观察点和触发单元(DWT),实现观察点、触发源和系统分析;
· 仪表跟踪宏单元(ITM),支持对printf类型的调试;
· 跟踪端口的接口单元(TPIU),用来连接跟踪端口分析仪(TPA);
· 可选的嵌入式跟踪宏单元(ETM),实现指令跟踪。
1.2.1 Cortex-M3的版本
Cortex-M3处理器的版本号使用rnpn的形式来表示。这里:
rn表示产品的主版本号。
pn表示产品的从版本号或者修改状态。
到本书出版前为止,Cortex-M3处理器的主版本有三个:r0、r1、r2,每个主版本又包含不同的从版本,最新的版本是r2p1。为了判定使用的处理器使用了哪个版本的Cortex-M3内核,可以使用NVIC中的CPUID寄存器,Revision和变种位段指出了具体使用的Cortex-M3版本,见表1-3。
表1-3 CPUID基寄存器(地址:0xE000_ED00)
1.Cortex-M3处理器r0版本与r1的版本区别
早期的Cortex-M3产品是基于Cortex-M3处理器r0版本的。在2006年第3季度之后的Cortex-M3产品可以使用r1版本。了解自己使用的芯片基于哪个版本是很重要的,因为在r1版本中作出了许多重要的改变和改进。
在编程模型中显著的改变包括如下内容:
· 从r1版本开始,响应异常时的寄存器操作可以被配置成强制对齐到双字边界,这可以通过置位NVIC_CCR.STKALIGN来启用;
· 因为上面的原因,NVIC_CCR中加入了STKALIGN位;
· r1版本中引入了新的AUXFAULT(辅助fault)状态寄存器(可选);
· DWT中添加了诸如数值匹配的新功能;
· ID寄存器的值因版本号位段变化而改变。
在编程模式中隐含的改变更多,它们是:
代码存储空间的存储器被硬线连接到可缓存、已分配、不可缓冲、不可共享4种属性。这会影响I-Code AHB和D-Code AHB,但是不会影响系统总线接口。
支持在I-Code AHB和D-Code AHB间的总线复用操作。在此操作模式下,可以使用一个简单的总线复用器来把I-Code和D-Code归并,这可以降低总门数,旧版本中则必须使用ADK总线矩阵组件。
新添加了用于连接AHB跟踪单元(HTM)的输出端口。AHB是CoreSight中定义的一个调试组件,服务于复杂的数据跟踪操作。
调试组件或调试寄存器可以在系统复位期间访问,只有在上电复位时才无法访问。
在r1版本中,NVIC_ICSR.VECTPENDING位段会受NVIC_DHCSR.C_MASKINTS位的影响:当C_MASKINTS置位时,如果屏蔽了一个悬起的中断,会使VECTPENDING的值为零。
JTAG-DP调试接口被SWJ-DP模块取代。但是仍然允许芯片厂商使用JTAG-DP,因为它也是CoreSight家庭中的成员。串行线JTAG调试端口(SWJ-DP)把SW-DP和JTAG-DP的功能合二为一,并且支持自动协议检测。使用这个组件,Cortex-M3设备可以支持SW和JTAG接口。
因为r0版本的Cortex-M3在响应异常时没有双字对齐堆栈的功能,有些编译器,如ARM的RVDS和Keil的RVMDK,都提供了特殊的编译选项以决定是否允许软件调整入栈,以使开发出来的产品是EABI兼容的,当软件需要与其他EABI-兼容开发工具时,这是相当重要的。
2.Cortex-M3处理器r1版本与r2版本的区别
在2008年中期,Cortex-M3的r2版本开始发布。r2版本新增了很多特性,这些特性大多都致力于降低功耗以及提高调试的灵活性。
在r2版本中,编程模式有以下的更新:
(1)双字堆栈对齐方式成为默认值
影响异常入栈顺序和内存使用的双字堆栈对齐方式,在r2版本中成为默认使用的方式。使用此方式,会给大多数C程序减少启动代码的额外开销(无须再在NVIC配置控制寄存器中置位STKALIGN位)。
(2)新增辅助控制寄存器
为了更精细地调校处理器的行为方式,新增了辅助控制寄存器。比如,为了调试方便,通过设置此寄存器,可以关闭Cortex-M3的写缓冲,从而使总线Faults总是能与存储器访问指令同步,也就是确保总线Faults总是精确的。
(3)调试功能
r2版本对调试功能有以下3处改进:
① DWT中的观察点数据跟踪目前支持两种新的跟踪方式:仅跟踪读传送,以及仅跟踪写传送。这样就可以仅在数据被改变或被读时才产生跟踪数据流,于是降低了数据跟踪所需的带宽。
② 在实现调试特性时提供了更高的灵活性。例如,允许裁减可用的断点和观察点数,这样就降低了所设计产品的尺寸,这对于超低功耗的设计非常有帮助。
③ 对多核系统的调试支持力度更大。为了实现多核同时重启和单步执行,新增了一个多处理器系统的独占访问传送器。
(4)睡眠特性
在系统级设计层上,现有的睡眠特性也得到了改进。在r2p0中,对处理器的唤醒可以延迟,从而使芯片中可以更大面积地掉电,并且在系统中所有其他部件都就绪后才继续执行程序。这个改进主要是为了兼顾某些应用,在这些应用中,有一些硬件在低功耗模式下需要关闭,但是重新打开这些硬件需要的时间较长。
在睡眠功能的扩展之外,为降低功耗还有新方法。在旧版的Cortex-M3中,为了让内核能醒来,在睡眠期间,依然不能停止送往内核的“自由运行时钟”。尽管该时钟消耗的能量很低,但依然是关了更省电。
为解决这个问题,可以在处理器外面布设一个简单的中断控制器。将这个控制器取名为“唤醒中断控制器(WIC)”。在深度睡眠期间,它要提供在NVIC中的“中断屏蔽功能”的镜像,并且负责告知电源管理系统何时需要唤醒。这样,就可以在深度睡眠期间关断所有送往Cortex-M3处理器的时钟了。
除了可以停止时钟外,r2版本还可以使处理器的大多数部分都掉电,把它们的状态存储在若干特殊的逻辑单元中。在中断到达时,WIC向电源管理单元(PMU)发送一个唤醒请求。在处理器重新上电后,先前的状态从特殊的逻辑单元中恢复,然后就可以响应这个中断了。
可见,有了r2版本中这个新的掉电功能,Cortex-M3可以在深度睡眠期间进一步降低功耗。不过,这个特性还需要内核外的单元配合,因此不一定在所有r2版本的产品中都支持。
2010年7月份发布的r2p1版本Cortex-M3相对于r2p0版本又有了很多新的改进:
· 增加了新的执行选项,以确保在等待状态传输期间AHB的不间断控制。
· 增加了移除bit-banding逻辑的执行选项。
· 增加MPUDISABLE输入,可以通过硬件禁用MPU。
· 增加一条DBGEN输入作为主调试使能,如果上拉为高电平,调试被禁用。
· ETM从ARM ETM架构V3.4升级到V3.5,包括了全局的时间戳。
· 位于地址0xE000ED08的向量表偏移寄存器已从29:7增加两位至31:7。
· ROM表的标识寄存器已被更新。
· Verilog文 件 和 模 块 名 已 被 修 改。现 在 为 大 写 字 母 的:CORTEXM3、CORTEXM3INTEGRATION Cortex-M3和集成层的顶层模块名。
· ETM许可证定义名称已更改为ARM_CM3_ETM_LICENSE,并且定义在cm3_lic_defs.v中,而不是定义在集成级别。
· 如果处理被MPU中止,观察点将不再出现。
· 修正了r2p0版本中的错误。
1.2.2 Cortex-M3处理器应用领域
Cortex-M3是32位处理器,适用于具有高确定性的实时应用,主要应用领域有:
① 替代8位、16位单片机:Cortex-M3与生俱来就适合制作单片机,甚至简单到用于制作玩具和小电器的单片机,都能使用Cortex-M3作为内核。这本是8位机和16位机统治最牢固的领域,但是由于Cortex-M3更便宜、更高性能、更易使用,所以值得开发者转到这个新的32位ARM系统中来。
② 汽车电子:Cortex-M3也是汽车电子的最佳选择。Cortex-M3同时拥有非常高的性能和极低的中断延迟,实时性好。Cortex-M3处理器能支持多达240个外部中断,内建了嵌套向量中断控制器,还可以选配存储器保护单元MPU,使它非常适用于高集成度低、成本的汽车应用。
③ 数据通信:Cortex-M3的低成本、高效率,再加上Thumb-2的强大位操作指令,使Cortex-M3非常适合于很多数据通信应用,尤其是无线数传和Ad-Hoc网络,如ZigBee和蓝牙等。
④ 工业控制:在工控场合,关键的要素是简洁性、快速响应性以及可靠性。Cortex-M3处理器的中断处理能力、低中断延迟和强大的异常处理能力,足以让它能广泛地应用于工业控制领域。
⑤ 消费类产品:以往,在许多消费产品中,都必须使用一块甚至好几块高性能的微处理器。Cortex-M3处理器的高性能和MPU机制可是足以让复杂的软件运行起来,同时提供健全的存储器保护。
目前在市场上已经存在很多基于Cortex-M3内核的处理器产品,最便宜的还不到1美元,让ARM最终实现比很多8位单片机更便宜。
1.2.3 Cortex-M3处理器的实现
Cortex-M3处理器的结构如图1-4所示。Cortex-M3处理器内核是单片机的中央处理单元(CPU),完整的基于Cortex-M3的MCU还需要很多其他组件。在芯片制造商得到Cortex-M3处理器内核的使用授权后,它们就可以把Cortex-M3内核用在自己的硅片设计中,然后添加存储器、外设、I/O以及其他功能块。不同厂家设计出的单片机会有不同的配置,包括存储器容量、类型、外设等都各具特色。
图1-4 Cortex-M3处理器的结构
在根据自己的应用选择具体的Cortex-M3芯片时,除了要考虑存储器、外设配置以及最高主频之外,其他一些因素也会使一款Cortex-M3芯片与众不同,Cortex-M3的设计允许下列参数是可配置的:
· 外中断的数目;
· 表达优先级的位数(3~8位);
· 是否配备了MPU;
· 是否配备了ETM;
· 对调试接口的选择(SW/SWJ)。
对于大多数项目而言,处理器的功能和规格是我们在选择时的首要考虑因素,例如:
① 外设:对于大多数的项目,片载的外设是最重要的选择依据。外设也并非多多益善,因为它会影响到功耗和价格。
② 存储器:Cortex-M3单片机的闪存可以少到几KB,多至几MB。此外,片内RAM的容量也是很重要的。这些参数往往对价格有重大的冲击。
③ 时钟速度:Cortex-M3的设计可以在0.18μm的粗线条工艺上,频率可轻松达到100MHz。然而,因为存储器访问速度的限制,芯片厂商会降低最大主频。
④ 封装:Cortex-M3单片机的封装也多种多样。很多Cortex-M3单片机的脚数都比较少,以使之更适合于低成本的应用。
目前Cortex-M3处理器内核的授权客户数已达到数十家,包括东芝、ST、Cypress、Ember、Accent、Actel、ENERGY、ADI、NXP、TI、Fujitsu、Atmel、Broadcom、Samsung、Zilog、Fuzhou Rockchip Electronics CO. Ltd.和Renesas,其中ST、TI、NXP、Atmel和东芝已经推出基于Cortex-M3的MCU产品。据ARM公司统计,目前基于ARM内核的MCU产品已超过450款,其中基于Cortex-M3的MCU产品也已超过250款。