aboutsummaryrefslogtreecommitdiff
path: root/scripts/stubs/stm32_opterase.S
blob: aea83e7a5e5bfc9020f42d1c17f90ffa9fce0183 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@; 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