一、串口烧录基础:串口通信原理、波特率概念、烧录流程概述
大家好,我是你们的嵌入式讲师。今天咱们聊聊串口烧录这件事。说实话,我入行那会儿,串口烧录可是基本功中的基本功。现在虽然工具越来越智能,但底层原理不懂,出了问题照样抓瞎。
串口烧录,说白了就是通过串口把程序写进芯片里。你想想看,芯片出厂时里面空空如也,总得有个方式把代码灌进去吧?串口就是最经典、最通用的方式之一。
串口通信原理
串口通信,全称叫串行通信接口。它一次只传一个比特,就像单车道公路,车一辆一辆过。与之相对的是并口,一次传多个比特,像八车道。但串口布线少、成本低、抗干扰强,所以嵌入式领域用得特别多。
串口通信有三根线就够了:
- TXD(发送端)—— 数据发出去
- RXD(接收端)—— 数据收进来
- GND(地线)—— 共地,保证电平参考一致
注意啊,两个设备连接时,TXD要接对方的RXD,RXD接对方的TXD。这个叫交叉连接。我见过不少新手把TXD接TXD、RXD接RXD,结果死活通信不上。嗯,这个坑我当年也踩过。
串口通信的格式是这样的:
起始位(1位) + 数据位(5~8位) + 校验位(可选) + 停止位(1~2位)
举个例子,你发一个字符'A'(ASCII码0x41),串口会先拉低电平表示"我要开始发了",然后依次送出8个数据位,最后拉高电平表示"发完了"。接收端就按这个节奏把数据收下来。
核心要点:串口通信是异步的,没有时钟线。收发双方靠约定的波特率来同步节奏。所以波特率必须一致,否则数据就乱了。
波特率概念
波特率,就是每秒传输的比特数。单位是bps(bits per second)。常见的波特率有:
| 波特率(bps) | 每比特时长(us) | 常见应用场景 |
|---|---|---|
| 9600 | 104.2 | 调试信息输出、低速设备 |
| 115200 | 8.68 | 常用烧录速率、传感器通信 |
| 921600 | 1.09 | 高速烧录、大文件传输 |
我个人习惯,调试阶段先用9600,稳定后再切到115200。为什么?因为波特率越高,对时钟精度要求越高。有些便宜的晶振或者内部RC振荡器,跑高速时误差会变大,导致通信失败。
我曾经在一个项目里,用内部RC振荡器跑921600波特率,结果10片里有3片烧录失败。查了半天,发现是晶振频率偏差太大。后来降到115200,问题就解决了。所以啊,别一味追求高速,稳定才是王道。
小技巧:计算波特率误差的公式:误差 = (实际波特率 - 目标波特率) / 目标波特率 × 100%。一般要求误差在±2%以内,超过这个范围就容易丢数据。
烧录流程概述
串口烧录的流程,其实就三步:握手、传输、校验。我画了个流程图,方便大家理解:
具体来说:
- 硬件连接:把烧录器或USB转串口模块接到目标板。注意电平匹配,3.3V的芯片别接5V的串口,会烧的。我建议用带电平转换的模块,省心。
- 握手协议:上位机软件发一个特定命令,比如0x7F,芯片收到后回复一个确认码。这一步是为了确认通信链路正常,同时让芯片进入烧录模式。
- 数据传输:把固件分成一个个数据包,每包通常256字节或512字节。发完一包,芯片回复ACK,再发下一包。如果收到NAK,就重发。这个机制叫"停等协议",简单可靠。
- 校验完成:所有数据发完后,上位机发一个校验命令,芯片计算CRC或累加和,跟上位机比对。一致的话,写入完成标志,然后复位运行新程序。
⚠️ 重要提醒:烧录过程中千万别断电!我见过有人烧到一半拔电源,结果芯片变砖,得用专用工具才能救回来。另外,串口线不要太长,超过2米就容易受干扰。实在要长距离,用RS485转一下。
好了,串口烧录的基础就这些。说白了就是:连好线、对上暗号、传数据、验结果。后面我们会深入讲每个环节的调优技巧,比如怎么提高烧录速度、怎么处理异常情况。这些东西,都是我在项目里一点点踩坑踩出来的经验。
记住一句话:串口烧录看似简单,但细节决定成败。一个波特率误差、一根接触不良的杜邦线,都能让你折腾半天。所以,打好基础,后面才能飞得起来。
个人经验:我习惯在烧录前先发一个"空测试"——就是只握手不烧录,确认通信正常后再开始正式烧录。这个习惯帮我避免了很多次"烧了半天发现线没接好"的尴尬。