
- •1 About this document
- •1.1 Typographical conventions
- •1.2 List of abbreviations for registers
- •1.3.1 System level interface
- •1.3.2 Integrated configurable debug
- •2 The Cortex-M4 processor
- •2.1 Programmers model
- •2.1.1 Processor mode and privilege levels for software execution
- •2.1.2 Stacks
- •2.1.3 Core registers
- •2.1.4 Exceptions and interrupts
- •2.1.5 Data types
- •2.1.6 The Cortex microcontroller software interface standard (CMSIS)
- •2.2 Memory model
- •2.2.1 Memory regions, types and attributes
- •2.2.2 Memory system ordering of memory accesses
- •2.2.3 Behavior of memory accesses
- •2.2.4 Software ordering of memory accesses
- •2.2.5 Bit-banding
- •2.2.6 Memory endianness
- •2.2.7 Synchronization primitives
- •2.2.8 Programming hints for the synchronization primitives
- •2.3 Exception model
- •2.3.1 Exception states
- •2.3.2 Exception types
- •2.3.3 Exception handlers
- •2.3.4 Vector table
- •2.3.5 Exception priorities
- •2.3.6 Interrupt priority grouping
- •2.3.7 Exception entry and return
- •2.4 Fault handling
- •2.4.1 Fault types
- •2.4.2 Fault escalation and hard faults
- •2.4.3 Fault status registers and fault address registers
- •2.4.4 Lockup
- •2.5 Power management
- •2.5.1 Entering sleep mode
- •2.5.2 Wakeup from sleep mode
- •2.5.3 External event input / extended interrupt and event input
- •2.5.4 Power management programming hints
- •3 The STM32 Cortex-M4 instruction set
- •3.1 Instruction set summary
- •3.2 CMSIS intrinsic functions
- •3.3 About the instruction descriptions
- •3.3.1 Operands
- •3.3.2 Restrictions when using PC or SP
- •3.3.3 Flexible second operand
- •3.3.4 Shift operations
- •3.3.5 Address alignment
- •3.3.7 Conditional execution
- •3.3.8 Instruction width selection
- •3.4 Memory access instructions
- •3.4.2 LDR and STR, immediate offset
- •3.4.3 LDR and STR, register offset
- •3.4.4 LDR and STR, unprivileged
- •3.4.7 PUSH and POP
- •3.4.8 LDREX and STREX
- •3.4.9 CLREX
- •3.5 General data processing instructions
- •3.5.7 MOVT
- •3.5.8 REV, REV16, REVSH, and RBIT
- •3.5.9 SADD16 and SADD8
- •3.5.10 SHADD16 and SHADD8
- •3.5.11 SHASX and SHSAX
- •3.5.12 SHSUB16 and SHSUB8
- •3.5.13 SSUB16 and SSUB8
- •3.5.14 SASX and SSAX
- •3.5.16 UADD16 and UADD8
- •3.5.17 UASX and USAX
- •3.5.18 UHADD16 and UHADD8
- •3.5.19 UHASX and UHSAX
- •3.5.20 UHSUB16 and UHSUB8
- •3.5.22 USAD8
- •3.5.23 USADA8
- •3.5.24 USUB16 and USUB8
- •3.6 Multiply and divide instructions
- •3.6.2 UMULL, UMAAL and UMLAL
- •3.6.3 SMLA and SMLAW
- •3.6.4 SMLAD
- •3.6.5 SMLAL and SMLALD
- •3.6.6 SMLSD and SMLSLD
- •3.6.7 SMMLA and SMMLS
- •3.6.8 SMMUL
- •3.6.9 SMUAD and SMUSD
- •3.6.10 SMUL and SMULW
- •3.6.11 UMULL, UMLAL, SMULL, and SMLAL
- •3.6.12 SDIV and UDIV
- •3.7 Saturating instructions
- •3.7.1 SSAT and USAT
- •3.7.2 SSAT16 and USAT16
- •3.7.3 QADD and QSUB
- •3.7.4 QASX and QSAX
- •3.7.5 QDADD and QDSUB
- •3.7.6 UQASX and UQSAX
- •3.7.7 UQADD and UQSUB
- •3.8 Packing and unpacking instructions
- •3.8.1 PKHBT and PKHTB
- •3.8.3 SXTA and UXTA
- •3.9 Bitfield instructions
- •3.9.2 SBFX and UBFX
- •3.9.4 Branch and control instructions
- •3.9.6 CBZ and CBNZ
- •3.10.1 VABS
- •3.10.2 VADD
- •3.10.3 VCMP, VCMPE
- •3.10.6 VCVTB, VCVTT
- •3.10.7 VDIV
- •3.10.8 VFMA, VFMS
- •3.10.9 VFNMA, VFNMS
- •3.10.10 VLDM
- •3.10.11 VLDR
- •3.10.12 VLMA, VLMS
- •3.10.13 VMOV immediate
- •3.10.14 VMOV register
- •3.10.15 VMOV scalar to Arm core register
- •3.10.16 VMOV Arm core register to single precision
- •3.10.17 VMOV two Arm core registers to two single precision
- •3.10.18 VMOV Arm Core register to scalar
- •3.10.19 VMRS
- •3.10.20 VMSR
- •3.10.21 VMUL
- •3.10.22 VNEG
- •3.10.23 VNMLA, VNMLS, VNMUL
- •3.10.24 VPOP
- •3.10.25 VPUSH
- •3.10.26 VSQRT
- •3.10.27 VSTM
- •3.10.28 VSTR
- •3.10.29 VSUB
- •3.11 Miscellaneous instructions
- •3.11.1 BKPT
- •4 Core peripherals
- •4.2 Memory protection unit (MPU)
- •4.2.1 MPU access permission attributes
- •4.2.2 MPU mismatch
- •4.2.3 Updating an MPU region
- •4.2.4 MPU design hints and tips
- •4.2.5 MPU type register (MPU_TYPER)
- •4.2.6 MPU control register (MPU_CTRL)
- •4.2.7 MPU region number register (MPU_RNR)
- •4.2.8 MPU region base address register (MPU_RBAR)
- •4.2.9 MPU region attribute and size register (MPU_RASR)
- •4.2.10 MPU register map
- •4.3 Nested vectored interrupt controller (NVIC)
- •4.3.6 Interrupt active bit register x (NVIC_IABRx)
- •4.3.7 Interrupt priority register x (NVIC_IPRx)
- •4.3.8 Software trigger interrupt register (NVIC_STIR)
- •4.3.10 NVIC design hints and tips
- •4.3.11 NVIC register map
- •4.4 System control block (SCB)
- •4.4.1 Auxiliary control register (ACTLR)
- •4.4.2 CPUID base register (CPUID)
- •4.4.3 Interrupt control and state register (ICSR)
- •4.4.4 Vector table offset register (VTOR)
- •4.4.5 Application interrupt and reset control register (AIRCR)
- •4.4.6 System control register (SCR)
- •4.4.7 Configuration and control register (CCR)
- •4.4.8 System handler priority registers (SHPRx)
- •4.4.9 System handler control and state register (SHCSR)
- •4.4.10 Configurable fault status register (CFSR; UFSR+BFSR+MMFSR)
- •4.4.11 Usage fault status register (UFSR)
- •4.4.12 Bus fault status register (BFSR)
- •4.4.13 Memory management fault address register (MMFSR)
- •4.4.14 Hard fault status register (HFSR)
- •4.4.15 Memory management fault address register (MMFAR)
- •4.4.16 Bus fault address register (BFAR)
- •4.4.17 Auxiliary fault status register (AFSR)
- •4.4.18 System control block design hints and tips
- •4.4.19 SCB register map
- •4.5 SysTick timer (STK)
- •4.5.1 SysTick control and status register (STK_CTRL)
- •4.5.2 SysTick reload value register (STK_LOAD)
- •4.5.3 SysTick current value register (STK_VAL)
- •4.5.4 SysTick calibration value register (STK_CALIB)
- •4.5.5 SysTick design hints and tips
- •4.5.6 SysTick register map
- •4.6 Floating point unit (FPU)
- •4.6.1 Coprocessor access control register (CPACR)
- •4.6.6 Enabling the FPU
- •4.6.7 Enabling and clearing FPU exception interrupts
- •5 Revision history

PM0214 |
The Cortex-M4 processor |
|
|
2.3Exception model
This section describes the exception model.
2.3.1Exception states
Each exception is in one of the following states:
Inactive |
The exception is not active and not pending. |
Pending |
The exception is waiting to be serviced by the processor. An interrupt |
|
request from a peripheral or from software can change the state of the |
|
corresponding interrupt to pending. |
Active |
An exception that is being serviced by the processor but has not |
|
completed. |
|
Note: An exception handler can interrupt the execution of another exception |
|
handler. In this case both exceptions are in the active state. |
Active and pendingThe exception is being serviced by the processor and there is a pending exception from the same source.
2.3.2Exception types
The exception types are:
Reset |
Reset is invoked on power up or a warm reset. The exception model |
|
|
treats reset as a special form of exception. When reset is asserted, the |
|
|
operation of the processor stops, potentially at any point in an |
|
|
instruction. When reset is deasserted, execution restarts from the |
|
|
address provided by the reset entry in the vector table. Execution |
|
|
restarts as privileged execution in Thread mode. |
|
NMI |
A NonMaskable Interrupt (NMI) can be signalled by a peripheral or |
|
|
triggered by software. This is the highest priority exception other than |
|
|
reset. It is permanently enabled and has a fixed priority of -2. NMIs |
|
|
cannot be: |
|
|
• |
Masked or prevented from activation by any other exception |
|
• |
Preempted by any exception other than Reset. |
Hard fault |
A hard fault is an exception that occurs because of an error during |
|
|
exception processing, or because an exception cannot be managed by |
|
|
any other exception mechanism. Hard faults have a fixed priority of -1, |
|
|
meaning they have higher priority than any exception with configurable |
|
|
priority. |
|
Memory |
A memory management fault is an exception that occurs because of a |
management fault memory protection related fault. The MPU or the fixed memory protection constraints determines this fault, for both instruction and data memory transactions. This fault is used to abort instruction accesses to Execute Never (XN) memory regions.
PM0214 Rev 10 |
37/262 |

The Cortex-M4 processor |
|
PM0214 |
|
|
|
Bus fault |
A bus fault is an exception that occurs because of a memory related |
|
|
fault for an instruction or data memory transaction. This might be from |
|
|
an error detected on a bus in the memory system. |
|
Usage fault |
A usage fault is an exception that occurs in case of an instruction |
|
|
execution fault. This includes: |
|
|
• |
An undefined instruction |
|
• |
An illegal unaligned access |
|
• |
Invalid state on instruction execution |
|
• |
An error on exception return. |
|
The following can cause a usage fault when the core is configured to |
|
|
report it: |
|
|
• |
An unaligned address on word and halfword memory access |
|
• |
Division by zero |
SVCall |
A supervisor call (SVC) is an exception that is triggered by the SVC |
|
|
instruction. In an OS environment, applications can use SVC |
|
|
instructions to access OS kernel functions and device drivers. |
|
PendSV |
PendSV is an interrupt-driven request for system-level service. In an |
|
|
OS environment, use PendSV for context switching when no other |
|
|
exception is active. |
|
SysTick |
A SysTick exception is an exception the system timer generates when |
|
|
it reaches zero. Software can also generate a SysTick exception. In an |
|
|
OS environment, the processor can use this exception as system tick. |
|
Interrupt (IRQ) |
An interrupt, or IRQ, is an exception signalled by a peripheral, or |
|
|
generated by a software request. All interrupts are asynchronous to |
instruction execution. In the system, peripherals use interrupts to communicate with the processor.
Table 17. Properties of the different exception types
Exception |
IRQ |
Exception |
Priority |
Vector address |
Activation |
|
number(1) |
number(1) |
type |
or offset(2) |
|||
|
|
|||||
1 |
- |
Reset |
-3, the highest |
0x00000004 |
Asynchronous |
|
|
|
|
|
|
|
|
2 |
-14 |
NMI |
-2 |
0x00000008 |
Asynchronous |
|
|
|
|
|
|
|
|
3 |
-13 |
Hard fault |
-1 |
0x0000000C |
- |
|
|
|
|
|
|
|
|
4 |
-12 |
Memory |
Configurable(3) |
0x00000010 |
Synchronous |
|
management fault |
||||||
|
|
|
|
|
||
|
|
|
|
|
|
|
5 |
-11 |
Bus fault |
Configurable(3) |
0x00000014 |
Synchronous when precise |
|
Asynchronous when imprecise |
||||||
|
|
|
|
|
||
|
|
|
|
|
|
|
6 |
-10 |
Usage fault |
Configurable(3) |
0x00000018 |
Synchronous |
|
7-10 |
- |
- |
- |
Reserved |
- |
|
|
|
|
|
|
|
|
11 |
-5 |
SVCall |
Configurable(3) |
0x0000002C |
Synchronous |
|
12-13 |
- |
- |
- |
Reserved |
- |
|
|
|
|
|
|
|
|
14 |
-2 |
PendSV |
Configurable(3) |
0x00000038 |
Asynchronous |
38/262 |
PM0214 Rev 10 |

PM0214 |
|
|
|
|
The Cortex-M4 processor |
|
|
|
|
|
|
|
|
|
Table 17. Properties of the different exception types (continued) |
|||||
Exception |
IRQ |
Exception |
Priority |
Vector address |
Activation |
|
number(1) |
number(1) |
type |
or offset(2) |
|||
|
|
|||||
15 |
-1 |
SysTick |
Configurable(3) |
0x0000003C |
Asynchronous |
|
16 and |
0 and |
Interrupt (IRQ) |
Configurable(4) |
0x00000040 and |
Asynchronous |
|
above |
above |
|
|
above(5) |
|
1.To simplify the software layer, the CMSIS only uses IRQ numbers and therefore uses negative values for exceptions other than interrupts. The IPSR returns the Exception number. For further information see Interrupt program status register on page 22.
2.See Vector table on page 40 for more information.
3.See System handler priority registers (SHPRx) on page 233.
4.See Interrupt priority register x (NVIC_IPRx) on page 215.
5.Increasing in steps of 4.
For an asynchronous exception other than reset, the processor can execute another instruction between when the exception is triggered and when the processor enters the exception handler.
Privileged software can disable the exceptions that Table 17 on page 38 shows as having configurable priority. For further information, see:
•System handler control and state register (SHCSR) on page 235
•Interrupt clear-enable register x (NVIC_ICERx) on page 211
For more information about hard faults, memory management faults, bus faults, and usage faults, see Section 2.4: Fault handling on page 44.
2.3.3Exception handlers
The processor handles exceptions using:
Interrupt Service |
Interrupts IRQ0 to IRQ81 are the exceptions handled by ISRs. |
Routines (ISRs) |
|
Fault handlers |
Hard fault, memory management fault, usage fault, bus fault are fault |
|
exceptions handled by the fault handlers. |
System handlers |
NMI, PendSV, SVCall SysTick, and the fault exceptions are all |
|
system exceptions that are handled by system handlers. |
PM0214 Rev 10 |
39/262 |

The Cortex-M4 processor |
PM0214 |
|
|
2.3.4Vector table
The vector table contains the reset value of the stack pointer, and the start addresses, also called exception vectors, for all exception handlers. Figure 11 on page 40 shows the order of the exception vectors in the vector table. The least-significant bit of each vector must be 1, indicating that the exception handler is Thumb code.
Figure 11. Vector table
On system reset, the vector table is fixed at address 0x00000000. Privileged software can write to the VTOR to relocate the vector table start address to a different memory location, in the range 0x00000080 to 0x3FFFFF80. For further information see Vector table offset register (VTOR) on page 227.
40/262 |
PM0214 Rev 10 |