
- •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 STM32 Cortex-M4 instruction set |
|
|
;of R2, saturates to 16 bits, writes to corresponding
;halfword of R4
QSUB8 R4, R2, R5 ; |
Subtracts |
bytes of R5 from the |
corresponding |
byte |
in R2 |
; |
saturates |
to 8 bits, writes to |
corresponding |
byte |
ofR4. |
3.7.4QASX and QSAX
Saturating Add and Subtract with Exchange and Saturating Subtract and Add with Exchange, signed.
Syntax
op{cond} {Rd}, Rm, Rn
Where:
•op’ is one of:
QASX Add and Subtract with Exchange and Saturate. QSAX Subtract and Add with Exchange and Saturate.
•‘cond’ is an optional condition code (see Conditional execution on page 65)
•‘Rd’ is the destination register.
•‘Rn, Rm’ are registers holding the first and second operands.
Operation
The QASX instruction:
1.Adds the top halfword of the source operand with bottom halfword of second operand.
2.Subtracts the top halfword of second operand from bottom highword of first operand.
3.Saturates the result of the subtraction and writes a 16-bit signed integer in the range – 215 ≤ x ≤ 215 – 1, where x equals 16, to the bottom halfword of the destination register.
4.Saturates the results of the sum and writes a 16-bit signed integer in the range
5.–215 ≤ x ≤ 215 – 1, where x equals 16, to the top halfword of the destination register.
The QSAX instruction:
1.Subtracts the bottom halfword of second operand from top highword of first operand.
2.Adds the bottom halfword of source operand with top halfword of second operand.
3.Saturates the results of the sum and writes a 16-bit signed integer in the range
4.–215 ≤ x ≤ 215 – 1, where x equals 16, to the bottom halfword of the destination register.
5.Saturates the result of the subtraction and writes a 16-bit signed integer in the range – 215 ≤ x ≤ 215 – 1, where x equals 16, to the top halfword of the destination register.
Restrictions
Do not use SP and do not use PC.
Condition flags
These instructions do not affect the condition code flags.
Examples
QASX |
R7, R4, R2 |
; Adds top halfword of R4 to bottom halfword of R2, |
; saturates to 16 bits, writes to top halfword of R7
PM0214 Rev 10 |
129/262 |

The STM32 Cortex-M4 instruction set |
PM0214 |
|
|
;Subtracts top highword of R2 from bottom halfword of
;R4, saturates to 16 bits and writes to bottom halfword
;of R7
QSAX R0, R3, R5 ; Subtracts bottom halfword of R5 from top halfword of
;R3, saturates to 16 bits, writes to top halfword of R0
;Adds bottom halfword of R3 to top halfword of R5,
;saturates to 16 bits, writes to bottom halfword of R0.
3.7.5QDADD and QDSUB
Saturating Double and Add and Saturating Double and Subtract, signed.
Syntax
op{cond} {Rd}, Rm, Rn
Where:
•op’ is one of:
QDADD Saturating Double and Add. QDSUB Saturating Double and Subtract.
•‘cond’ is an optional condition code (see Conditional execution on page 65)
•‘Rd’ is the destination register.
•‘Rn, Rm’ are registers holding the first and second operands.
Operation
The QDADD instruction:
1.Doubles the second operand value.
2.Adds the result of the doubling to the signed saturated value in the first operand.
3.Writes the result to the destination register.
The QDSUB instruction:
1.Doubles the second operand value.
2.Subtracts the doubled value from the signed saturated value in the first operand.
3.Writes the result to the destination register.
Both the doubling and the addition or subtraction have their results saturated to the 32-bit signed integer range –231 ≤ x ≤ 231– 1. If saturation occurs in either operation, it sets the Q flag in the APSR.
Restrictions
Do not use SP and do not use PC.
Condition flags
If saturation occurs, these instructions set the Q flag to 1.
Examples
QDADD |
R7, |
R4, |
R2 |
; Doubles and saturates |
R4 to 32 bits, adds R2, |
|||
|
|
|
|
; saturates |
to |
32 bits, |
writes to R7 |
|
QDSUB |
R0, |
R3, |
R5 |
; Subtracts |
R3 |
doubled and saturated |
to 32 bits |
130/262 |
PM0214 Rev 10 |

PM0214 |
The STM32 Cortex-M4 instruction set |
|
|
|
; from R5, saturates to 32 bits, writes to R0. |
3.7.6 |
UQASX and UQSAX |
Saturating Add and Subtract with Exchange and Saturating Subtract and Add with Exchange, unsigned.
Syntax
op{cond} {Rd}, Rm, Rn
Where:
• op’ is one of:
UQASX Add and Subtract with Exchange and Saturate. UQSAX Subtract and Add with Exchange and Saturate.
• ‘cond’ is an optional condition code (see Conditional execution on page 65)
• ‘Rd’ is the destination register.
• ‘Rn, Rm’ are registers holding the first and second operands.
Operation
The UQASX instruction:
1.Adds the bottom halfword of the source operand with top halfword of second operand.
2.Subtracts the bottom halfword of the second operand from the top highword of the first operand.
3.Saturates the results of the sum and writes a 16-bit unsigned integer in the range
4.0 ≤ x ≤ 216 – 1, where x equals 16, to the top halfword of the destination register.
5.Saturates the result of the subtraction and writes a 16-bit unsigned integer in the range 0 ≤ x ≤ 216 – 1, where x equals 16, to the bottom halfword of the destination register.
The UQSAX instruction:
1.Subtracts the bottom halfword of second operand from top highword of first operand.
2.Adds the bottom halfword of the first operand with the top halfword of the second operand.
3.Saturates the result of the subtraction and writes a 16-bit unsigned integer in the range 0 ≤ x ≤ 216 – 1, where x equals 16, to the top halfword of the destination register.
4.Saturates the results of the addition and writes a 16-bit unsigned integer in the range 0 ≤ x ≤ 216 – 1, where x equals 16, to the bottom halfword of the destination register.
Restrictions
Do not use SP and do not use PC.
Condition flags
These instructions do not affect the condition code flags.
Examples
UQASX R7, R4, R2 ; Adds top halfword of R4 with bottom halfword of R2,
;saturates to 16 bits, writes to top halfword of R7
;Subtracts top halfword of R2 from bottom halfword of
PM0214 Rev 10 |
131/262 |

The STM32 Cortex-M4 instruction set |
PM0214 |
|
|
; R4, saturates to 16 bits, writes to bottom halfword of R7 UQSAX R0, R3, R5 ; Subtracts bottom halfword of R5 from top halfword of
;R3, saturates to 16 bits, writes to top halfword of R0
;Adds bottom halfword of R4 to top halfword of R5
;saturates to 16 bits, writes to bottom halfword of R0.
3.7.7UQADD and UQSUB
Saturating Add and Saturating Subtract Unsigned.
Syntax
op{cond} {Rd}, Rn, Rm
op{cond} {Rd}, Rn, Rm
Where:
•op’ is one of:
UQADD8 Saturating four unsigned 8-bit integer additions. UQADD16 Saturating two unsigned 16-bit integer additions. UDSUB8 Saturating four unsigned 8-bit integer subtractions. UQSUB16 Saturating two unsigned 16-bit integer subtractions.
•‘cond’ is an optional condition code (see Conditional execution on page 65)
•‘Rd’ is the destination register.
•‘Rn, Rm’ are registers holding the first and second operands.
Operation
These instructions add or subtract two or four values and then writes an unsigned saturated value in the destination register.
The UQADD16 instruction:
1.Adds the respective top and bottom halfwords of the first and second operands.
2.Saturates the result of the additions for each halfword in the destination register to the unsigned range 0 ≤ x ≤ 216-1, where x is 16.
The UQADD8 instruction:
1.Adds each respective byte of the first and second operands.
2.Saturates the result of the addition for each byte in the destination register to the unsigned range 0 ≤ x ≤ 28-1, where x is 8.
The UQSUB16 instruction:
1.Subtracts both halfwords of the second operand from the respective halfwords of the first operand.
2.Saturates the result of the differences in the destination register to the unsigned range 0 ≤ x ≤ 216-1, where x is 16.
The UQSUB8 instructions:
1.Subtracts the respective bytes of the second operand from the respective bytes of the first operand.
2.Saturates the results of the differences for each byte in the destination register to the unsigned range 0 ≤ x ≤ 28-1, where x is 8.
132/262 |
PM0214 Rev 10 |

PM0214 |
The STM32 Cortex-M4 instruction set |
|
|
Restrictions
Do not use SP and do not use PC.
Condition flags
These instructions do not affect the condition code flags.
Examples
UQADD16 R7, R4, R2; Adds halfwords in R4 to corresponding halfword in R2,
|
|
; |
saturates to 16 bits, writes to corresponding halfword |
|
|
; |
of R7 |
UQADD8 |
R4, R2, R5 |
; Adds bytes of R2 to corresponding byte of R5, saturates |
|
|
|
; |
to 8 bits, writes to corresponding bytes of R4 |
UQSUB16 R6, R3, R0 |
; |
Subtracts halfwords in R0 from corresponding halfword |
|
|
|
; |
in R3, saturates to 16 bits, writes to corresponding |
|
|
; |
halfword in R6 |
UQSUB8 |
R1, R5, R6 |
; |
Subtracts bytes in R6 from corresponding byte of R5, |
|
|
; |
saturates to 8 bits, writes to corresponding byte of |
R1. |
|
|
|
PM0214 Rev 10 |
133/262 |