The Cortex-M0 is a 32-bit ARM processor designed for microcontroller applications. It has a reduced instruction set computer (RISC) architecture and uses the ARMv6-M Thumb instruction set. The Thumb instruction set is a compact 16-bit and 32-bit instruction set designed to provide high code density without compromising performance for microcontroller applications. Some key features of the Cortex-M0 instruction set architecture include:
Thumb 16-bit and 32-bit Instructions
The Thumb instruction set consists of both 16-bit and 32-bit instructions. 16-bit Thumb instructions are designed to be space-efficient for simple and frequently used operations like moves, adds, subtracts, and branches. 32-bit Thumb instructions are available for more complex operations and provide additional capabilities compared to 16-bit instructions.
The Cortex-M0 uses a load/store architecture where data processing operations only occur on registers, not directly on memory. All memory access is through load and store instructions that move data between registers and memory. This provides predictable timing of instructions.
ARM and Thumb Instruction Sets
The processor implements both the standard 32-bit ARM instruction set used in earlier ARM processors as well as the Thumb instruction set. The ARM instructions execute in ARM state, while Thumb instructions execute in Thumb state. Branch instructions can switch between ARM and Thumb states.
Most Thumb instructions can be conditionally executed based on the state of the condition flags in the CPSR register. This allows for efficient if-then-else structures without branching and improves overall performance.
The Cortex-M0 has 13 general purpose 32-bit registers (R0-R12) that can be accessed in most instructions. R13 is the stack pointer, R14 the link register, and R15 is the program counter. A program status register (PSR) contains condition flags, interrupt disable bits, and other status information.
The load/store architecture has simple and flexible addressing modes for memory access. The available addressing modes include:
- Offset – register plus offset value
- Pre-indexed – register plus offset, writing back to base register
- Post-indexed – register value as base, add offset after transfer
Data transfer instructions between registers and memory include:
- LDR – Load word from memory into register
- STR – Store word from register into memory
- LDRB – Load byte from memory into register
- STRB – Store byte from register into memory
Data Processing Instructions
Arithmetic and logical instructions that operate on registers include:
- ADD, SUB – Addition, Subtraction
- AND, ORR – Logical AND, OR
- MOV, MVN – Move, Move Negated
- CMP, CMN – Compare, Compare Negated
- EOR – Exclusive OR
- LSL, LSR – Logical Shift Left/Right
- ASR – Arithmetic Shift Right
Branch instructions for changes in program flow include:
- B – Unconditional branch
- Bxx – Conditional branch on condition xx
- BL, BLX – Branch with Link register for subroutines
Supervisor Call and Exception Handling
The processor supports supervisor calls via the SVC instruction and configurable priority-based exception handling. SVCs allow supervisor code to be called from threads. Exceptions can be triggered by faults, interrupts, and traps for efficient handling in the exception framework.
Debugging and Instrumentation
Debugging capabilities are built into the architecture with breakpoints, watchpoints, tracing, and profiling features. This allows for real-time debugging and instrumentation of software without external probes.
Memory Protection Unit
An optional memory protection unit can enforce privilege and access rules by restricting memory access. This improves software robustness by limiting the effects of errant memory accesses.
Wake-up Interrupt Controller
The wake-up interrupt controller supports interrupts and wake-up events while minimizing power consumption, which is important for energy-constrained microcontroller applications.
System Control Block
The system control block provides system implementation information and configuration settings via registers in a system control space. This covers clocking, resets, power modes, and exception handling configurations.
Nested Vectored Interrupt Controller
The NVIC provides nested interrupt handling with configurable priorities and vectored exception entry points. This provides low-latency interrupt handling with minimal overhead.
The processor includes multiple low power modes: sleep, deep sleep, and stop modes that disable clocks and wake up on events to conserve power. The WIC helps manage low power modes.
Thumb-2 technology enhances the Thumb instruction set with more powerful 16-bit and 32-bit instructions to improve code density and performance. This includes more complex instructions for SIMD media processing among other enhancements.
In summary, the Cortex-M0 instruction set architecture is designed for microcontroller applications with high code density, low power, good performance, and extensive debugging features enabled by its RISC Thumb instruction set. The load/store model, conditional execution, flexible addressing modes, interrupts, system control block, and power management support the needs of deeply embedded software implementations.