程序变成二进制后,如何从电脑硬盘"搬运"到单片机Flash?
本文详解单片机存储系统、两种烧录方式、Bootloader工作原理,适合嵌入式开发者理解底层机制。
01 先认识单片机的"仓库群"
烧录的本质,就是把编译好的二进制文件从电脑复制到单片机的Flash中。要理解这个过程,需要先搞清楚单片机内部的存储系统:
| 存储器类型 | 特点 | 用途 |
|---|---|---|
| Flash | 掉电不丢失,可擦写 | 存储程序代码、常量 |
| RAM | 掉电丢失,可随机读写 | 存储变量、堆栈 |
| ROM | 出厂固化,用户无法修改 | 存储Bootloader |
- Flash 是"长期仓库",程序代码存放在这里,断电后依然保留。
- RAM 是"临时工作台",程序运行时存放变量,断电即清空。
- ROM 是"官方配送中心",芯片出厂时就固化了Bootloader程序。
02 两种烧录方式
方式一:调试器直连(ST-Link / J-Link)
这就像叫了一辆专车,直接把货物送到目的地:
- 优点:速度快、操作简单,支持在线调试。
- 缺点:需要购买专用下载器。
- 适用场景:开发调试阶段。
方式二:串口 / USB 烧录
这就像通过物流中转:数据先发送到系统存储器中的Bootloader,再由Bootloader写入Flash:
- 优点:无需专用下载器,只需串口线或USB线。
- 缺点:需要配置Boot引脚,步骤稍多。
- 适用场景:量产阶段,可节省下载器成本。
03 Bootloader:官方指定的"搬运工"
Bootloader是芯片厂商出厂时预先固化在系统存储器中的一段小程序,它的工作流程如下:
来自 linuxros.cn · linuxROS
- 等待指令 — 通过串口/USB等待电脑发送烧录指令。
- 接收数据 — 接收电脑传来的二进制文件。
- 写入Flash — 将数据写入Flash指定地址。
- 校验确认 — 校验写入的数据是否正确。
- 启动程序 — 告诉CPU:"可以开始干活了!"
04 Boot引脚:决定CPU从哪里启动
STM32的启动模式由BOOT0和BOOT1两个引脚决定:
| BOOT0 | BOOT1 | 启动方式 | 说明 |
|---|---|---|---|
| 0 | X | 从Flash启动 | 正常运行用户程序 |
| 1 | 0 | 从系统存储器启动 | 运行Bootloader,用于烧录 |
| 1 | 1 | 从SRAM启动 | 调试用,不常用 |
05 烧录完整流程
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 配置Boot引脚 | BOOT0=1, BOOT1=0,选择Bootloader模式 |
| 2 | 按下复位键 | CPU被"唤醒" |
| 3 | 加载Bootloader | CPU从系统存储器启动Bootloader |
| 4 | 等待指令 | Bootloader通过串口/USB等待电脑指令 |
| 5 | 发送数据 | 电脑将二进制文件发送给Bootloader |
| 6 | 擦除Flash | Bootloader擦除Flash目标扇区 |
| 7 | 写入Flash | 将数据写入Flash |
| 8 | 校验数据 | 读取并校验,确保写入正确 |
| 9 | 切换Boot引脚 | BOOT0=0,恢复从Flash启动 |
| 10 | 复位运行 | CPU从Flash启动,程序开始运行 |
06 常见问题
Q:为什么链接后的文件比目标文件大很多?
A:链接器会把依赖的库文件(如libc)也链接进来,因此文件体积会增大。
Q:Flash和RAM有什么区别?
A:Flash掉电不丢失,用于存储程序代码;RAM掉电丢失,读写速度更快,用于存储运行时的变量。
07 总结
二进制烧录的本质,就是通过调试器或Bootloader,将程序文件从电脑传输到单片机的Flash中。理解这个流程后,遇到烧录问题时就能快速定位原因,从容解决。