STM32 启动模式与固件更新机制 (底层深度解析)

一、 核心基础:STM32 的内存映射机制 (Memory Aliasing)

要理解启动和烧录,必须先理解 ARM Cortex-M 内核的取指机制

当芯片上电或复位时,CPU 的程序计数器(PC 指针)被硬件强制设定为去寻找虚拟地址 0x0000 0000

  • 它会从 0x0000 0000 取出第一个数据,作为主堆栈指针 (MSP) 的初始值。

  • 它会从 0x0000 0004 取出第二个数据,作为复位向量 (Reset Vector),也就是程序真正开始执行的第一条指令的地址。

BOOT 引脚的作用,就是硬件级别的"地址重定向(映射)"。 物理存储器有自己的真实地址,通过配置 BOOT 引脚,总线矩阵会将不同的物理地址"伪装"成 0x0000 0000,骗过 CPU,从而决定芯片从哪里开始运行。


二、 三大物理存储区与 BOOT 引脚配置

BOOT1 BOOT0 映射到 0x0000 0000 的物理区域 存储介质特性 运行场景说明
X (任意) 0 主闪存 (Main Flash) 物理基址: 0x0800 0000 掉电不丢失。存放我们编写的业务逻辑代码和常量。 正常运行模式。上电后直接运行你的业务程序。
0 1 系统存储器 (System Memory) 物理基址: 0x1FFF B000 (视型号而定) 只读区 (ROM)。出厂固化了一段 Bootloader 程序,初始化了时钟、USART、USB、I2C 等通信外设。 串口烧录模式 (ISP)。运行官方 Bootloader,等待接收外部数据并烧入主 Flash。
1 1 内置 SRAM 物理基址: 0x2000 0000 掉电丢失。平时存放全局变量、堆栈数据。 SRAM 启动模式。极少用于生产,偶尔用于解除写保护或极高频代码的无延迟调试。

三、 三种程序烧录/升级方式深度剖析

这部分是你总结的精华,我在此基础上补充了底层的操作逻辑。

1. ICP (In-Circuit Programming) - 在电路编程

  • 使用的工具: 烧录器(ST-Link, J-Link 等)。

  • 底层原理: 硬件级别的绝对控制。烧录器通过 SWD 或 JTAG 接口,直接与芯片内部的调试组件(CoreSight)对话。它不需要芯片内部有任何 Bootloader 配合,直接通过硬件总线将数据暴力写入 Flash。

  • 适用场景: 开发阶段的频繁烧录与在线调试(单步运行、看内存、打断点)。

  • BOOT引脚要求: 无需特殊设置,保持 BOOT0=0 即可。

2. ISP (In-System Programming) - 在系统编程

  • 使用的工具: USB 转串口线(如 CH340)、原生的 USB 线或 I2C 主机。

  • 底层原理: 软件级别的通信配合。芯片必须改变启动模式BOOT0=1, BOOT1=0)并复位。此时 CPU 运行的是系统存储器里原厂写好的 Bootloader。上位机(电脑)通过特定的握手协议把 .bin.hex 发给单片机,原厂 Bootloader 接收到数据后,再调用内置函数将数据写到主 Flash 中。

  • 适用场景: 没有烧录器的情况,或者产品外壳只留了一个串口用于出厂批量烧录。

3. IAP (In-Application Programming) - 在应用编程 (核心重点)

  • 使用的工具: 网络模块(Wi-Fi、4G 模块)、外部存储(SD 卡、U 盘)。

  • 底层原理: 这是完全由开发者自己定义的双程序架构。此时 Flash 通常被分为两部分:

    • 第一部分 (起始位置如 0x0800 0000): 存放你自己写的 Custom Bootloader。它的任务是:联网通过 TCP/IP HTTP 请求下载升级包,或者去读取 SD 卡里的文件,将新程序写入 Flash 的后半部分。

    • 第二部分 (偏移位置如 0x0800 4000): 存放真正的 App 业务代码(带有天气查询、时间同步等实际功能的代码)。

  • 工作流: 芯片正常从 0x0800 0000(你的 Bootloader)启动。Bootloader 检查是否有升级标志。如果有,就通过网络或本地把固件拉取下来,擦除并写入 App 区,写完后通过函数指针跳转0x0800 4000 执行新程序;如果没有升级标志,则直接跳转到 App 区运行。

  • 适用场景: OTA(空中升级)、产品发布后的远程维护。

相关推荐
不悔哥1 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20161 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子1 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡1 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5552 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡2 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9662 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛2 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅2 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员2 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程