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的典型流程是这样的:

  1. 硬件上拉/下拉特定引脚,让芯片上电后进入Bootloader模式
  2. 主机通过串口发送特定的握手命令(比如0x7F)
  3. 芯片回应确认,双方建立通信
  4. 主机发送擦除、编程、校验等指令
  5. 完成后复位芯片,跳转到用户程序

这里有个细节: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,串口烧录的整体流程都大同小异。我画了一张图,帮你把整个脉络理清楚。

串口烧录核心流程 串口烧录核心流程 主机准备固件 握手连接 擦除Flash 传输数据 校验 烧录完成 关键说明 • 握手失败会重试3次 • 传输过程有CRC校验 • 校验失败需重新擦除

这张图里,我特意把校验单独拉出来作为一个节点。为什么?因为很多人在优化烧录速度时,只盯着传输速率,却忽略了校验环节。实际上,校验往往占了总时间的20%~30%。后面我们会专门讲怎么优化它。

烧录过程中的关键参数

搞清楚了流程,咱们再来看看影响烧录速度和稳定性的几个关键参数。我列了个表,方便你对照。

参数 影响 典型值 我的建议
波特率 直接决定传输速度 9600 ~ 921600 量产用115200,开发可上460800
数据包大小 影响传输效率和重传代价 64 ~ 1024字节 256字节是平衡点
校验方式 影响稳定性和速度 无校验/奇偶校验/CRC 必须用CRC,别省
擦除粒度 影响擦除时间 扇区/页/整片 按扇区擦除,别整片擦
握手超时 影响连接成功率 1 ~ 5秒 3秒比较稳妥

一个小技巧:我习惯在握手成功后,先发一个“查询芯片信息”的命令,确认Flash大小和页尺寸。这样后面擦除和写入的时候,可以精确控制,避免越界。很多芯片的Bootloader都支持这个功能,别浪费了。

为什么串口烧录会不稳定?

这个问题,我当年被折磨得不轻。总结下来,串口烧录不稳定的原因主要有这么几个:

  • 电气干扰:串口线太长、地线没接好、电源纹波大,都会导致误码
  • 波特率偏差:主从双方的晶振精度不一致,高速率下累积误差
  • 握手失败:芯片上电时序和主机发送握手命令的时机没配合好
  • Flash操作超时:擦除或写入时间超过了芯片规定的最大值
  • 缓冲区溢出:主机发得太快,芯片来不及处理

嗯,这些问题,咱们后面的章节会一个一个拆解。今天先把基础打牢。

小结

这一章,我们聊了串口烧录的本质、UART/ISP/IAP的区别、烧录的核心流程,还有那些影响速度和稳定性的关键参数。说白了,串口烧录不是什么高深的技术,但细节决定成败。我见过太多人栽在波特率匹配、握手时序这些看似简单的问题上。