Cortex-M · 24 pages
- Core lineup
- Architecture family compared
- Cortex-M0
- Cortex-M0+
- Cortex-M3
- Cortex-M4
- Cortex-M7
- Cortex-M23v8-M
- Cortex-M33v8-M
- Cortex-M55Helium
- Cortex-M85Helium
- NVIC overview
- NVIC registers
- NVIC priority & preemption
- Tail-chain & late-arrival
- Vector table
- SysTick & timing
- SCB — System Control Block
- MPU on Cortex-M
- FPU on Cortex-M
- Cache & TCM (M7/M55/M85)
- DWT / ITM / ETM
- CoreSight
- Low-power modes
Cortex-M architecture comparison
Every Cortex-M core side by side — pipeline depth, DMIPS/MHz, ISA profile, MPU, FPU, cache, TCM, TrustZone, vector ops, and typical silicon clocks. The single reference table.
There are now nine commercially relevant Cortex-M cores, spanning three architecture profiles (ARMv6-M, ARMv7-M, ARMv8-M) and four generations of microarchitecture. Picking the right one for a new design is most of the work of picking an MCU — and it's harder than it sounds because vendors mix-and-match optional features. An M33 from STM might have FPU+DSP+TrustZone; an M33 from a low-cost competitor might have only the base feature set. This page is the single reference for what each core can do, not what any specific part does.
The table below covers the architectural envelope. For per-vendor option choices, you have to read the datasheet — there is no shortcut.
- Smallest
- Cortex-M0 — ~12k gates, no MPU, no divide
- Lowest-power for new designs
- Cortex-M0+ — 2-stage pipeline, optional MPU, MTB trace
- Smallest with TrustZone-M
- Cortex-M23 — v8-M Baseline
- Default mid-tier
- Cortex-M33 — TrustZone, optional FPU+DSP, replaces M3 and M4 for new work
- Highest-performance
- Cortex-M85 — 3.0 CoreMark/MHz, branch prediction, PAC/BTI
- Best for ML inference
- Cortex-M55 + Ethos-U — Helium MVE plus dedicated NPU
- Highest-clocked legacy
- Cortex-M7 — still shipping at 400–550 MHz, no TrustZone
The master comparison table
| Core | Arch | Pipe | DMIPS | FPU | DSP | MPU | TZ | MVE | Notes |
|---|---|---|---|---|---|---|---|---|---|
| Cortex-M0 | ARMv6-M | 3-stage | 0.84/MHz | — | Subset of Thumb-2. | ||||
| Cortex-M0+ | ARMv6-M | 2-stage | 0.95/MHz | — | Single-cycle I/O port. | ||||
| Cortex-M23 | ARMv8-M Baseline | 2-stage | 0.99/MHz | — | Secure & non-secure worlds. | ||||
| Cortex-M3 | ARMv7-M | 3-stage | 1.25/MHz | — | The classic mid-range core. | ||||
| Cortex-M33 | ARMv8-M Mainline | 3-stage | 1.50/MHz | SP | Used in nRF53, STM32L5/U5. | ||||
| Cortex-M4 | ARMv7E-M | 3-stage | 1.25/MHz | SP | Most popular general-purpose MCU core. | ||||
| Cortex-M55 | ARMv8.1-M | 4-stage | 1.6/MHz | SP/DP | 4–5× DSP/ML uplift vs. M4. | ||||
| Cortex-M7 | ARMv7E-M | 6-stage | 2.14/MHz | SP/DP | Used in i.MX RT, STM32H7. | ||||
| Cortex-M85 | ARMv8.1-M | 7-stage | 3.0/MHz | SP/DP | i.MX RT700, Renesas RA8. |
Pipeline depth and IPC
Pipeline depth is a rough proxy for clock-frequency headroom — deeper pipelines mean smaller per-stage logic and faster clocks, at the cost of larger mispredict penalties.
| Core | Pipeline | Branch mispredict | Typical max silicon clock |
|---|---|---|---|
| M0 | 3 | 2 cycles | ~50 MHz (mainstream), 100 MHz (aggressive) |
| M0+ | 2 | 1 cycle | ~50 MHz (mainstream), 133 MHz (RP2040) |
| M23 | 2 | 1 cycle | ~32–48 MHz typical |
| M3 | 3 | 2 cycles | ~72–168 MHz |
| M4 | 3 | 2 cycles | ~80–180 MHz |
| M33 | 3 | 2 cycles | ~64–250 MHz |
| M55 | 4 | 3 cycles | ~300–500 MHz |
| M7 | 6 | 5–7 cycles | ~400–550 MHz |
| M85 | 7 | 5–7 cycles | ~400–750 MHz |
Note the M85's deeper pipeline doesn't kill perf because of branch prediction — a correctly predicted branch is zero penalty. The M7, with weaker prediction, eats its 5–7 cycle penalty on every mispredicted branch.
ISA features
What instructions you actually have, by core:
| ISA feature | M0/M0+ | M23 | M3/M4/M7 | M33 | M55/M85 |
|---|---|---|---|---|---|
| Thumb-2 (full) | no | no | yes | yes | yes |
| UDIV / SDIV | no | yes | yes | yes | yes |
| CBZ / CBNZ | no | yes | yes | yes | yes |
| IT blocks | no | no | yes | yes | yes |
| DSP saturating (QADD etc.) | no | no | M4/M7 yes | optional | yes |
| Bit-band | no | no | M3/M4 yes (M7 no) | no | no |
| LDREX / STREX | no | LDA/STL (v8) | yes | LDA/STL | LDA/STL |
| CLZ | no | yes | yes | yes | yes |
| Helium MVE | no | no | no | no | yes |
| PAC / BTI | no | no | no | no | M85 only |
Bit-banding (the M3/M4-only feature that aliases each bit of a register region to a word at a different address) is dead in v8-M. Don't write portable code that depends on it.
Memory and bus
| Core | Bus type | I-cache | D-cache | ITCM | DTCM |
|---|---|---|---|---|---|
| M0 | von Neumann, single AHB | no | no | no | no |
| M0+ | von Neumann (+ optional SIO) | no | no | no | no |
| M23 | von Neumann, single AHB | no | no | no | no |
| M3 | Harvard (I/D/S buses) | no | no | no | no |
| M4 | Harvard | no | no | no | no |
| M33 | Harvard | no | no | no (vendor SRAM may emulate) | no |
| M55 | Harvard | optional 4–64 KB | optional 4–64 KB | optional ≤16 MB | optional ≤16 MB |
| M7 | Harvard, multiple AHB | yes 4–64 KB | yes 4–64 KB | yes ≤16 MB | yes ≤16 MB |
| M85 | Harvard | optional 4–64 KB | optional 4–64 KB | optional ≤16 MB | optional ≤16 MB |
Cache and TCM are big lever points. Cached cores get high mean throughput from flash but require DMA coherency management. TCM gets deterministic single-cycle latency without cache management — the right place for ISRs and DMA buffers.
Security: MPU, TrustZone, PAC/BTI
| Core | MPU | TrustZone-M | PAC | BTI |
|---|---|---|---|---|
| M0 | no | no | no | no |
| M0+ | optional (v6-M MPU, 8 regions) | no | no | no |
| M23 | optional (v8-M MPU, 8 or 16 regions) | optional | no | no |
| M3 | optional (v7-M MPU, 8 regions) | no | no | no |
| M4 | optional (v7-M MPU, 8 regions) | no | no | no |
| M33 | optional (v8-M MPU, 8 or 16 regions per state) | optional | no | no |
| M55 | optional (v8-M MPU, 16 regions per state) | optional | no | no |
| M7 | optional (v7-M MPU, 8 or 16 regions) | no | no | no |
| M85 | optional (v8-M MPU, 16 regions per state) | optional | yes | yes |
The M85 stands alone with PAC and BTI. For products that need certified control-flow integrity, this is currently the only Cortex-M option.
Floating-point
| Core | FPU | Precision | Lazy stacking |
|---|---|---|---|
| M0/M0+ | none | software only | n/a |
| M23 | none | software only | n/a |
| M3 | none | software only | n/a |
| M4 | optional FPv4-SP | single | yes |
| M7 | optional FPv5-SP, FPv5-DP | single or double | yes |
| M33 | optional FPv5-SP | single only | yes |
| M55 | FPv5-SP, optional FPv5-DP, MVE shares regs | single + double + vector | yes |
| M85 | FPv5-SP, FPv5-DP, optional MVE | single + double + vector | yes |
If you need double precision, your only choices are M7, M55, or M85. The M33 is single-precision only; double-precision FP on M33 goes through software helpers and is roughly 100× slower than single-precision native.
NVIC priorities and IRQ count
| Core | Max IRQs | Priority bits | BASEPRI | FAULTMASK |
|---|---|---|---|---|
| M0/M0+ | 32 | 2 | no | no |
| M23 | 240 | up to 4 | no | no |
| M3/M4 | 240 | up to 8 | yes | yes |
| M33 | 480 | up to 8 | yes | yes |
| M55/M85 | 480 | up to 8 | yes | yes |
| M7 | 240 | up to 8 | yes | yes |
Most actual silicon ships with 3 or 4 priority bits regardless of architectural maximum. Vendors trim NVIC area aggressively.
DMIPS and CoreMark
| Core | DMIPS/MHz | CoreMark/MHz |
|---|---|---|
| M0 | 0.84 | 2.33 |
| M0+ | 0.95 | 2.46 |
| M23 | 0.99 | 2.50 |
| M3 | 1.25 | 3.32 |
| M4 | 1.25 | 3.40 |
| M33 | 1.50 | 4.02 |
| M55 | 1.60 | 4.50 (scalar) |
| M7 | 2.14 | 5.04 |
| M85 | 3.13 | 6.30 |
Numbers are ARM-published reference benchmarks. Real silicon varies — memory latency, flash wait states, and cache hit rates all skew real-world results by 10–30%.
Choosing a core for a new design
A reasonable decision tree:
- Need security partition (TrustZone-M)? → M23, M33, M55, or M85. Skip M0/M0+/M3/M4/M7.
- Need ML inference at low power? → M55 + Ethos-U. M85 if no NPU is available.
- Need maximum single-thread perf? → M85 (new design) or M7 (legacy / cheaper silicon today).
- Need DSP/SIMD without ML? → M33+DSP, M55, or M85. M4 if cost dominates.
- Need FPU? → M4, M7, M33+FPU, M55, or M85.
- Just need a small low-power core? → M0+ first, M23 if security is required.
Treat M0, M3, and M4 as legacy for new designs — they're fine in established product families but offer nothing v8-M alternatives don't. M7 is the exception: still has the highest deployed install base for high-perf MCU work, and the SP/DP FPU is sometimes cheaper than M85.
Cross-references
- Cortex-M0 · M0+ · M3 · M4 · M7 · M23 · M33 · M55 · M85
- The Cortex-M lineup overview
- ARMv7-M vs ARMv8-M
- ISA families
- ARM TRMs for each core (DDI series)