stm32f407
+ -

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用于系统初始化的,包括时钟。通过调试的寄存器也验证了:
寄存器

0 篇笔记 写笔记

STM32F407ZG 启动分析
STM32F407ZG的启动方式可以通过BOOT0和BOOT1管脚进行配置。BOOT1BOOT0自举模式自举空间x0主 Flash选择主 Flash 作为自举空间01系统存储器选择系统存储器作为自举空间11嵌入式 SRAM选择嵌入式 SRAM 作......
作者信息
我爱开发
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!