STM32八股【10】-----stm32启动流程

启动流程

1.上电复位

2.系统初始化

3.跳转到 main 函数

启动入口:

  • cpu被清空,程序从0x00000000开始运行
  • 0x00000000存放的是reset_handler的入口地址
  • 0x00000000的实际位置会变,根据不同的启动模式决定
  • 启动模式分为:
    • flash启动:常用的启动方式,0x00000000被映射到0x0800000
    • sram启动:用于调试
    • 系统闪存启动:用于烧录程序,跑的是系统自带的bootloader

初始化中断向量表

  • 0x00000000存放的是中断向量表的起始位置

  • 中断向量表的前4个字节是 _initial_sp, 表示 主栈指针(MSP) 的初始地址,用来设置堆栈指针(SP)

    asm 复制代码
    Stack_Size      EQU     0x00000400
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    __initial_sp

    其中_initial_sp是一个标号,代表栈+堆,即栈顶

  • 然后从下一个地址(0x08000004)读取复位处理程序的地址(Reset_Handler),并跳转到那里执行

    asm 复制代码
    ; Reset handler
    Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

    Reset_Handler中主要:

    • 调用了systemInit,配置系统时钟等硬件。
    • 进入了_main函数,复制数据,跳转用户main函数

SystemInit 是 ST 库提供的函数,负责初始化时钟、外设等,比如设置系统时钟为 72MHz。
__main 是 C 运行时库的入口,它会初始化全局变量(复制 .data 段到 SRAM,清零 .bss 段),然后跳转到用户写的 main 函数,至此头文件初始化完成。
stm32 ram和flash分布

相关推荐
LCMICRO-1331084774634 分钟前
长芯微LPS123完全P2P替代ADP123,高性能、低压差的线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·线性稳压器
守护安静星空2 小时前
esp32开发笔记-工程搭建
笔记·单片机·嵌入式硬件·物联网·visual studio code
ACP广源盛139246256732 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
时空自由民.4 小时前
ST7701S 3.5寸显示屏
单片机
金戈鐡馬4 小时前
BetaFlight中的定时器引脚绑定详解
stm32·单片机·嵌入式硬件·无人机
Wave8455 小时前
FreeRTOS软件定时器详解
stm32·单片机·freertos
VBsemi-专注于MOSFET研发定制6 小时前
奶茶制作机器人功率MOSFET选型方案——高效、精准与可靠驱动系统设计指南
单片机·嵌入式硬件
水云桐程序员7 小时前
单片机项目从入门到精通
单片机·嵌入式硬件
Wave8457 小时前
STM32 裸机中断与 FreeRTOS 中断管理的四大核心差异
单片机·嵌入式硬件
若忘即安8 小时前
【硬件电路设计18】WIFI+BlueTooth
单片机·嵌入式硬件