
MCU启动流程ps其中地址是假设值MCU白启动流程1.上电电压升到阈值 →释放复位信号不是触发复位。POR 上电阶段是保持复位有效按住 CPU电压稳定后撤销复位CPU 才开始干活。2.硬件采样 BOOT0 引脚电平从 0x00000000 进行地址映射到 0x08000000 这个 flash 地址。3. 在这个 flash 地址开头有 flash 是向量表内核硬件自动读取向量表第 0 项的值载入内核 MSP 寄存器配置完栈顶指针向量表第 1 项是 Reset_Handler 地址硬件自动把这个地址载入 PCCPU 跳转到 Reset_Handler。4.Reset_Handler汇编调用SystemInit()完成时钟、Flash 等待周期然后跳转至 C 库入口__main。拷贝.data、清零.bss 是__main 里面做的。__main全部内存初始化完成之后才调用用户main()。MCU启动BOOTLOAD情况下1. 硬件采样 BOOT000x00000000 映射到 Flash 起始 0x08000000Boot 分区开头。2.读向量表加载 Boot 的 MSP 栈顶读取 Boot 的 Reset_Handler 地址送入 PC。CPU 开始执行 Bootloader 的启动代码。3. 初始化底层外设CRC 校验模块。4. 校验 App 程序。情况 AApp 校验合法 → 准备跳转到 App。情况 BApp 损坏 / 不存在 / 校验失败 → 停留在 Bootloader等待上位机升级接收固件写入 App 分区。 5. 跳转过去相当于软件触发一次 “逻辑复位”App 独立完整走一套启动流程。进入 App 的 Reset_Handler然后走一遍正常启动的流程。5. 跳转过去相当于软件触发一次 “逻辑复位”App 独立完整走一套启动流程。进入 App 的 Reset_Handler然后走一遍正常启动的流程。ps1.跳转app过程中关闭所有 Boot 打开的中断SysTick、UART、定时器等清除中断挂起位。关闭已经开启的外设。2.bootload的Reset_Handler是硬件跳转是拿到固件的时候就定死的而后面app重新启动的Reset_Handler是软件复位是可以人为配置的。A/B 双分区 Bootloader核心思想Flash 划分A 分区、B 分区两个分区都可以存放完整 App 固件任何时刻只有一个分区是可运行的「活动分区」另一个作为备份 / 待升级分区。1. 在 bootload 的 main启动之后 初始化串口 / 无线、Flash 驱动、CRC读取【分区标记区】判断分区状态。2. 知道哪个分区是活动分区active本次要从这个分区启动知道 A/B 分区各自固件 CRC、固件版本升级标记 / 校验标记 / 回滚标记。3.A 区 CRC 合法正常走完整流程并运行业务。不合法切换 B 区进行 B 固件的校验B 区 CRC 合法就启动 B 区B 区不合法就停在 BOOT 的 main当中其中可能有循环去等待 OTA。4. 升级包写入【非活动分区】全部写入完成后App 计算 B 分区完整 CRC写入 Flash 标记区设置标记准备把 B 置为下一次启动的活动分区。App 触发软复位。ps写CRC标志位可以在接受完固件后完成也可以在BOOT效验的时候再去计算。5.重启后 Boot 读取标记尝试启动 B 分区B 分区 CRC 合法跳转到 B 的 App。App 正常启动成功写入启动确认标记B 成为稳定活动分区。若 B 固件异常App 来不及写入确认标记就崩溃看门狗复位Boot 检测到尝试启动 B 但无成功标记自动回滚将活动分区切回 A。