ARM Cortex-M

恩智浦半导体和Silicon Labs所设计的ARM Cortex-M0和and Cortex-M3微控制器（Energy Micro）
STM32F100C4T6B IC的裸晶24  MHz ARM Cortex-M3 单片机，有16千字节闪存，4 KB RAM。由意法半导体生产
ARM Cortex-M是ARM架构处理器核心中，低阶系列的统称，由安谋控股所授权。这组核心的特点为低成本以及高能源效率的微处理器而最佳化设计，已有上千万个消费性设备中有此系列的微处理器。此系列核心包括Cortex-M0、Cortex-M0+、Cortex-M1、Cortex-M3、Cortex-M4、Cortex-M7、Cortex-M23、Cortex-M33、Cortex-M35P和Cortex-M55。其中Cortex-M4 / M7 / M33 / M35P / M55 核心有浮点运算器的选项，若有浮点运算器的选项，会在型号后面说明，例如Cortex-Mx with FPU或Cortex-MxF，其中x是核心编号。

**简介**
ARM Cortex-M系列是为了单片机、特殊应用积体电路（ASIC）、应用专门标准产品（ASSP）、现场可编程逻辑门阵列（FPGA）及单片系统（SoC）设计的ARM微处理器核心。Cortex-M核心常用在
专用微控制器晶片中，但也会藏在SoC晶片中，例如电源管理制器、输入／输出控制器、系统控制器、触碰萤幕控制器、智慧电池控制器以及感测器控制器。
以往8位元的微控制器相当流行，但低阶的Cortex-M晶片已经降价，占据了一些8位元微控制器的市场。在取代8位元微控制器时，Cortex-M是常出现的选项，因为有32位元数学运算上的优势，也会用来替换一些较旧的ARM核心 ，例如ARM7及ARM9。

**授权**
安谋控股不会以其自身的技术生产CPU或贩售CPU，而是其将处理器的架构授权给其他有意愿开发的公司。安谋有许多不同的授权条款，差异在成本以及可交付成果。对于所有的授权，安谋都会提出一份可整合的ARM核心硬体描述，也包括完整的软体开发工具组，以及贩售包括ARM CPU在内的积体电路的权利。

**矽定制**
整合元件制造厂（IDM）收到的ARM处理器知识产权，是可逻辑综合的寄存器传输级（用Verilog所写）。以此型式，整合元件制造商可以进行架构层级的最佳化以及延伸，可以让制造商达成其客户的设计目的，例如高时脉速度、非常低的能耗、指令集延伸（包括浮点数）、针对大小的最佳化、除错器的支援等。若要确认特定的ARM CPU晶片中已有那些功能，则需确认制造商的资料表以及相关文件。
Cortex-M核心的部份选配机能如下：- SysTick计时器：24位元的系统计时器，延伸了处理器以及巢状向量中断控制器（Nested Vectored Interrupt Controller、NVIC）的机能。若有此计时器，也可以提供额外的SysTick中断，可以配置其优先权。虽然SysTick计时器不是必备的，不过几乎没有不支援SysTick的Cortex-M微处理器。若Cortex-M33控制器有安全扩展（Security Extension）选项，会有二个SysTicks，一个是安全的，另一个是一般的。- 位元带（Bit-Band）：位元带区域内记忆体中的每一个位元，可以个别映射到一个字元组。例如，写入特定的假名字元组，就代表设定或是清除位元带区域内特定的位元。因此位元带区域内的每一个位元都可以透过字元组对齐的位址来直接读写。而且，每一个位元都可以用C/C++进行设定、清除、反相等功能，不需要透过一连串畗读取-修改-写入的指令顺序。位元带也不是Cortex-M一定会有的功能，不过不支援位元带的Cortex-M3或Cortex-M4微处理器较不常见。有些Cortex-M0及Cortex-M0+微处理器也会有位元带。- Memory protection unit（MPU）：透过强制的权限以及存取规则，可以保护特定区域的记忆体。最多可以支援八个不同的记忆体区域，每个还可以分成八个等大小的子区域。- 紧密耦合记忆体（Tightly-Coupled Memory、TCM）：是低延迟的RAM，可以保存关键性的程序、资料及堆叠。紧密耦合记忆体一般会是微处理器中最快的RAM，仅次于缓存记忆体。- 注：大部份Cortex-M3及M4的微处理器有位元带及记忆体保护单元。M0/M0+可以用Cortex-M系统开发工具加入位元带选项- 注：软体在试图使用特定机能时，需要先确认该机能是否有效- 注：Cortex-M35P的公开资料不多，一直到其技术参考手册发行后才有改善。
额外的矽智财选项：- 字节序：小端序（Little-endian）或大端序（big-endian）。Cortex-M和其他早期的ARM核心不同，在制作晶片时就要选用小端序或大端序。- 中断：1至32个（M0/M0+/M1）、1至240个（M3/M4/M7/M23）、1至480个（M33/M35P）- 唤醒中断控制器：选配- 向量表位移暂存器：选配（M0没有此选项）- 指令存取宽度：只有16位元，或几乎是32位元- 支援使用者／特取模式：选配- 重置所有的暂存器：选配- 单一周期的I/O埠：选配（M0+/M23）- 除错存取埠（DAP）：无、SWD、JTAG及SWD（所有Cortex-M核心都有此选项）- 支援Halting除错：选配- 监视点比较器数量：0至2个（M0/M0+/M1），0至4个（M3/M4/M7/M23/M33/M35P）- 中断点比较器数量：0至4个 (M0/M0+/M1/M23)，0至8个（M3/M4/M7/M33/M35P）

**ARMv7E-M指令集**
Cortex-M0 / M0+ / M1实现的是ARMv6-M架构，Cortex-M3实现的是ARMv7-M架构，Cortex-M4 / Cortex-M7实现的是ARMv7E-M架构。Cortex-M23 / M33 / M35P实现的是ARMv8-M架构，Cortex-M55实现的是ARMv8.1-M架构。这些架构是二进制的指令码，可以和ARMv6-M、 ARMv7-M、ARMv7E-M向上相容。Cortex-M0 / Cortex-M0+ / Cortex-M1的指令码不用修改就可以在Cortex-M3 / Cortex-M4 / Cortex-M7上执行。Cortex-M3上可以执行的二进制程式码不需修改就可以在Cortex-M4 / Cortex-M7 / Cortex-M33 / Cortex-M35P上执行。Cortex-M架构中支援Thumb-1和Thumb-2的指令集，不支援早期的32-bit ARM指令集。
所有Cortex-M的核心都有一个共通的指令子集，包括大部份Thumb-1指令、一些Thumb-2指令，以及结果为32位元的乘法。Cortex-M0 / Cortex-M0+ / Cortex-M1 / Cortex-M23设计目的就是希望让矽晶面积最小，因此其指令集也是Cortex-M家族中最少的。
Cortex-M0 / M0+ / M1中有Thumb-1指令，不过没有ARMv7-M架构才加入的指令（CBZ, CBNZ, IT）。Cortex-M0 / M0+ / M1包括一小部份的Thumb-2指令（BL, DMB, DSB, ISB, MRS, MSR）。Cortex-M3 / M4 / M7 / M33 / M35P 有所有基本的Thumb-1和Thumb-2指令。Cortex-M3加上了三个Thumb-1指令、所有的Thumb-2指令、硬体的整体除法、以及饱和运算指令。Cortex-M4加上了数位讯号处理（DSP）指令，以及可选的单精度浮点运算器（VFPv4-SP）。Cortex-M7加上了可选的双精度浮点运算器（VFPv5）。Cortex-M23 / M33加上了TrustZone指令。- 注：Cortex-M0／M0+／M1不包括以下16位元的Thumb-1指令：CBZ, CBNZ, IT。- 注：Cortex-M0／M0+／M1只包括以下32位元的Thumb-2指令：BL, DMB, DSB, ISB, MRS, MSR.- 注：Cortex-M0／M0+／M1／M23只有乘积结果为32位元的乘法指令（32bit × 32bit = lower 32bit），而Cortex-M3／M4／M7／M33／M35P有32位元相乘，结果为32位元的乘法指令（32bit × 32bit = 64bit）。Cortex-M4／M7（M33／M35P可选）包括DSP乘法指令 (16bit × 16bit = 32bit）、（32bit × 16bit = upper 32bi）、（32bit × 32bit = upper 32bit）ref name="ARMv6-M-Manual"/> - 注：要计算完乘法及除法的周期数依ARM Cortex-M的核心设计而不同。有些核心有较快速度或是较小尺寸的矽智财选项，因此核心可能用较少的矽面积，但需要的周期数较长。在执行除法指令或慢速迭代乘法指令时发生的中断会让处理器放弃其指令，在中断结束后再继续。
**Cortex-M0/M0+/M23中，结果为32位元的乘法可以选择是1个周期或是32个周期。Cortex-M1可以选择是3个周期或是33个周期。Cortex-M3/M4/M7/M33/M35P都是一个周期。.
**Cortex-M3中，结果为32位元的乘法指令，可能是3–5个周期（视数值而定）。Cortex-M4/M7/M33/M35P是一个周期。
**Cortex-M3/M4的除法指令是2–12个周期（视数值而定）。Cortex-M7是3–20个周期（视数值而定）。Cortex-M23有17个周期或34个周期的选项。Cortex-M33是2–11个周期（视数值而定）。Cortex-M35P的资料还不确定。
*注：Cortex-M4 / M7 / M33 / M35P有不含FPU的矽智财选项，或是单精度（SP）的FPU，Cortex-M7加上第三个矽智财选项，可以支援单精度以及双精度（DP）的FPU。若Cortex-M4 / M7 / M33 / M35P有FPU，其型号会是Cortex-M4F / Cortex-M7F / Cortex-M33F / Cortex-M35PF.。
*注：Cortex-M系列包括三个新的16位元睡眠模式Thumb-1指令：SEV, WFE, WFI。
*注：中断延迟周期计数假设
**1.堆叠放在零等待状态RAM
**2.没有在执行其他的中断
**3.没有安全延伸机能选项（因为会增加周期）
*注：哈佛架构的Cortex-M，其中断延迟周期计数会比较短。- 注：针对Cortex-M4 / M7 / M33 / M35P，单精度（SP）浮点运算器指令只有在矽智财中有SP FPU选项时才有效。- 注：针对Cortex-M7，双精度（DP）浮点运算器指令只有在矽智财中有DP FPU选项时才有效。

**停用机能**
ARM Cortex-M系列的ARM架构，已停用一些早期核心的穖能：- Cortex-M核心中没有32位的ARM指令集。- 字节序在矽智财实现时就需要决定。早期的核心允许依MCU资料字节序模式设定而调整。- Cortex-M核心不支援辅助处理器，一直到ARM Cortex-M33/M35P核心的ARMv8-M Mainline才重新支援此一选项。
32位元ARM指令的能力和Thumb-1和Thumb-2指令集有很多地方重叠了，不过有些ARM的特征找不到类似的特性。- SWP和SWPB（swap）ARM架构在Cortex-M中没有类似的架构。
16位元Thumb-1指令集最早是出现在早期ARMv4T架构的ARM7T核心，随着时代而演进。在ARMv5 / ARMv6 / ARMv6T2　架构问世时，Thumb-1指令集也有扩充。不过也有移除一些Thumb-1指令。- 不存在BLX 指令，此指令是用来从Thumb-1切换到ARM的指令集。BLX 指令在Cortex-M系列仍然支援。- 不存在SETEND指令，因为不允许在执行时切换字节序。- 不支援辅助处理器指令，一直到ARM Cortex-M33/M35P核心的ARMv8-M Mainline才重新支援此些指令。- SWI指令更名为SVC，虽二进位码相同。不过SVC的处理程式和SWI的处理程式在例外模式的处理上差很多。

**Cortex-M0**
Cortex-M0核心是依小矽晶元面积以及最低价晶片进行最佳化的核心。
Cortex-M0核心的主要特点有：- ARMv6-M架构- 三层管线- 指令集：
** Thumb-1（大部份），但没有CBZ, CBNZ, IT
** Thumb-2（少部份），只有BL, DMB, DSB, ISB, MRS, MSR
** 32-bit硬体整数乘法，结果也是32-bit- 1到32个中断，以及Non-maskable interrupt
矽智财选项：- 硬体整数乘法速度：1周期或32周期。

**Cortex-M0+**
Cortex-M0+是以Cortex-M0再进行优化的版本。Cortex-M0+支援所有Cortex-M0的指令，因此可以用相同的编译器以及除错工具。Cortex-M0+的管线由三层变成二层，因此耗能较少。除了Cortex-M0已有的除错功能外，Cortex-M0+增加了称为微追踪缓冲区（Micro Trace Buffer、MTB）的选项，有简易的指令追踪缓冲区。Cortex-M0+也有加入Cortex-M3和Cortex-M4的一些特点，是以矽智财选项的方式加入，例如记忆体保护单元（MPU），以及中断向量表重新定位。
Cortex-M0+核心的主要特点有：- ARMv6-M架构- 二层管线（比Cortex-M0少一层）- 指令集（和Cortex-M0）相同
** Thumb-1（大部份），但没有CBZ, CBNZ, IT
** Thumb-2（少部份），只有BL, DMB, DSB, ISB, MRS, MSR
** 32-bit硬体整数乘法，结果也是32-bit- 1到32个中断，以及不可遮罩中断
矽智财选项：- 硬体整数乘法速度：1周期或32周期。- 八个区块的记忆体保护单元（MPU）（和M3、M4相同）- 中断向量表重新定位（和M3、M4相同）- 单一周期的I/O埠（在M0+/M23上有此机能）- 微追踪缓冲区（Micro Trace Buffer、MTB）（在M0+/M23/M33/M35P上有此机能）

**Cortex-M1**
The Cortex-M1是特别设计可以放入FPGA晶片的内核。
Cortex-M1内核的主要特点有：- ARMv6-M架构- 二层管线- 指令集
** Thumb-1（大部份），但没有CBZ, CBNZ, IT.
** Thumb-2（少部份），只有BL, DMB, DSB, ISB, MRS, MSR.
** 32-bit硬体整数乘法，结果也是32-bit- 1到32个中断，以及不可遮罩中断
矽智财选项：- 硬体整数乘法速度：3或33周期。- 选配的紧密耦合记忆体（TCM）0 to 1 MB 指令TCM，0 to 1 MB 资料TCM，都可以选择要不要ECC.- 外部中断：0, 1, 8, 16, 32.- 除错模式：无，简易功能，完整- 字节序：little-endian或BE-8 big-endian. - 作业系统延伸：可以选择

**Cortex-M3**
Cortex-M3内核的主要特点有 - ARMv7-M架构：- 三层管线以及分支预测- 指令集：
** Thumb-1（完整）
** Thumb-2（完整）
** 32-bit硬体整数乘法，结果可以是32-bit或64-bit，有号或无号，在乘法后允许加法或减法。32-bit乘法是一个周期，64-bit乘法和乘积累加（MAC）需要的周期较多
** 32-bit硬体整数除法（2–12周期）
** 支援饱和运算- 12个周期的中断延迟- 整合休眠模式
矽智财选项：- 可选的记忆体保护单元（MPU）：0个区或8个区

**Cortex-M4**
在概念上，Cortex-M4是Cortex-M3加上数位信号处理（DSP）指令、可选的浮点运算器。若有浮点运算器，会称为Cortex-M4F。
Cortex-M4内核的主要特点有：- ARMv7E-M架构- 三层管线以及分支预测- 指令集：
** Thumb-1（完整）
** Thumb-2（完整）
** 32-bit硬体整数乘法，结果可以是32-bit或64-bit，有号或无号，在乘法后允许加法或减法。32-bit乘法及乘积累加（MAC）是一个周期
** 32-bit硬体整数除法（2–12周期）
** 支援饱和运算
** DSP延伸：单一周期16/32-bit MAC，单一周期双16-bit MAC，8/16-bit SIMD运算- 12个周期的中断延迟- 整合休眠模式
矽智财选项：- 可选的浮点运算器（FPU）：只有单精度IEEE-754的，称为FPv4-SP延伸- 可选的记忆体保护单元（MPU）：0个区或8个区

**Cortex-M7**
Cortex-M7是高性能的内核，其运算效能是Cortex-M4的二倍。其中包括六层的超纯量管线有分支预测，有可选的单精度浮点运算器或双精度浮点运算器。指令集以及资料汇流排已由32-bit宽度增加到64-bit宽度。若内核中有FPU，会称为Cortex-M7F，不然会称为Cortex-M7。
Cortex-M7内核的主要特点有：- ARMv7E-M架构- 6阶管线以及分支预测。在ARM Cortex-M内核中是最多的。- 指令集：
** Thumb-1（完整）
** Thumb-2（完整）
** 32-bit硬体整数乘法，结果可以是32-bit或64-bit，有号或无号，在乘法后允许加法或减法。32-bit乘法及乘积累加（MAC）是一个周期
** 32-bit硬体整数除法（2–12周期）
** 支援饱和运算
** DSP延伸：单一周期16/32-bit MAC，单一周期双16-bit MAC，8/16-bit SIMD运算- 1至240个中断，以及不可遮罩中断- 12个周期的中断延迟- 整合休眠模式
矽智财选项：- 可选的浮点运算器（FPU）：单精度或双精度，都和IEEE-754-2008相容，称为FPv5延伸- 可选的CPU缓存：0至64 KB 的指令缓存，0至64 KB 的资料缓存，都有可选的纠错内存- 可选的紧密耦合记忆体（TCM）：0至16 MB 指令TCM，0至16 MB 资料TCM，都可以选择要不要ECC.- 可选的记忆体保护单元（MPU）：8区或16区。- 可选的嵌入式追踪巨集电路元（ETM）：可以只针对指令，或针对指令及资料。- 可选的休眠模式保留模式（配合Arm功率管理元件）。

**Cortex-M23**
Cortex-M23内核在2016年10月上市，以2015年11月发布的ARMv8-M架构为基础。在概念上Cortex-M23类似Cortex-M0+，加上整数除法指令、TrustZone安全特性、也是二层管线。
Cortex-M23核心的主要特点有：- ARMv8-M基线架构- 二层管线（类似Cortex-M0+）- TrustZone安全指令（只有在M23/M33/M35P）- 32-bit硬体整数除法（17 或 34 周期）（M0/M0+/M1没有）- 堆叠边界限制（只有在SAU选项开启时才有）（M23/M33/M35P才有）
矽智财选项：- 硬体整数乘法速度：1周期或32周期。- 硬体整数除法速度：最长17周期或34周期，依除数而定，指令有可能会提早完成。- 可选的记忆体保护单元（MPU）：0, 4, 8, 12, 16个区块- 可选的安全属性单元（SAU）：0, 4, 8个区块- 单一周期的I/O埠（在M0+/M23上有此机能）- 微追踪缓冲区（Micro Trace Buffer、MTB）（在M0+/M23/M33/M35P上有此机能）

**Cortex-M33**
Cortex-M33内核是在2016年10月发布，是以2015年11月发布的ARMv8-M架构为基础。概念上类似Cortex-M4和Cortex-M23的交集，也有三阶的指令管道。
Cortex-M33核心的主要特点有- ARMv8-M架构：- 三阶管道- TrustZone安全指令（只有在M23/M33/M35P才有）- 32-bit硬体整数除法（最长11个周期）（M0/M0+/M1无此选项）- 堆叠边界限制（只有在SAU选项开启时才有）（M23/M33/M35P才有）
矽智财选项：- 可选的浮点运算器（FPU）：只有单精度IEEE-754的，称为FPv5延伸- 可选的记忆体保护单元（MPU）：0, 4, 8, 12, 16个区块- 可选的安全属性单元（SAU）：0, 4, 8个区块- 微追踪缓冲区（Micro Trace Buffer、MTB）（在M0+/M23/M33/M35P上有此机能）

**Cortex-M35P**
Cortex-M35P内核是在2018年5月发布的，在概念上是Cortex-M33内核加上新的指令集，以及来自ARM SecurCore系列，新的防篡改硬体、可选的同位元以及ECC功能。
目前此晶片的公开资料不多，只有技术参考手册。到2020年2月为止，尚未看到各厂商推出此系列的微处理器。

**Cortex-M55**
Cortex-M55是在2020年2月发布，是以2019年2月发布的Armv8.1-M架构为基础，有四阶指令管道。
Cortex-M55核心的主要特点有：- ARMv8.1-M Mainline/Helium内核- 四阶管道- 堆叠边界限制（只有在SAU选项开启时才有）
矽智财选项：- Helium (M-Profile Vector Extension, MVE)- 单精度和双精度的浮点运算器- 可选的DSP延伸- 可选的TrustZone安全延伸- 支援RAS（Safety and reliability）功能- 支援协处理器- 区分安全区和非安全区的MPU，可以分为0, 4, 8, 12或16个区- 安全属性单元可以分为0, 4或8个区- 指令缓存，大小可以设定为4KB, 8KB, 16KB, 32KB, 64KB- 资料缓存，大小可以设定为4KB, 8KB, 16KB, 32KB, 64KB- 缓存及TCM支援ECC- 1–480个中断- 3–8个例外优先位元- 内部和外部的唤醒中断控制器（WIC）选项，可选的CTI, ITM及DWT- ARM客制指令（未来发布的版本中会支援）

**文件**
ARM晶片的文件很多。 过去八位元的微处理器只有一份文件，不过随着微处理器的进步，许多功能都需要支援。ARM晶片的文件包一般会包括IC制造商以及CPU内核供应商（Arm）的文件。
典型的文件结构如下：
文件树（从上到下）
# IC制造商网页
# IC制造商宣传投影片
# IC制造商实际晶片的数据表
# IC制造商该晶片家族的参考手册，其中有常用周边以及特点
# ARM内核网站
# ARM内核通用使用手册
# ARM内核技术参考手册
# ARM架构参考手册
IC制造商可能会有其他资料，例如开发板使用手册、应用指南、快速手册、软体函式库文件、已知问题等。

**参考资料**

**延伸阅读**
 Embedded Systems with ARM Cortex-M Microcontrollers in Assembly Language and C; 3rd Ed; Yifeng Zhu; 738 pages; 2017; 978-0982692660.- Designer's Guide to the Cortex-M Processor Family; 2nd Ed; Trevor Martin; 490 pages; 2016; 978-0081006290.- ARM Assembly for Embedded Applications; 3rd Ed; Daniel Lewis; 318 pages; 2017; 978-1543908046.- Definitive Guide to the ARM Cortex-M0 and Cortex-M0+ Processors; 2nd Ed; Joseph Yiu; 784 pages; 2015; 978-0128032770.- Definitive Guide to the ARM Cortex-M3 and Cortex-M4 Processors; 3rd Ed; Joseph Yiu; 600 pages; 2013; 978-0124080829.- Digital Signal Processing and Applications Using the ARM Cortex-M4; 1st Ed; Donald Reay; 250 pages; 2014; 978-1118859049.- Embedded Systems: Introduction to ARM Cortex-M Microcontrollers; 5th Ed; Jonathan Valvano; 506 pages; 2012; 978-1477508992.- Assembly Language Programming: ARM Cortex-M3; 1st Ed; Vincent Mahout; 256 pages; 2012; 978-1848213296.