1. 串口烧录基础:串口通信原理、烧录协议概述、常见烧录失败原因分析

各位工程师朋友,咱们开始第一讲。串口烧录,说白了就是通过串口把固件数据从电脑搬到芯片里。听起来简单,但这里面的门道可不少。我做了这么多年嵌入式,见过太多人栽在第一步——连串口通信的基本原理都没吃透,就开始调烧录速度,结果越调越崩。

这一章,咱们把地基打牢。我会从串口通信的物理层讲起,再到烧录协议怎么工作,最后聊聊那些让人头疼的烧录失败案例。嗯,都是实战中踩过的坑。

1.1 串口通信原理:从电平到字节

串口通信,全称是通用异步收发传输器(UART)。它只需要两根数据线——TX(发送)和 RX(接收),外加一根地线。数据是一位一位串行传输的,所以叫“串口”。

我刚开始学的时候,总觉得异步通信很神秘。其实说白了,就是收发双方约定好一个“节奏”,各自按这个节奏采样电平。这个节奏就是波特率。

核心概念:波特率

波特率表示每秒传输的符号数。在串口中,一个符号就是一个比特。所以 115200 波特率,就是每秒传 115200 个比特。注意,这包含了起始位、数据位、校验位和停止位,不是纯数据。

一个完整的串口数据帧长这样:

  • 起始位:1 位,逻辑 0,告诉接收方“我要发数据了”
  • 数据位:5~9 位,常用 8 位,就是你要传的字节
  • 校验位:可选,奇校验或偶校验,用于检错
  • 停止位:1 位或 2 位,逻辑 1,表示帧结束

举个例子,传一个字节 0x55(二进制 01010101),在 8N1 格式下(8 数据位、无校验、1 停止位),实际线上传输的是:

起始位(0) + 数据位(10101010) + 停止位(1)
注意:数据位是先传最低位(LSB first),所以 0x55 的二进制 01010101 在线上是 10101010

为什么会这样?因为串口协议规定先传低位。我记得第一次用逻辑分析仪抓波形时,看到数据反着来,还以为是板子坏了。后来才明白,这是标准做法。

1.2 烧录协议概述:不只是传数据

串口烧录不是简单地把二进制文件扔给芯片。它有一套完整的协议,通常包含这几个阶段:

  1. 握手阶段:烧录工具发送特定指令,芯片进入烧录模式
  2. 参数协商:确认芯片型号、烧录地址、数据长度等
  3. 数据传输:分块发送固件数据,每块带校验
  4. 校验阶段:芯片计算 CRC 或校验和,与工具比对
  5. 退出阶段:烧录完成,芯片复位运行新固件

不同的芯片厂商,协议细节差别很大。比如 STM32 的串口 ISP 协议,用的是 0x7F 握手;ESP32 的串口下载协议,则用特定的同步序列。但核心逻辑都一样——确保数据完整、可靠地写入 Flash。

我的经验:很多工程师只关注数据传输阶段的速度,忽略了握手和校验阶段的开销。其实在烧录小文件时,握手时间可能占总时间的 30% 以上。优化时别只盯着波特率。

下面这张图,展示了典型的串口烧录流程:

串口烧录典型流程 上电/复位 握手阶段 参数协商 数据传输(分块) 校验阶段 退出/复位运行 常见握手方式: 发送 0x7F / 特定同步序列 每块数据后需等待 ACK 块大小通常 128~1024 字节 校验方式:CRC32 / 累加和 波特率协商: 工具发查询,芯片回复支持速率

1.3 常见烧录失败原因分析

这部分是重点。我这些年处理过的烧录问题,少说也有上百个。总结下来,90% 的失败原因就这几类:

失败类型 典型现象 根本原因
握手失败 工具提示“无法连接芯片” BOOT 引脚电平不对、芯片未进入烧录模式、串口 TX/RX 接反
数据校验错误 烧录到 50% 左右报错 波特率偏差过大、电源纹波干扰、串口线过长导致信号衰减
超时错误 工具提示“等待 ACK 超时” 芯片 Flash 写入时间过长、块大小设置不合理、波特率不匹配
地址错误 烧录成功但芯片不运行 烧录地址与芯片 Flash 映射不符、固件起始地址错误
驱动问题 串口无法打开或乱码 USB 转串口驱动不兼容、虚拟串口被占用、波特率设置错误

避坑指南:我曾经遇到一个项目,烧录成功率只有 60%。排查了三天,最后发现是 USB 转串口模块的 TX 引脚上拉电阻虚焊,导致信号幅度不够。换了个模块就好了。所以,硬件连接问题永远是第一排查方向。

具体来说,握手失败是最常见的。你想想看,芯片上电后默认从 Flash 启动,你要让它进入烧录模式,通常需要拉高或拉低某个 BOOT 引脚。很多新手忘了这一步,或者电平没拉到位,芯片根本不响应烧录指令。

数据校验错误,往往和波特率有关。串口通信要求收发双方的波特率误差在 2% 以内。如果晶振精度不够,或者系统时钟配置有误,实际波特率就会偏离设定值。数据传着传着就错位了。

超时错误,我印象最深的是某款国产芯片,它的 Flash 擦除时间特别长,一次擦除要 200ms。而烧录工具默认的 ACK 超时只有 100ms。结果每次擦除都超时。后来我把超时时间改到 500ms,问题就解决了。

我的建议:遇到烧录失败,先别急着怀疑芯片。用逻辑分析仪抓一下串口波形,看看握手指令有没有发出去,芯片有没有回复。很多时候,问题出在工具配置或硬件连接上。

好了,这一章的内容就到这里。串口烧录的基础,说白了就是理解串口怎么传数据、烧录协议怎么走流程、以及常见的坑在哪里。把这些搞清楚了,后面的优化才有根基。