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分布

相关推荐
安庆平.Я25 分钟前
STM32——寄存器映射
c语言·stm32·单片机·嵌入式硬件·电脑
佳航张2 小时前
单片机启动流程和启动文件详解
单片机·嵌入式硬件
lixzest2 小时前
STM32中集成USB驱动
stm32·单片机·嵌入式硬件
努力做小白3 小时前
Linux驱动22 --- RV1126 环境搭建&&设备树修改
linux·驱动开发·单片机·嵌入式硬件·rv1126
阿川!3 小时前
嵌入式软件--stm32 DAY 9 定时器
stm32·单片机·嵌入式硬件
DIY机器人工房7 小时前
【科普】STM32CubeMX是配置工具,STM32CubeIDE是集成开发环境,二者互补但定位不同,前者负责初始化配置,后者专注代码开发调试。
单片机·嵌入式硬件·嵌入式·diy机器人工房
努力做小白8 小时前
Linux驱动20 --- FFMPEG视频API
linux·驱动开发·单片机·嵌入式硬件·ffmpeg·lvgl
得单片机的运16 小时前
STM32的蓝牙通讯(HAL库)
stm32·单片机·嵌入式硬件·蓝牙
国科安芯17 小时前
抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
运维·网络·人工智能·单片机·自动化
weixin_4526006918 小时前
GC8872刷式直流电机驱动器详解:3.6A驱动能力与PWM控制
stm32·单片机·嵌入式硬件·智能家居·音响·电动工具