简化版MCU上电流程1. 外部电源接入芯片 VDD内部 LDO、模拟电路开始上电2. POR上电复位电压低于阈值时 持续复位3. 内核、外设、寄存器复位和 flash、RAM 就绪4. 等待HIS稳定5. 锁定boot值6. 上述操作完成后复位信号NRST拉高CPU内核退出复位硬件自动开始取指。MCU软件启动流程1. 上电硬件自动加载 主栈指针MSP2. 跳转到复位中断函数3. 初始化数据段.data、清.bss段4. 进入 main5. 用户初始化时钟、外设6. 进入主循环程序常见问题1. 数据段和 BSS 段是什么- .data 段有初始值的全局 / 静态变量需要从flash复制初始值- .bss 段没初始化的全局 / 静态变量启动时必须清 02. 启动文件 startup.s 作用startup.s汇编文件内部包含Reset_Handler 复位函数负责最早期硬件与 C 语言环境初始化没有它main函数跑不起来。3. 程序从哪里开始执行不是从 main 开始是从 Reset_Handler 复位函数开始再跳 main4. 什么是MSPMSP 本质是一个32位寄存器存放 栈内存的顶端地址。MSP 指向的栈 作用是 保存临时数据、函数局部变量。上电必须先初始化 MSP否则没有MSP指向的栈CPU无法调用函数、响应中断程序根本跑不起来关键特点栈是向下生长因此MSP 初始值是栈最高地址使用时地址不断减小普通版一、硬件上电时序1. 外部电源接入芯片 VDD/VSS内部 LDO、模拟电路开始上电2. 电源监控模块POR工作- POR上电复位电压低于阈值时持续输出复位信号3. 内核、外设、寄存器复位4. flash、RAM 就绪上电后可以稳定读写5. 等待HIS稳定6. 复位结束上述操作完成后需要额外的delay时间复位信号NRST拉高CPU内核退出复位硬件自动开始取指。delay时间解释一般上电时间很快所以POR复位信号很快就会释放但是芯片还需要复位内核、外设等模块等待模拟IP的稳定LDO、HIS、以及等待加载FLASH的OTP数据等。因此需要先把CPU内核复位拉低等待准备好后再释放NRST。二、硬件自动取指1. 硬件读取 BOOT0/BOOT1引脚电平选择向量表起始基地址- BOOT00向量表基址 0x08000000主 Flash 启动- BOOT01向量表基址 0x20000000SRAM启动或系统存储器BOOTloader2. 硬件从选中的基址读 0 偏移 MSP0x4 偏移 Reset_Handler 地址例如从flash启动Flash起始地址0x0800_0000也是中断向量表的基地址。地址0x08000000存放的是栈顶地址MSP即主栈指针地址0x08000004存放的是复位函数Reset_Handler的入口地址CPU内核复位结束后固定操作1. 从中断向量表的基地址0x08000000读取4字节作为主栈指针MSP2. 从地址0x08000004读取4字节作为复位函数Reset_Handler的入口地址写入程序计数器 PC3. CPU跳转到复位函数Reset_Handler入口地址正式进入软件启动阶段。三、软件启动全过程分为复位函数Reset_Handler → C库初始化 → main 函数阶段1执行startup.s里的复位函数Reset_Handler注复位中断服务函数是CPU上电执行的第一条代码执行复位函数Reset_Handler包含以下步骤1. .bss段 清零没初始化的全局 / 静态变量启动时必须清 02. .data段 数据初始化有初始值的全局 / 静态变量需要从flash复制初始值给全局变量赋初始值3. 跳转到标准库入口 __mainC 库初始化入口阶段2C标准库初始化__main编译器自带完成 C 标准库相关初始化随后调用用户 main 函数。阶段3用户main函数初始化应用层软件1. 初始化外设配置 RCC开启HSE/PLL、配置AHB/APB分频确定系统主频以及其他外设。2. 中断配置EXTI、NVIC 优先级、中断屏蔽3. 低功耗、定时器、串口、ADC 等外设初始化4. 主循环 while (1)阶段4程序运行中断抢占程序正常跑主循环外设产生中断请求送 NVIC打断主流程跳转到对应中断服务函数若进入 WFI/WFE 休眠由 EXTI、定时器等外设唤醒 CPU恢复运行。