找回密码
 立即注册
首页 业界区 业界 典型arm32位单片机启动流程(从上电到main.c) ...

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

兜蛇 2025-7-28 12:49:08
0 启动流程


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


  • 32位系统, 字长4字节

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

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 源代码:
  1. ; Reset handler
  2. Reset_Handler    PROC
  3.                  EXPORT  Reset_Handler             [WEAK]
  4.         IMPORT  SystemInit
  5.         IMPORT  __main
  6.                  LDR     R0, =SystemInit
  7.                  BLX     R0
  8.                  LDR     R0, =__main
  9.                  BX      R0
  10.                  ENDP
复制代码
2.1.2 代码分析:

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

2.2.1 SystemInit源代码:

2.2.1.1HAL库中的SystemInit

[code]void SystemInit(void){  /* FPU settings ------------------------------------------------------------*/  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)    SCB->CPACR |= ((3UL

相关推荐

您需要登录后才可以回帖 登录 | 立即注册