典型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]