1. 烧录基础:串口烧录原理、常见协议与流程概览
大家好,我是你们这门课的老朋友。咱们今天开篇,先聊聊串口烧录这件事到底是怎么回事。说实话,我入行那会儿,烧录还主要靠并口和专用的编程器,后来串口烧录慢慢成了主流。为什么?说白了,就是串口太普及了,几乎每个MCU都带UART,成本低、接线简单。
你想想看,一个产品从开发到量产,烧录环节要是出问题,那可真叫一个头疼。我见过不少团队,硬件设计没问题,代码写得也挺好,结果卡在烧录这一步——要么速度慢得像蜗牛,要么十片里有两三片烧不进去。嗯,这其实就是我们今天要解决的痛点。
串口烧录的本质是什么?
串口烧录,本质上就是通过串行通信接口,把固件二进制数据从主机(通常是PC或烧录工装)传输到目标芯片的存储介质(Flash、EEPROM等)里。它依赖的是UART协议,也就是我们常说的串口。
这里有个关键点:串口本身并不“知道”自己在烧录。它只负责按波特率把字节发出去。真正让烧录成立的,是芯片内部预先固化的一段启动代码——也就是Bootloader。
核心理解:串口烧录 = UART物理层传输 + Bootloader协议层解析 + Flash编程操作。三者缺一不可。
常见协议:UART、ISP、IAP
很多初学者容易把这三个概念搞混。我简单梳理一下,你就明白了。
| 协议/概念 | 本质 | 典型场景 | 是否需要外部硬件 |
|---|---|---|---|
| UART | 物理层通信协议,定义电平、波特率、帧格式 | 串口通信、调试输出 | 需要UART转USB或RS232芯片 |
| ISP | 在系统编程,通过芯片专用引脚(如SPI、UART)烧录 | 工厂量产、开发调试 | 需要烧录器或专用工具 |
| IAP | 在应用编程,应用程序运行时自己更新固件 | OTA升级、远程维护 | 不需要外部硬件,靠Bootloader |
我个人习惯这样记:UART是路,ISP是开车去工厂拉货,IAP是车在路上自己换轮胎。形象吧?
UART——串口烧录的物理基础
UART(Universal Asynchronous Receiver/Transmitter)是一种异步串行通信协议。它只需要两根数据线:TX(发送)和RX(接收),再加上共地。没有时钟线,靠双方约定好的波特率来同步。
波特率这东西,我踩过坑。有一次项目急着出货,我把波特率设成了921600,想着能快一点。结果烧录十片,有三片校验失败。后来排查发现,是板子上的晶振精度不够,高速率下时钟偏差累积导致误码。从那以后,我养成了一个习惯:量产烧录,波特率不超过115200。除非你确认晶振精度和线缆质量都过硬。
避坑指南:我曾经在一条1.5米的杜邦线上跑460800波特率,结果数据全是乱码。串口线越长,波特率就得越低。这是物理定律,别跟它较劲。
ISP——在系统编程
ISP(In-System Programming)是指芯片已经焊接到电路板上之后,通过特定的引脚(比如STM32的BOOT0、BOOT1)进入烧录模式,然后由外部工具把固件写进去。
ISP的典型流程是这样的:
- 硬件上拉/下拉特定引脚,让芯片上电后进入Bootloader模式
- 主机通过串口发送特定的握手命令(比如0x7F)
- 芯片回应确认,双方建立通信
- 主机发送擦除、编程、校验等指令
- 完成后复位芯片,跳转到用户程序
这里有个细节:ISP的握手协议各家芯片不一样。ST的芯片用0x7F,NXP的可能是其他值。我当年第一次用GD32的时候,拿着ST的协议去握手,折腾了半天没反应——后来才发现GD的Bootloader命令格式有差异。
IAP——在应用编程
IAP(In-Application Programming)更灵活。它允许应用程序在运行时,通过调用芯片内部Bootloader的接口,擦除并重写Flash的指定区域。说白了,就是程序自己更新自己。
IAP的典型架构:
- Bootloader区:一段独立的、不会被擦除的启动代码
- 应用程序区:用户主程序
- 备份区/下载区:存放新固件的临时区域
更新流程大致是:Bootloader接收新固件 → 写入备份区 → 校验 → 擦除应用程序区 → 复制新固件 → 跳转执行。
个人经验:做IAP时,一定要留够Bootloader的Flash空间。我见过有人把Bootloader写得太大,结果应用程序没地方放了。建议Bootloader控制在4KB~16KB以内,具体看芯片。
烧录流程概览
不管是ISP还是IAP,串口烧录的整体流程都大同小异。我画了一张图,帮你把整个脉络理清楚。
这张图里,我特意把校验单独拉出来作为一个节点。为什么?因为很多人在优化烧录速度时,只盯着传输速率,却忽略了校验环节。实际上,校验往往占了总时间的20%~30%。后面我们会专门讲怎么优化它。
烧录过程中的关键参数
搞清楚了流程,咱们再来看看影响烧录速度和稳定性的几个关键参数。我列了个表,方便你对照。
| 参数 | 影响 | 典型值 | 我的建议 |
|---|---|---|---|
| 波特率 | 直接决定传输速度 | 9600 ~ 921600 | 量产用115200,开发可上460800 |
| 数据包大小 | 影响传输效率和重传代价 | 64 ~ 1024字节 | 256字节是平衡点 |
| 校验方式 | 影响稳定性和速度 | 无校验/奇偶校验/CRC | 必须用CRC,别省 |
| 擦除粒度 | 影响擦除时间 | 扇区/页/整片 | 按扇区擦除,别整片擦 |
| 握手超时 | 影响连接成功率 | 1 ~ 5秒 | 3秒比较稳妥 |
一个小技巧:我习惯在握手成功后,先发一个“查询芯片信息”的命令,确认Flash大小和页尺寸。这样后面擦除和写入的时候,可以精确控制,避免越界。很多芯片的Bootloader都支持这个功能,别浪费了。
为什么串口烧录会不稳定?
这个问题,我当年被折磨得不轻。总结下来,串口烧录不稳定的原因主要有这么几个:
- 电气干扰:串口线太长、地线没接好、电源纹波大,都会导致误码
- 波特率偏差:主从双方的晶振精度不一致,高速率下累积误差
- 握手失败:芯片上电时序和主机发送握手命令的时机没配合好
- Flash操作超时:擦除或写入时间超过了芯片规定的最大值
- 缓冲区溢出:主机发得太快,芯片来不及处理
嗯,这些问题,咱们后面的章节会一个一个拆解。今天先把基础打牢。
小结
这一章,我们聊了串口烧录的本质、UART/ISP/IAP的区别、烧录的核心流程,还有那些影响速度和稳定性的关键参数。说白了,串口烧录不是什么高深的技术,但细节决定成败。我见过太多人栽在波特率匹配、握手时序这些看似简单的问题上。