
串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。 . c+ W; I F+ B& \& s8 M7 F STM32 芯片具有多个 USART 外设用于串口通讯,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于USART,它还有具有 UART 外设,它是在USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。USART 满足外部设备对工业标准 NRZ 异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。USART 支持同步单向通信和半双工单线通: Y5 z/ z+ }1 F! P2 H+ ~8 ~ 信;还支持局域互连网络 LIN、智能卡 (SmartCard) 协议与 lrDA(红外线数据协会) SIR ENDEC 规范。 USART 支持使用 DMA,可实现高速数据通信,有关 DMA 具体应用将在 DMA 章节作具体讲解。. |5 u: `( i j " j' z; d0 c: c6 p3 n3 | USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 USART通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。. f4 G3 `2 x/ I; W1 [ STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进行转换。 + j# Z; d- b* y# D 物理层:5 l' m& n! l% G# M/ R4 A& r' m RS-232 标准主要规定了信号的用途、通讯接口以及信号的电平标准。# U, Y7 z8 F" m) Z" a2 ~) @ ![]() 两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232 标准”传输数据信号。由于 RS-232 电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL 校准”的电平信号,才能实现通讯。 % j, D+ b" F0 C+ C! h9 m9 t5 [ 根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,见表 TTL 电平标准与RS232 电平标准 。 ![]() 理想状态下,使用 5V 表示二进制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V 表示逻辑 1,+15V 表示逻辑 0。9 s/ X7 y/ S6 U2 z: z 0 \: j/ s1 m1 n- r; G& P O ![]() : U# ^! C; j' k. L' r0 G DB9 信号线说明: ![]() - A# C. _* Z8 C$ h2 Q ![]() 协议层3 Q. `8 D n" x& A' e" U 9 M: M5 `) D6 p/ G7 L7 y& s# T; W 串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。 * x( O6 N: s- @3 `" a" [5 ~ ![]() 波特率 异步通讯中由于没有时钟信号 (如前面讲解的 DB9 接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,图串口数据包的基本组成 中用虚线分开的每一格就是代表一个码元。常见的波特率为 4800、9600、115200 等。" o+ E5 I6 \( U+ L5 }8 I* ?( O 通讯的起始和停止信号 串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。 / [5 L1 E, a0 o1 A9 Q/ q$ c 有效数据 7 ]9 k1 }( O- J* a 在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为 5、6、7 或 8 位长。 数据校验 ! y( r# i) G6 w- l2 J) |$ B 在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验 (space)、1 校验 (mark) 以及无校验 (noparity)。/ J/ e8 ?5 l# T( R 8 i( Y% p" w+ j5 r 1• 奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个 8 位长的有效数据为:01101001,此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位。* v {: A4 U$ S+ p" E: {2 K7 R; U 2• 偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧:11001010,此时数据帧“1”的个数为 4 个,所以偶校验位为“0”。' u5 c: z0 A$ W3 e% n; j 3• 0 校验是不管有效数据中的内容是什么,校验位总为“0”,1 校验是校验位总为“1”。/ k4 e) S$ @2 d7 b 4 m) \# w4 C) r4 U 4• 在无校验的情况下,数据包中不包含校验位。" f3 W4 W, y* k- @ ! G5 D/ B- S" _; j) L1 B# E8 F. ? USART功能框图: * q! _4 |8 \( @6 `4 Z ![]() 1 `! R! @* t. ~5 p- t 功能引脚: TX:发送数据输出引脚。 RX:接收数据输入引脚。/ e0 `2 W$ W) a7 K9 [, A SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。 nRTS:请求以发送 ,n 表示低电平有效。如果使能 RTS 流控制,当 USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高 电平。该引脚只适用于硬件流控制。 nCTS:清除以发送 (Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下 一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完 当前数据帧之后停止发送。该引脚只适用于硬件流控制。 SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。 USART 引脚在 STM32F429IGT6 芯片具体发布见表 STM32F429IGT6 芯片的 USART 引脚 。; ~, v i& m( X& J- ?: v , w' w+ F' I7 L& \) @ ![]() . P. @7 j7 ]9 g5 I2 j$ l! B2 v" ` + A: H9 ^; A( G) }& O# Z. h |