STM32F407ZG 启动分析
2022-01-01
11
0
STM32F407ZG的启动方式可以通过BOOT0和BOOT1管脚进行配置。
BOOT1 | BOOT0 | 自举模式 | 自举空间 |
---|---|---|---|
x | 0 | 主 Flash | 选择主 Flash 作为自举空间 |
0 | 1 | 系统存储器 | 选择系统存储器作为自举空间 |
1 | 1 | 嵌入式 SRAM | 选择嵌入式 SRAM 作为自举空间 |
CPU上电复位后,CPU 将从地址 0x0000 0000 获取栈顶值,然后从始于 0x0000 0004 的自举存储器开始执行代码。
启动的0x0000 0000和0x08000 0000f地址内容相同,这是由于FLASH进行了映射。
STM32F407ZG自带了1M的FLASH,其将扇区0映射到了0X0800 0000处。
编译后的代码内存如下:
0x08000000 0660 DCW 0x0660
0x08000002 2000 DCW 0x2000
0x08000004 020D DCW 0x020D
0x08000006 0800 DCW 0x0800
0x08000008 0377 DCW 0x0377
0x0800000A 0800 DCW 0x0800
0x0800000C 036F DCW 0x036F
0x0800000E 0800 DCW 0x0800
0x08000010 0373 DCW 0x0373
0x08000012 0800 DCW 0x0800
0x08000014 02BF DCW 0x02BF
0x08000016 0800 DCW 0x0800
0x08000018 04F9 DCW 0x04F9
0x0800001A 0800 DCW 0x0800
0x0800001C 0000 DCW 0x0000
0x0800001E 0000 DCW 0x0000
0x08000020 0000 DCW 0x0000
0x08000022 0000 DCW 0x0000
0x08000024 0000 DCW 0x0000
0x08000026 0000 DCW 0x0000
0x08000028 0000 DCW 0x0000
0x0800002A 0000 DCW 0x0000
0x0800002C 039D DCW 0x039D
0x0800002E 0800 DCW 0x0800
0x08000030 02C3 DCW 0x02C3
0x08000032 0800 DCW 0x0800
0x08000034 0000 DCW 0x0000
0x08000036 0000 DCW 0x0000
0x08000038 0379 DCW 0x0379
0x0800003A 0800 DCW 0x0800
0x0800003C 048D DCW 0x048D
0x0800003E 0800 DCW 0x0800
0x08000040 0227 DCW 0x0227
0x08000042 0800 DCW 0x0800
0x08000044 0227 DCW 0x0227
0x08000046 0800 DCW 0x0800
0x08000048 0227 DCW 0x0227
0x0800004A 0800 DCW 0x0800
0x0800004C 0227 DCW 0x0227
0x0800004E 0800 DCW 0x0800
0x08000050 0227 DCW 0x0227
0x08000052 0800 DCW 0x0800
0x08000054 0227 DCW 0x0227
0x08000056 0800 DCW 0x0800
0x08000058 0227 DCW 0x0227
0x0800005A 0800 DCW 0x0800
0x0800005C 0227 DCW 0x0227
0x0800005E 0800 DCW 0x0800
0x08000060 0227 DCW 0x0227
0x08000062 0800 DCW 0x0800
0x08000064 0227 DCW 0x0227
0x08000066 0800 DCW 0x0800
0x08000068 0227 DCW 0x0227
0x0800006A 0800 DCW 0x0800
0x0800006C 0227 DCW 0x0227
0x0800006E 0800 DCW 0x0800
0x08000070 0227 DCW 0x0227
0x08000072 0800 DCW 0x0800
0x08000074 0227 DCW 0x0227
0x08000076 0800 DCW 0x0800
0x08000078 0227 DCW 0x0227
0x0800007A 0800 DCW 0x0800
0x0800007C 0227 DCW 0x0227
0x0800007E 0800 DCW 0x0800
0x08000080 0227 DCW 0x0227
0x08000082 0800 DCW 0x0800
0x08000084 0227 DCW 0x0227
0x08000086 0800 DCW 0x0800
0x08000088 0227 DCW 0x0227
0x0800008A 0800 DCW 0x0800
0x0800008C 0227 DCW 0x0227
0x0800008E 0800 DCW 0x0800
0x08000090 0227 DCW 0x0227
0x08000092 0800 DCW 0x0800
0x08000094 0227 DCW 0x0227
0x08000096 0800 DCW 0x0800
0x08000098 0227 DCW 0x0227
0x0800009A 0800 DCW 0x0800
0x0800009C 0227 DCW 0x0227
0x0800009E 0800 DCW 0x0800
0x080000A0 0227 DCW 0x0227
0x080000A2 0800 DCW 0x0800
0x080000A4 0227 DCW 0x0227
0x080000A6 0800 DCW 0x0800
0x080000A8 0227 DCW 0x0227
0x080000AA 0800 DCW 0x0800
0x080000AC 0227 DCW 0x0227
0x080000AE 0800 DCW 0x0800
0x080000B0 0227 DCW 0x0227
0x080000B2 0800 DCW 0x0800
0x080000B4 0227 DCW 0x0227
0x080000B6 0800 DCW 0x0800
0x080000B8 0227 DCW 0x0227
0x080000BA 0800 DCW 0x0800
0x080000BC 0227 DCW 0x0227
0x080000BE 0800 DCW 0x0800
0x080000C0 0227 DCW 0x0227
0x080000C2 0800 DCW 0x0800
0x080000C4 0227 DCW 0x0227
0x080000C6 0800 DCW 0x0800
0x080000C8 0227 DCW 0x0227
0x080000CA 0800 DCW 0x0800
0x080000CC 0227 DCW 0x0227
0x080000CE 0800 DCW 0x0800
0x080000D0 0227 DCW 0x0227
0x080000D2 0800 DCW 0x0800
0x080000D4 0227 DCW 0x0227
0x080000D6 0800 DCW 0x0800
0x080000D8 0227 DCW 0x0227
0x080000DA 0800 DCW 0x0800
0x080000DC 0227 DCW 0x0227
0x080000DE 0800 DCW 0x0800
0x080000E0 0227 DCW 0x0227
0x080000E2 0800 DCW 0x0800
0x080000E4 0227 DCW 0x0227
0x080000E6 0800 DCW 0x0800
0x080000E8 0227 DCW 0x0227
0x080000EA 0800 DCW 0x0800
0x080000EC 0227 DCW 0x0227
0x080000EE 0800 DCW 0x0800
0x080000F0 0227 DCW 0x0227
0x080000F2 0800 DCW 0x0800
0x080000F4 0227 DCW 0x0227
0x080000F6 0800 DCW 0x0800
0x080000F8 0227 DCW 0x0227
0x080000FA 0800 DCW 0x0800
0x080000FC 0227 DCW 0x0227
0x080000FE 0800 DCW 0x0800
0x08000100 0227 DCW 0x0227
0x08000102 0800 DCW 0x0800
0x08000104 0227 DCW 0x0227
0x08000106 0800 DCW 0x0800
0x08000108 0227 DCW 0x0227
0x0800010A 0800 DCW 0x0800
0x0800010C 0227 DCW 0x0227
0x0800010E 0800 DCW 0x0800
0x08000110 0227 DCW 0x0227
0x08000112 0800 DCW 0x0800
0x08000114 0227 DCW 0x0227
0x08000116 0800 DCW 0x0800
0x08000118 0227 DCW 0x0227
0x0800011A 0800 DCW 0x0800
0x0800011C 0227 DCW 0x0227
0x0800011E 0800 DCW 0x0800
0x08000120 0227 DCW 0x0227
0x08000122 0800 DCW 0x0800
0x08000124 0227 DCW 0x0227
0x08000126 0800 DCW 0x0800
0x08000128 0227 DCW 0x0227
0x0800012A 0800 DCW 0x0800
0x0800012C 0227 DCW 0x0227
0x0800012E 0800 DCW 0x0800
0x08000130 0227 DCW 0x0227
0x08000132 0800 DCW 0x0800
0x08000134 0227 DCW 0x0227
0x08000136 0800 DCW 0x0800
0x08000138 0227 DCW 0x0227
0x0800013A 0800 DCW 0x0800
0x0800013C 0227 DCW 0x0227
0x0800013E 0800 DCW 0x0800
0x08000140 0227 DCW 0x0227
0x08000142 0800 DCW 0x0800
0x08000144 0227 DCW 0x0227
0x08000146 0800 DCW 0x0800
0x08000148 0227 DCW 0x0227
0x0800014A 0800 DCW 0x0800
0x0800014C 0227 DCW 0x0227
0x0800014E 0800 DCW 0x0800
0x08000150 0227 DCW 0x0227
0x08000152 0800 DCW 0x0800
0x08000154 0227 DCW 0x0227
0x08000156 0800 DCW 0x0800
0x08000158 0227 DCW 0x0227
0x0800015A 0800 DCW 0x0800
0x0800015C 0227 DCW 0x0227
0x0800015E 0800 DCW 0x0800
0x08000160 0227 DCW 0x0227
0x08000162 0800 DCW 0x0800
0x08000164 0227 DCW 0x0227
0x08000166 0800 DCW 0x0800
0x08000168 0227 DCW 0x0227
0x0800016A 0800 DCW 0x0800
0x0800016C 0227 DCW 0x0227
0x0800016E 0800 DCW 0x0800
0x08000170 0227 DCW 0x0227
0x08000172 0800 DCW 0x0800
0x08000174 0227 DCW 0x0227
0x08000176 0800 DCW 0x0800
0x08000178 0227 DCW 0x0227
0x0800017A 0800 DCW 0x0800
0x0800017C 0227 DCW 0x0227
0x0800017E 0800 DCW 0x0800
0x08000180 0227 DCW 0x0227
0x08000182 0800 DCW 0x0800
0x08000184 0227 DCW 0x0227
0x08000186 0800 DCW 0x0800
0x08000188 F000F802 BL.W __scatterload (0x08000190)
0x0800018C F000F82E BL.W __rt_entry (0x080001EC)
0x08000190 A00A ADR r0,{pc}+4 ; @0x080001BC
0x08000192 E8900C00 LDM r0,{r10-r11}
0x08000196 4482 ADD r10,r10,r0
0x08000198 4483 ADD r11,r11,r0
0x0800019A F1AA0701 SUB r7,r10,#0x01
0x0800019E 45DA CMP r10,r11
0x080001A0 D101 BNE 0x080001A6
0x080001A2 F000F823 BL.W __rt_entry (0x080001EC)
0x080001A6 F2AF0E09 ADR.W lr,{pc}-0x07 ; @0x0800019F
0x080001AA E8BA000F LDM r10!,{r0-r3}
0x080001AE F0130F01 TST r3,#0x01
0x080001B2 BF18 IT NE
0x080001B4 1AFB SUBNE r3,r7,r3
0x080001B6 F0430301 ORR r3,r3,#0x01
0x080001BA 4718 BX r3
0x080001BC 0424 DCW 0x0424
从这里可以看到,其对应startup_stm32f40_41xxx.s里面相应的汇编内容。
而生成的.hex文件的内容如下:
:02000004 0800F2
:10000000 600600200D020008770300086F03000857
:10001000 73030008BF020008F90400080000000094
:10002000 0000000000000000000000009D03000828
:10003000 C302000800000000790300088D040008D6
:10004000 27020008270200082702000827020008EC
:10005000 27020008270200082702000827020008DC
:10006000 27020008270200082702000827020008CC
:10007000 27020008270200082702000827020008BC
:10008000 27020008270200082702000827020008AC
:10009000 270200082702000827020008270200089C
:1000A000 270200082702000827020008270200088C
:1000B000 270200082702000827020008270200087C
:1000C000 270200082702000827020008270200086C
:1000D000 270200082702000827020008270200085C
:1000E000 270200082702000827020008270200084C
:1000F000 270200082702000827020008270200083C
:10010000 270200082702000827020008270200082B
:10011000 270200082702000827020008270200081B
:10012000 270200082702000827020008270200080B
:10013000 27020008270200082702000827020008FB
:10014000 27020008270200082702000827020008EB
:10015000 27020008270200082702000827020008DB
:10016000 27020008270200082702000827020008CB
:10017000 27020008270200082702000827020008BB
:10018000 270200082702000800F002F800F02EF80D
:10019000 0AA090E8000C82448344AAF10107DA45E2
:1001A000 01D100F023F8AFF2090EBAE80F0013F006
...
可以看到,写之相对应。
从汇编可以看到,其堆栈的栈顶SP=0x20000660,程序的入口地址PC=0x0800 020D,下一条指令为0x0800 020E,这样对应的汇编为:
0x0800020C 4809 LDR r0,[pc,#36] ; @0x08000234
183: BLX R0
0x0800020E 4780 BLX r0
184: LDR R0, =__main
0x08000210 4809 LDR r0,[pc,#36] ; @0x08000238
185: BX R0
186: ENDP
可以看到,正好为这一段相对的汇编代码:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
可以看到,实际是是先运行SystemInit函数,然后再调用我们的main函数。其中SystemInit用于系统初始化的,包括时钟。通过调试的寄存器也验证了: