The ARM Cortex-M family are ARM microprocessor cores that are designed for use in
microcontrollers,
ASICs,
ASSPs,
FPGAs, and
SoCs. Cortex-M cores are commonly used as dedicated microcontroller chips, but also are "hidden" inside of SoC chips as power management controllers, I/O controllers, system controllers, touch screen controllers, smart battery controllers, and sensor controllers. The main difference from
Cortex-A cores is that Cortex-M cores have no
memory management unit (MMU) for
virtual memory, considered essential for "full-fledged"
operating systems. Cortex-M programs instead run
bare metal or on one of the many
real-time operating systems which
support a Cortex-M. Though 8-bit microcontrollers were very popular in the past, Cortex-M has slowly been chipping away at the 8-bit market as the prices of low-end Cortex-M chips have moved downward. Cortex-M have become a popular replacements for 8-bit chips in applications that benefit from 32-bit math operations, and replacing older legacy ARM cores such as
ARM7 and
ARM9. In particular, the embedded wear-leveling controller inside most
SD cards or
flash drives is a (8-bit)
8051 microcontroller or ARM CPU.
License ARM Limited neither manufactures nor sells CPU devices based on its own designs, but rather licenses the processor architecture to interested parties. Arm offers a variety of licensing terms, varying in cost and deliverables. To all licensees, Arm provides an integratable hardware description of the ARM core, as well as complete software development toolset and the right to sell manufactured
silicon containing the ARM CPU.
Silicon customization Integrated Device Manufacturers (IDM) receive the ARM Processor
IP as
synthesizable RTL (written in
Verilog). In this form, they have the ability to perform architectural level optimizations and extensions. This allows the manufacturer to achieve custom design goals, such as higher clock speed, very low power consumption, instruction set extensions (including floating point), optimizations for size, debug support, etc. To determine which components have been included in a particular ARM CPU chip, consult the manufacturer datasheet and related documentation. Some of the silicon options for the Cortex-M cores are: • SysTick timer: A 24-bit system timer that extends the functionality of both the processor and the Nested Vectored Interrupt Controller (NVIC). When present, it also provides an additional configurable priority SysTick interrupt. • Note: Software should validate the existence of each feature before attempting to use it. • Note: Limited public information is available for the Cortex-M35P until its
Technical Reference Manual is released.
Additional silicon options: • Data endianness: Little-endian or big-endian. Unlike legacy ARM cores, the Cortex-M is permanently fixed in silicon as one of these choices. • Interrupts: 1 to 32 (M0/M0+/M1), 1 to 240 (M3/M4/M7/M23), 1 to 480 (M33/M35P/M52/M55/M85). • Wake-up interrupt controller: Optional. • Vector Table Offset Register: Optional. (not available for M0). • Instruction fetch width: 16-bit only, or mostly 32-bit. • User/privilege support: Optional. • Reset all registers: Optional. • Single-cycle I/O port: Optional. (M0+/M23). • Debug Access Port (DAP): None,
SWD,
JTAG and SWD. (optional for all Cortex-M cores) • Halting debug support: Optional. • Number of watchpoint comparators: 0 to 2 (M0/M0+/M1), 0 to 4 (M3/M4/M7/M23/M33/M35P/M52/M55/M85). • Number of breakpoint comparators: 0 to 4 (M0/M0+/M1/M23), 0 to 8 (M3/M4/M7/M33/M35P/M52/M55/M85).
Instruction sets The Cortex-M0 / M0+ / M1 implement the
ARMv6-M architecture, the Cortex-M3 implements the
ARMv7-M architecture, the Cortex-M4 / Cortex-M7 implements the
ARMv7E-M architecture, the Cortex-M23 / M33 / M35P implement the
ARMv8-M architecture, and the Cortex-M52 / M55 / M85 implements the
ARMv8.1-M architecture. The architectures are binary instruction upward compatible from ARMv6-M to ARMv7-M to ARMv7E-M. Binary instructions available for the Cortex-M0 / Cortex-M0+ / Cortex-M1 can execute without modification on the Cortex-M3 / Cortex-M4 / Cortex-M7. Binary instructions available for the Cortex-M3 can execute without modification on the Cortex-M4 / Cortex-M7 / Cortex-M33 / Cortex-M35P. Only Thumb-1 and Thumb-2 instruction sets are supported in Cortex-M architectures; the legacy 32-bit ARM instruction set isn't supported. All Cortex-M cores implement a common subset of instructions that consists of most Thumb-1, some Thumb-2, including a 32-bit result multiply. The Cortex-M0 / Cortex-M0+ / Cortex-M1 / Cortex-M23 were designed to create the smallest silicon die, thus having the fewest instructions of the Cortex-M family. The Cortex-M0 / M0+ / M1 include Thumb-1 instructions, except new instructions (CBZ, CBNZ, IT) which were added in ARMv7-M architecture. The Cortex-M0 / M0+ / M1 include a minor subset of Thumb-2 instructions (BL, DMB, DSB, ISB, MRS, MSR). The Cortex-M3 / M4 / M7 / M33 / M35P have all base Thumb-1 and Thumb-2 instructions. The Cortex-M3 adds three Thumb-1 instructions, all Thumb-2 instructions, hardware integer divide, and
saturation arithmetic instructions. The Cortex-M4 adds
DSP instructions and an optional single-precision
floating-point unit (VFPv4-SP). The Cortex-M7 adds an optional double-precision FPU (VFPv5). The Cortex-M23 / M33 / M35P / M52 / M55 / M85 add
TrustZone instructions. • Note: Interrupt latency cycle count assumes: 1) stack located in zero-wait state RAM, 2) another interrupt function not currently executing, 3) Security Extension option doesn't exist, because it adds additional cycles. The Cortex-M cores with a Harvard computer architecture have a shorter interrupt latency than Cortex-M cores with a Von Neumann computer architecture. • Note: The Cortex-M series includes three new 16-bit
Thumb-1 instructions for sleep mode: SEV, WFE, WFI. • Note: The Cortex-M0 / M0+ / M1 doesn't include these 16-bit
Thumb-1 instructions: CBZ, CBNZ, IT. • Note: The Cortex-M0 / M0+ / M1 only include these 32-bit
Thumb-2 instructions: BL, DMB, DSB, ISB, MRS, MSR. • Note: The Cortex-M0 / M0+ / M1 / M23 only has 32-bit
multiply instructions with a lower-32-bit result (32 bit × 32 bit = lower 32 bit), where as the Cortex-M3 / M4 / M7 / M33 / M35P includes additional 32-bit multiply instructions with 64-bit results (32 bit × 32 bit = 64 bit). The Cortex-M4 / M7 (optionally M33 / M35P) include DSP instructions for (16 bit × 16 bit = 32 bit), (32 bit × 16 bit = upper 32 bit), (32 bit × 32 bit = upper 32 bit) multiplications. • Note: The number of cycles to complete multiply and divide instructions vary across ARM Cortex-M core designs. Some cores have a silicon option for the choice of fast speed or small size (slow speed), so cores have the option of using less silicon with the downside of higher cycle count. An interrupt occurring during the execution of a divide instruction or slow-iterative multiply instruction will cause the processor to abandon the instruction, then restart it after the interrupt returns. • Multiply instructions "32-bit result" Cortex-M0/M0+/M23 is 1 or 32 cycle silicon option, Cortex-M1 is 3 or 33 cycle silicon option, Cortex-M3/M4/M7/M33/M35P is 1 cycle. • Multiply instructions "64-bit result" Cortex-M3 is 3–5 cycles (depending on values), Cortex-M4/M7/M33/M35P is 1 cycle. • Divide instructions Cortex-M3/M4 is 2–12 cycles (depending on values), Cortex-M7 is 3–20 cycles (depending on values), Cortex-M23 is 17 or 34 cycle option, Cortex-M33 is 2–11 cycles (depending on values), Cortex-M35P is TBD. • Note: Some Cortex-M cores have silicon options for various types of floating point units (
FPU). The Cortex-M55 / M85 has an option for
half-precision (
HP), the Cortex-M4 / M7 / M33 / M35P / M52 / M55 / M85 has an option for
single-precision (
SP), the Cortex-M7 / M52 / M55 / M85 has an option for
double-precision (
DP). When an FPU is included, the core is sometimes referred as "Cortex-MxF", where 'x' is the core variant, such as Cortex-M4
F. • Note: MOVW is an alias that means 32-bit "wide" MOV instruction. • Note: B.W is a long-distance unconditional branch (similar in encoding, operation, and range to BL, minus setting of the LR register). • Note: For Cortex-M1, WFE / WFI / SEV instructions exist, but execute as a NOP instruction. • Note: The half-precision (HP) FPU instructions are valid in the Cortex-M52 / M55 / M85 only when the HP FPU option exists in the silicon. • Note: The single-precision (SP) FPU instructions are valid in the Cortex-M4 / M7 / M33 / M35P / M52 / M55 / M85 only when the SP FPU option exists in the silicon. • Note: The double-precision (DP) FPU instructions are valid in the Cortex-M7 / M52 / M55 / M85 only when the DP FPU option exists in the silicon.
Deprecations The ARM architecture for ARM Cortex-M series removed some features from older legacy cores: • The 32-bit ARM instruction set is not included in Cortex-M cores. • Endianness is chosen at silicon implementation in Cortex-M cores. Legacy cores allowed "on-the-fly" changing of the data
endian mode. •
Co-processors were not supported on Cortex-M cores, until the silicon option was reintroduced in "ARMv8-M Mainline" for ARM Cortex-M33/M35P cores. The capabilities of the 32-bit ARM instruction set is duplicated in many ways by the Thumb-1 and Thumb-2 instruction sets, but some ARM features don't have a similar feature: • The SWP and SWPB (swap) ARM instructions don't have a similar feature in Cortex-M. The 16-bit Thumb-1 instruction set has evolved over time since it was first released in the legacy
ARM7T cores with the ARMv4T architecture. New Thumb-1 instructions were added as each legacy ARMv5 / ARMv6 / ARMv6T2 architectures were released. Some 16-bit Thumb-1 instructions were removed from the Cortex-M cores: • The "BLX " instruction doesn't exist because it was used to switch from Thumb-1 to ARM instruction set. The "BLX " instruction is still available in the Cortex-M. • SETEND doesn't exist because on-the-fly switching of data endian mode is no longer supported. • Co-processor instructions were not supported on Cortex-M cores, until the silicon option was reintroduced in "ARMv8-M Mainline" for ARM Cortex-M33/M35P cores. • The SWI instruction was renamed to SVC, though the instruction binary coding is the same. However, the SVC handler code is different from the SWI handler code, because of changes to the exception models. ==Cortex-M0==