
- •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 |
|
|
3.5.7MOVT
Move Top.
Syntax
MOVT{cond} Rd, #imm16
Where:
•‘cond’ is an optional condition code (see Conditional execution on page 65).
•‘Rd’ is the destination register.
•‘imm16’ is a 16-bit immediate constant.
Operation
MOVT writes a 16-bit immediate value, imm16, to the top halfword, Rd[31:16], of its destination register. The write does not affect Rd[15:0].
The MOV, MOVT instruction pair enables you to generate any 32-bit constant.
Restrictions
Rd must be neither SP nor PC.
Condition flags
This instruction does not change the flags.
Examples
MOVT R3, #0xF123 ; write 0xF123 to upper halfword of R3,
; lower halfword and APSR are unchanged
PM0214 Rev 10 |
91/262 |

The STM32 Cortex-M4 instruction set |
PM0214 |
|
|
3.5.8REV, REV16, REVSH, and RBIT
Reverse bytes and Reverse bits.
Syntax
op{cond} Rd, Rn
Where:
•‘op’ is one of the following:
REV: Reverse byte order in a word.
REV16: Reverse byte order in each halfword independently.
REVSH: Reverse byte order in the bottom halfword, and sign extends to 32 bits. RBIT: Reverse the bit order in a 32-bit word.
•‘cond’ is an optional condition code, see Conditional execution on page 65.
•‘Rd’ is the destination register.
•‘Rn’ is the register holding the operand.
Operation
Use these instructions to change endianness of data:
•REV: Converts either:
–32-bit big-endian data into little-endian data
–or 32-bit little-endian data into big-endian data.
•REV16: Converts either:
–16-bit big-endian data into little-endian data
–or 16-bit little-endian data into big-endian data.
•REVSH: Converts either:
–16-bit signed big-endian data into 32-bit signed little-endian data
–or 16-bit signed little-endian data into 32-bit signed big-endian data.
Restrictions
Do not use either SP or PC.
Condition flags
These instructions do not change the flags.
Examples
REV R3, R7 ; reverse byte order of value in R7 and write it to R3 REV16 R0, R0 ; reverse byte order of each 16-bit halfword in R0 REVSH R0, R5 ; reverse Signed Halfword
REVHS R3, R7 ; reverse with Higher or Same condition
RBIT R7, R8 ; reverse bit order of value in R8 and write result to R7
92/262 |
PM0214 Rev 10 |

PM0214 |
The STM32 Cortex-M4 instruction set |
|
|
3.5.9SADD16 and SADD8
Signed Add 16 and Signed Add 8
Syntax
op{cond}{Rd,} Rn, Rm
Where:
•op is any of the following:
SADD16: Performs two 16-bit signed integer additions. SADD8: Performs four 8-bit signed integer additions.
•‘cond’ is an optional condition code (see Conditional execution on page 65).
•‘Rd’ is the destination register.
•‘Rn’ is the register holding the operand.
•‘Rm’ is the second register holding the operand.
Operation
Use these instructions to perform a halfword or byte add in parallel:
The SADD16 instruction:
1.Adds each halfword from the first operand to the corresponding halfword of the second operand.
2.Writes the result in the corresponding halfwords of the destination register.
The SADD8 instruction:
1.Adds each byte of the first operand to the corresponding byte of the second operand.
2.Writes the result in the corresponding bytes of the destination register.
Restrictions
Do not use SP and do not use PC.
Condition flags
These instructions do not change the flags.
Examples
SADD16 R1, R0 ; Adds the halfwords in R0 to the corresponding halfword ; of R1 and writes to corresponding halfword of R1.
SADD8 R4, R0, R5 ; Adds bytes of R0 to the corresponding byte in R5 and ; writes to the corresponding byte in R4.
PM0214 Rev 10 |
93/262 |

The STM32 Cortex-M4 instruction set |
PM0214 |
|
|
3.5.10SHADD16 and SHADD8
Signed Halving Add 16 and Signed Halving Add 8
Syntax
op{cond}{Rd,} Rn, Rm
Where:
•op is any of the following: SHADD16: Signed halving add 16. SHADD8: Signed halving add 8.
•‘cond’ is an optional condition code (see Conditional execution on page 65).
•‘Rd’ is the destination register.
•‘Rn’ is the register holding the operand.
•‘Rm’ is the second operand register.
Operation
Use these instructions to add 16-bit and 8-bit data and then to halve the result before writing the result to the destination register:
The SHADD16 instruction:
1.Adds each halfword from the first operand to the corresponding halfword of the second operand.
2.Shuffles the result by one bit to the right, halving the data.
3.Writes the halfword results in the destination register.
The SHADDB8 instruction:
1.Adds each byte of the first operand to the corresponding byte of the second operand.
2.Shuffles the result by one bit to the right, halving the data.
3.Writes the byte results in the destination register.
Restrictions
Do not use SP and do not use PC.
Condition flags
These instructions do not change the flags.
Examples
SHADD16 R1, R0 ; Adds halfwords in R0 to corresponding halfword of R1 & ; writes halved result to corresponding halfword in R1
SHADD8 R4, R0, R5 ; Adds bytes of R0 to corresponding byte in R5 and ; writes halved result to corresponding byte in R4.
94/262 |
PM0214 Rev 10 |