2、硬件接口基础:UART串口通信原理、TTL电平与RS232电平转换、常见的硬件连接方式
好,咱们正式开始聊U-Boot烧录的硬件基础。说实话,很多做嵌入式软件的朋友,一提到硬件接口就头大。但我要告诉你,串口烧录这事儿,硬件搞不定,后面全是白搭。我见过太多人拿着U-Boot源码调了三天,最后发现是杜邦线松了——这种坑,咱们今天一次性填平。
2.1 UART串口通信原理
UART,全称是Universal Asynchronous Receiver/Transmitter,通用异步收发器。说白了,就是一种串行通信协议。什么叫串行?就是数据一位一位地传,不像并口那样一次传8位。你想想看,串口只需要两根线(TX和RX),就能完成双向通信,这在嵌入式领域简直是黄金标准。
UART通信的核心,我总结为三个要素:波特率、数据格式、流控。
- 波特率(Baud Rate):每秒传输的符号数。常见的有9600、115200、921600等。U-Boot烧录时,我习惯用115200,这个速率稳定且兼容性好。但要注意,收发双方的波特率必须一致,差一点就会出乱码。
- 数据格式:包括起始位(1位)、数据位(5~8位,常用8位)、校验位(可选,奇/偶/无)、停止位(1或2位)。U-Boot默认是8N1——8位数据、无校验、1位停止位。
- 流控(Flow Control):硬件流控(RTS/CTS)或软件流控(XON/XOFF)。U-Boot烧录一般不用流控,除非你跑的是高速模式。
我在项目中遇到过一个问题:某款开发板的UART波特率标称是115200,但实际测量发现晶振偏差较大,导致波特率误差超过2%。结果就是U-Boot能启动,但烧录到一半就卡死。后来我换了个精度更高的晶振,问题就解决了。所以,波特率精度很重要,误差最好控制在1%以内。
核心要点:UART通信是异步的,没有时钟线。收发双方靠约定的波特率来采样数据。起始位是下降沿,用来同步时钟。数据位从LSB(最低有效位)开始传输。
2.2 TTL电平与RS232电平转换
这里有个常见的误区。很多人以为串口就是RS232,其实不是。UART是协议,电平是物理层。嵌入式系统里,芯片出来的UART信号通常是TTL电平,而PC的串口是RS232电平。两者电压范围完全不同。
| 电平标准 | 逻辑1(高电平) | 逻辑0(低电平) | 典型电压 |
|---|---|---|---|
| TTL(3.3V) | 2.0V ~ 3.3V | 0V ~ 0.8V | 3.3V / 0V |
| TTL(5V) | 2.4V ~ 5.0V | 0V ~ 0.8V | 5V / 0V |
| RS232 | -3V ~ -15V | +3V ~ +15V | -12V / +12V |
看到了吗?TTL的1是正电压,0是0V。而RS232正好相反——1是负电压,0是正电压。而且电压幅度也差很多。所以,绝对不能直接把TTL信号接到RS232接口上,否则会烧芯片。我曾经见过一个实习生,把3.3V的TX直接怼到PC串口的RX上,结果板子上的UART芯片当场冒烟——嗯,那节课他印象应该很深刻。
电平转换的常用方案有两种:
- 专用芯片:比如MAX232、SP3232。这些芯片内部有电荷泵,能把TTL电平转换成RS232电平,同时还能反转逻辑。我推荐SP3232,因为它支持3.3V供电,功耗更低。
- USB转串口模块:比如CH340G、CP2102、FT232。这些模块内部已经集成了电平转换,直接输出TTL电平。U-Boot烧录时,我习惯用CH340G,便宜又好用。但要注意,有些模块默认输出5V,如果你的板子是3.3V的,需要确认模块是否支持跳线切换。
我的经验:调试U-Boot时,我建议用USB转串口模块,而不是直接接PC的RS232口。原因很简单——USB转串口模块自带隔离,不容易烧板子。而且现在笔记本基本没有RS232口了,USB转串口是主流。
2.3 常见的硬件连接方式
好,到了动手环节。U-Boot烧录的硬件连接,说白了就是三根线:TX、RX、GND。但这里有个细节——交叉连接。什么意思?就是板子的TX接模块的RX,板子的RX接模块的TX。千万别接反了,否则数据发出去没人收。
我画了一张连接示意图,帮你理清思路:
连接步骤其实很简单:
- 确认目标板的UART引脚位置。一般开发板上会标注TX、RX、GND。如果不确定,用万用表量一下——GND对地是0V,TX在空闲时是高电平(3.3V或5V)。
- 将目标板的TX接到模块的RX,目标板的RX接到模块的TX,GND接GND。注意,GND必须接,否则电平参考点不一致,数据会乱。
- 将USB转串口模块插入PC,安装驱动(CH340G在Windows下需要手动装驱动,Linux和macOS一般免驱)。
- 打开串口终端工具(如PuTTY、minicom、screen),设置波特率115200、8N1、无流控。然后给目标板上电,应该能看到U-Boot的启动信息。
警告:千万不要在带电的情况下插拔串口线!尤其是RS232接口,带电插拔容易产生浪涌,烧坏接口芯片。我习惯的做法是:先连接好所有线,再给目标板上电。断电时,先关目标板电源,再拔串口线。
2.4 避坑指南
最后,我分享几个实战中遇到的坑,你遇到了可以少走弯路:
- 电平不匹配:我曾经用5V的USB转串口模块去接3.3V的板子,结果板子的UART引脚被烧了。后来我养成了习惯——先看板子的UART电平是多少,再选模块。现在很多模块支持3.3V/5V跳线,用之前一定要确认。
- TX/RX接反:这是最最常见的错误。接反了不会烧东西,但就是没数据。我调试时,如果发现终端没输出,第一件事就是交换TX和RX试试。
- 波特率不对:U-Boot默认波特率是115200,但有些板子可能被改成了9600或其他的。如果你看到乱码,先检查波特率设置。我习惯在U-Boot的配置文件中明确指定波特率,避免混淆。
- GND没接:这个坑我也踩过。有一次我偷懒没接GND,结果数据时有时无,折腾了半天才发现是GND悬空了。记住,GND是信号的参考地,必须接。
嗯,硬件接口基础就聊到这儿。这些内容看似简单,但却是U-Boot烧录的基石。你把这些搞明白了,后面讲协议和实现细节时,就不会觉得抽象了。
一句话总结:UART通信靠三根线(TX、RX、GND),电平转换要匹配,连接要交叉,GND不能少。搞定了这些,硬件层面就稳了。
可可精品资料库