详解STM32的完整启动流程

一、复位/上电:工地开工!

  • 就像工地开工前,先要通电、清场、拉响开工铃,STM32芯片一旦上电或按下复位键,就会立刻"清场"------把所有寄存器、内存、外设都恢复到默认状态。

  • 这一步叫复位,确保一切从零开始,避免"上次施工留下的垃圾"影响这次启动。


二、根据BOOT0/BOOT1:决定从哪块地皮开始盖房子

  • STM32芯片内部有几块"地皮"(存储区域)可以存放程序:

    • 主Flash(0x0800 0000):就是"自家宅基地",程序通常烧录在这里。

    • 系统存储区(System Memory):芯片自带的"官方样板房",用于串口下载程序。

    • SRAM(0x2000 0000):临时"工地活动板房",调试时可能会用。

  • BOOT0和BOOT1是两个引脚,就像两个开关:

    • 如果BOOT0=0,无论BOOT1是什么,都从"自家宅基地"(主Flash)启动,这是最常见的。

    • 如果BOOT0=1,BOOT1=0,就从"官方样板房"(System Memory)启动,用于串口下载。

    • 如果BOOT0=1,BOOT1=1,就从"活动板房"(SRAM)启动,调试时用。

这一步决定了"从哪块地皮开始施工",一旦选定,后面所有的动作都围绕这块地皮展开。


三、初始化SP和PC:先搭好脚手架和定位仪

1. 把0x0800 0000位置的值放进SP(栈顶指针)
  • **SP(Stack Pointer)**就像工地上的"脚手架",程序运行时临时放东西(比如函数参数、局部变量)的地方。

  • STM32会先去"自家宅基地"的开头(0x0800 0000)读一个4字节的数,这个数就是"脚手架的顶端地址",然后把这个地址存到SP寄存器里。

  • 这个地址通常指向SRAM的顶部(比如0x2000 2000),因为SRAM是"活动板房",临时放东西最合适。

2. 把0x0800 0004位置的值放进PC(程序计数器)
  • **PC(Program Counter)**就像"定位仪",指向下一条要执行的指令。

  • STM32再去0x0800 0004(紧挨着刚才那个地址)读一个4字节的数,这个数就是"复位向量",也就是"真正开始干活的入口地址"。

  • 这个地址通常是Reset_Handler函数的地址,也就是"施工队长"第一次露面的地方。

3.Reset_Handler函数
cpp 复制代码
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

这一步就像"搭好脚手架,定好位",为后面的施工做好准备。


四、初始化系统时钟:接上工地电源,调好电压

  • 刚才只是"搭好脚手架",但工地还没通电,机器还转不起来。

  • 系统时钟初始化就像"接上电源,调好电压",让芯片的CPU、外设(比如串口、定时器)都能以正确的速度工作。

  • 这一步通常由SystemInit()函数完成,它会设置好时钟源(内部时钟、外部晶振)、倍频系数等,确保"工地电力充足"。


五、初始化用户堆栈:再检查一遍脚手架,确保安全

  • 虽然第三步已经搭好了"脚手架"(SP),但那是"应急用的"。

  • 用户堆栈初始化 就像"再检查一遍脚手架,确保结实可靠",这一步通常由C库函数_start__main完成。

  • 它会根据你的程序需求,重新布置堆(heap)和栈(stack),确保"施工过程中不会垮塌"。


六、进入main函数:正式开工盖房子!

  • 前面所有准备工作都做完后,终于轮到"真正的施工图纸"------main()函数登场了。

  • 就像"项目经理拿着图纸进场",从这一刻开始,你的代码才真正开始运行,控制LED、读取传感器、通信等所有功能都由你决定。

相关推荐
BreezeJuvenile6 小时前
外设模块学习(15)——MQ-2烟雾气体传感器(STM32)
stm32·单片机·学习·mq-2·烟雾气体传感器
Jie_jiejiayou8 小时前
定时器详解以及呼吸灯实现 — STM32(HAL库)
stm32·单片机·嵌入式硬件·定时器
逆小舟8 小时前
【STM32】定时器、PWM
stm32·单片机·嵌入式硬件
XH1.8 小时前
学习RT-thread(RT-thread定时器)
stm32·单片机·学习
QT 小鲜肉8 小时前
【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效)
linux·开发语言·笔记·单片机·压力测试
申克Lab8 小时前
STM32 串口概念 UART协议
stm32·单片机·嵌入式硬件
小莞尔8 小时前
【51单片机】【protues仿真】基于51单片机自动浇花系统
单片机·嵌入式硬件
沐欣工作室_lvyiyi9 小时前
基于51单片机的宠物喂食器的设计与实现(论文+源码)
单片机·嵌入式硬件·毕业设计·51单片机·宠物
hazy1k13 小时前
51单片机基础-最小系统设计
stm32·单片机·嵌入式硬件·mcu·51单片机·proteus
奋斗的牛马13 小时前
FPGA—ZYNQ学习spi(六)
单片机·嵌入式硬件·学习·fpga开发·信息与通信