讥慰捷 发表于 2025-9-26 11:41:46

典型arm32位单片机启动流程(从上电到main.c)

0 启动流程


[*]复位
[*]通过boot引脚选择启动模式
[*]从地址0x00000000读取 __initial_sp 初始栈顶值到MSP
[*]从地址0x00000004读取 Reset_Handler 地址到PC


[*]32位系统, 字长4字节

[*]指向复位向量的内容
[*]执行SystemInit函数, 初始化系统时钟
[*]执行__main, 软件设置SP指针, 初始化栈空间, 清除bss段, 最后跳转到mian函数

1 启动模式

BOOT0BOOT1启动模式0X从FLASH启动0x0800 000010从系统存储器启动(bootROM)11从RAM启动0x2000 0000

[*]pc指针在硬件复位后会自动指向0x0000 0000, 而Flash实际起始地址:0x0800 0000, RAM实际起始地址: 0x2000 0000, 硬件会自动将0x0000 0000映射到对应的地址
2 启动流程

2.1 Reset_Handler 复位向量

2.1.1 Reset_Handler 源代码:

; Reset handler
Reset_Handler    PROC
               EXPORTReset_Handler            
      IMPORTSystemInit
      IMPORT__main

               LDR   R0, =SystemInit
               BLX   R0
               LDR   R0, =__main
               BX      R0
               ENDP2.1.2 代码分析:

导入 SystemInit 和 __main 两个符号,并LDR数据到R0寄存器,跳转执行(BLX/BX)
2.2 SystemInit

2.2.1 SystemInit源代码:

2.2.1.1HAL库中的SystemInit

void SystemInit(void){/* FPU settings ------------------------------------------------------------*/#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)    SCB->CPACR |= ((3UL
页: [1]
查看完整版本: 典型arm32位单片机启动流程(从上电到main.c)