54 lines
918 B
ArmAsm
54 lines
918 B
ArmAsm
@; Assembler sequence to erase option bytes on STM32
|
|
@; Takes no parameters, ends with BKPT instruction
|
|
.global _start
|
|
|
|
.equ FLASHBASE, 0x40022000
|
|
|
|
.equ KEY1, 0x45670123
|
|
.equ KEY2, 0xCDEF89AB
|
|
|
|
.equ FLASH_KEY, 0x04
|
|
.equ FLASH_OPTKEY, 0x08
|
|
.equ FLASH_CR, 0x10
|
|
.equ FLASH_SR, 0x0C
|
|
|
|
.equ OPTER, 0x20
|
|
.equ STRT, 0x40
|
|
|
|
.equ BSY, 0x01
|
|
|
|
.syntax unified
|
|
|
|
_start:
|
|
@; Load FLASH controller base address
|
|
ldr r0, =FLASHBASE
|
|
|
|
@; Do unlocking sequence
|
|
ldr r1, =KEY1
|
|
str r1, [r0, #FLASH_KEY]
|
|
ldr r1, =KEY2
|
|
str r1, [r0, #FLASH_KEY]
|
|
|
|
@; Same for option bytes
|
|
ldr r1, =KEY1
|
|
str r1, [r0, #FLASH_OPTKEY]
|
|
ldr r1, =KEY2
|
|
str r1, [r0, #FLASH_OPTKEY]
|
|
|
|
@; Set OPTER bit in FLASH_CR
|
|
ldr r1, [r0, #FLASH_CR]
|
|
orr r1, r1, #OPTER
|
|
str r1, [r0, #FLASH_CR]
|
|
@; Set STRT bit in FLASH_CR
|
|
orr r1, r1, #STRT
|
|
str r1, [r0, #FLASH_CR]
|
|
|
|
_wait: @; Wait for BSY bit to clear
|
|
ldr r4, [r0, #FLASH_SR]
|
|
mov r6, #BSY
|
|
tst r4, r6
|
|
bne _wait
|
|
|
|
bkpt
|
|
|