stm32 USART串口协议与外设——江协教程踩坑经验分享

发布于:2025-07-01 ⋅ 阅读:(26) ⋅ 点赞:(0)

江协stm32学习:9-1~9-3 USART串口协议与外设

一、串口通信基础知识

1、通信类型

  • 全双工通信:通信双方能够同时进行双向通信。一般有两根通信线,如USART中的TX(发送)和RX(接收)线,SPI中的MOSI(发送)和MISO(接收)线。发送线路和接收线路互不影响,可实现高效的数据传输。

  • 单工通信:数据只能从一个设备传输到另一个设备,不能反过来传输。这种方式应用较少,通常用于一些特定的单向数据流场景。(I2C,CAN和USB的两根差分线也是组合成为一根数据线的,接收和发送会相互干扰)

2、同步与异步通信

  • 同步通信:通信双方使用同一个时钟信号进行数据传输,发送方和接收方共享一个公共的时钟源,所有的数据传输都严格地按照这个时钟信号的节奏进行。常见的同步通信接口有I2C和SPI,它们都具有专门的时钟线,数据的采样在时钟信号的指引下进行,确保数据传输的同步性和准确性。

  • 异步通信发送方和接收方使用各自的独立时钟进行数据传输,双方的时钟信号并不需要严格地保持同步。数据的发送和接收主要依靠数据帧中的起始位和停止位来标识数据的开始和结束,接收方通过检测这些控制位来对数据进行同步和识别。USART通常工作在异步模式下,适用于对实时性要求不高的场景。

I2C和SPI有自己时钟线所以是同步,可以在时钟信号的指引下进行采样,其余没有所以使用异步,需要双方约定一个采样频率,并且还需要加一些帧头帧尾等来进行采样位置的对齐。

3、电平

单端 & 差分单端电平表示它们的引脚的高低电平都是对GND的电压差,双方都是公地的就是把GND接在一起;差分电平是靠差分引脚的电压差来传输信号的,可以不需要GND(USB协议里面有一部分还是需要用到单端信号的),所以可以极大地提高抗干扰特性,故而差分信号一般传输速度和距离都会非常高

4、点对点与多设备通信

  • 点对点通信:一对一,两个设备之间直接建立通信链路,连接简单,通信效率高,可靠性高。

  • 多设备通信:可以在总线上挂载多个设备,实现多对多的数据传输。

二、硬件电路连接

1、基本连接规则

  • 电源连接:除非两个设备都具有自己的独立供电系统,否则需要将VCC连接在一起,以确保通信双方的电源电压一致,保证信号的正确传输。

  • 地线连接:为了提供稳定的参考电平,减少干扰,必须将两个设备的GND连接在一起,尤其是在使用TTL、RS-232等单端电平时,地线的连接尤为重要。

  • 信号线连接:在全双工通信中,需要两根信号线,发送端TX与接收端RX要交叉连接,即设备1的TX连接到设备2的RX,设备1的RX连接到设备2的TX。如果是单向数据传输,可以只接一根通信线。

2、电平转换

当通信双方的电平标准不一致时,需要增加电平转换芯片来进行转换。

  • TTL电平:+3.3V或+5V表示逻辑1,0V表示逻辑0。TTL电平常见于单片机等数字电路中,具有传输速度快的特点,但抗干扰能力相对较弱,传输距离较短,一般只有几米。(单片机中使用这种)

  • RS-232电平:-3V至-15V表示逻辑1,+3V至+15V表示逻辑0。RS-232电平具有较强的抗干扰能力,适合在较为恶劣的环境中使用,如一些大型机器的通信接口,其传输距离一般可达十几米到几十米。

  • RS-485电平:两线压差+2V至+6V表示逻辑1,-2V至-6V表示逻辑0,属于差分信号。RS-485电平的抗干扰能力非常强,传输距离可达到几千米,适用于长距离、高可靠性要求的通信场景。

三、USART结构与工作原理

1、USART简介

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter),即通用同步/异步收发器,是STM32内部集成的硬件外设。它可以根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。
    USART:同步;UART:异步。同步模式只多出时钟输出功能,输入不支持,主要是为了兼容其他协议或者特殊用途而设置,并不支持两个USART之间进行同步通信,所以一般还是使用异步模式
    USART就是串口通信的硬件支持电路,配置好后,直接读写数据寄存器就能自动发送和接受数据了

  • USART支持多种功能配置,包括可配置的数据位长度(8位或9位)、停止位长度(0.5位、1位、1.5位或2位)、可选的校验位(无校验、奇校验或偶校验),以及支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN等多种通信模式。
    硬件流控制:只有在接受设备准备好时才传输数据;IrDA用于红外通信;LIN:局域网

  • STM32F103C8T6具有USART1、USART2和USART3三个USART资源
    USART1:APB2总线上设备;USART2、USART3:APB1总线上设备

2、串口参数:

串口发送一个字节的格式是串口协议规定的,串口中,每一个字节都装载在一个数据帧里面。每个数据为都由起始位、数据位和停止位组成(一共8个),还可以在后面加一个奇偶校验位(共9个)

空闲状态是高电位,所以需要把起始位置0来打破空闲状态,最后的时候得回复来为下一帧做准备,所以结尾停止位高电平恢复。
数据位的低位先行就是说如果你实际数据是00001111,那么传输的顺序就是11110000。
校验位判断是否数据传输错误,有无校验、奇校验、偶校验三种。奇校验是校验位来保证1的个数为奇数,偶数反之。but这个校验实际上检出率不高,CRC校验更好虽然也更复杂

3、USART寄存器

  • 数据寄存器(DR):TDR和RDR在程序上只表现为一个寄存器:数据寄存器DR(Data Register)

    • USART数据寄存器(USART_DR)只有低9位有效,第9位数据是否有效取决于USART控制寄存器1(USART_CR1)的M位设置。当M位为0时,表示8位数据字长;当M位为1时,表示9位数据字长。

    • USART_DR包含了已发送的数据或者接收到的数据。发送数据时,往USART_DR写入数据会自动存储在发送数据寄存器(TDR)内;接收数据时,向USART_DR读取数据会自动提取接收数据寄存器(RDR)数据。

    • TDR和RDR介于系统总线和移位寄存器之间。发送时,TDR中的数据转移到发送移位寄存器,然后逐位发送;接收时,接收到的位顺序保存在接收移位寄存器内,再转移到RDR。

  • 移位寄存器

    • 发送移位寄存器和接收移位寄存器用于数据的逐位发送和接收。发送时,TDR中的数据转移到发送移位寄存器,然后逐位发送出去;接收时,接收到的每一位顺序保存在接收移位寄存器内,接收完成后转移到RDR。

    • 通过TDR和移位寄存器的两重缓存机制,可以在保证数据传输正确率的情况下,使数据帧之间没有空闲时间,提高通信效率。

4、USART控制

  • 发送器控制和接收器控制

    • 发送器控制和接收器控制用于管理移位寄存器的工作。发送使能位(TE)和接收使能位(RE)分别控制发送和接收功能的启用和禁用。TE为1时,发送器使能;RE为1时,接收器使能。

  • 硬件流控制

    • 硬件流控制用于控制数据传输速度,防止数据溢出和丢失。主要包括nRTS(请求发送)和nCTS(清除发送)两个引脚。

    • nRTS是输出引脚,低电平有效。当USART接收器准备好接收新数据时,nRTS引脚变为低电平;当接收寄存器已满时,nRTS引脚变为高电平。

    • nCTS用于接收别人的nRTS信号。发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据;如果为高电平,则在发送完当前数据帧之后停止发送。

5、同步时钟(SCLK)& 唤醒单元

  • 同步时钟:SCLK引脚用于同步模式下的时钟输出。在同步模式下,发送器每移位一次,SCLK引脚的电平就跳变一个周期,用于同步数据传输。SCLK引脚的时钟属性可以通过USART时钟初始化结构体进行配置,包括时钟极性、时钟相位和最尾位时钟脉冲等。

  • 唤醒单元:唤醒单元允许USART在低功耗模式下通过接收数据唤醒MCU,适用于需要长时间待机或低功耗运行的设备。

6、标志位

  • 发送寄存器空标志位(TXE):表示发送数据寄存器(TDR)是否为空。当TDR为空时,TXE位为1,表示可以继续写入新的发送数据。通过检测TXE标志位,可以实现高效的数据发送流程,避免数据溢出和等待时间。
  • 接收数据非空标志位(RXNE):表示接收数据寄存器(RDR)是否非空。当接收完成并将数据转移到RDR后,RXNE位为1,表示可以读取接收到的数据。检测RXNE标志位后,可以及时读取数据,避免数据丢失和延迟。
  • 传输完成标志位(TC):TC标志位表示数据传输是否完成。当发送器完成最后一帧数据的发送后,TC位为1,表示数据传输完成。如果USART_CR1寄存器的TCIE位置1,将产生中断,通知CPU进行后续处理。

7、起始位侦测

输入的时候需要保证采样点在每一帧的中间位置,而且最好对于噪声有一定的判断能力

当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率,连续采样一帧数据,同时从起始位开始,采样位置就要对齐到位的正中间,只要第一位对齐了,后面就肯定都是对齐的。

输入电路采用16倍波特率对时钟进行细分,即每位数据可进行16次采样。初始空闲状态为高电平时,采样值始终为1。当出现下降沿时,采样值会由1变为0,此时若无噪声干扰,即表示检测到起始位。在起始位期间,理论上16次采样结果都应保持0值。

考虑到实际电路可能存在噪声干扰,接收电路会在下降沿后采取额外校验措施:分别在第3、5、7次和第8、9、10次采样点进行两批次验证。每批次需满足"3取2"原则(即3次采样中至少有2次为0)才能确认起始位有效。若完全无噪声,采样结果应全为0;若存在轻微噪声导致某批次出现2个0和1个1,系统仍会判定起始位有效,但会在状态寄存器设置噪声标志位(NE);若仅检测到1个0,则认为下降沿由噪声引起,系统将重新开始检测。

通过起始位检测后,接收状态由空闲转为接收起始位状态。值得注意的是,第8、9、10次采样点正好位于起始位中间位置,后续数据位的采样也将在此位置进行,确保采样点始终位于数据位中心。这一设计既实现了起始位检测,又保证了采样位置的对齐。

USART的起始位检测需要用到特定序列。如果在RX线识别到该特定序列就认为是检测到了起始位。起始位检测对使用16倍或8倍过采样的序列都是一样的。该特定序列为:1110X0X0X0000,其中X表示电平任意,1或0皆可。

8、USART引脚

  • TX引脚:发送数据输出引脚,用于将数据从STM32发送到外部设备。

  • RX引脚:接收数据输入引脚,用于从外部设备接收数据到STM32。

  • nRTS引脚:请求发送引脚,低电平有效,用于硬件流控制。当USART接收器准备好接收新数据时,nRTS引脚变为低电平;当接收寄存器已满时,nRTS引脚变为高电平。

  • nCTS引脚:清除发送引脚,低电平有效,用于硬件流控制。发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据;如果为高电平,则在发送完当前数据帧之后停止发送。

  • SCLK引脚:同步模式下的时钟输出引脚,用于同步数据传输。

USART框图 这个关于USART框图的分解不错

四、USART工作流程

1、发送流程

  1. 配置USART_CR1寄存器的TE位置1,使能发送器。

  2. 往USART_DR寄存器写入要发送的数据,数据自动存储在TDR内。

  3. TDR中的数据转移到发送移位寄存器,然后逐位发送出去。

  4. 发送完成后,发送移位寄存器将数据发送完成标志位(TC)置1,表示传输完成。如果USART_CR1寄存器的TCIE位置1,将产生中断,通知CPU进行后续处理。

2、接收流程

  1. 配置USART_CR1寄存器的RE位置1,使能接收器。

  2. 接收器检测RX引脚上的起始位,开始接收数据。

  3. 接收到的数据逐位存入接收移位寄存器,接收完成后转移到RDR,并将RXNE标志位置1。

  4. 检测到RXNE标志位后,可以读取USART_DR寄存器中的数据。如果USART_CR2寄存器的RXNEIE置1,则会产生中断,通知CPU读取数据。

3、波特率发生器

波特率发生器相当于一个分频器,用于生成USART的发送和接收时钟。USART1的时钟源为72MHz,USART2和USART3的时钟源为36MHz。波特率计算公式如下:

波特率=USARTDIV×16时钟源频率​

其中,USARTDIV是分频系数,通过配置USART_BRR寄存器来设置。例如,配置9600波特率时,USARTDIV的值可以通过以下公式计算:

USARTDIV=波特率×16时钟源频率​

配置完成后,将计算得到的USARTDIV值写入USART_BRR寄存器。

五、USART的应用场景

  • 与电脑通信:通过USART接口,STM32可以与电脑进行数据交互,方便进行调试、参数设置和数据监控等工作。例如,将采集到的传感器数据发送到电脑进行显示和分析,或者接收电脑发送的控制指令来控制STM32的工作状态。

  • 与传感器或模块通信:许多传感器和模块都支持USART通信接口,如温湿度传感器、蓝牙模块、Wi-Fi模块等。STM32可以通过USART与这些设备相连,实现数据的采集和传输,从而构建各种智能系统和物联网应用。

  • 设备间通信:在一些工业控制系统或机器人系统中,多个STM32或其他微控制器之间可以通过USART进行通信,实现数据共享和协同工作。

六、USART通信的注意事项

  1. 硬件连接正确性:确保通信双方的VCC、GND、TX和RX引脚正确连接,避免接错线导致通信失败或损坏设备。

  2. 通信参数一致性:通信双方的波特率、数据位、校验位和停止位等参数必须配置一致,否则会导致数据传输错误。

  3. 抗干扰措施:在长距离或恶劣环境下通信时,尽量使用差分电平(如RS-485)以提高抗干扰能力,或者采取屏蔽、滤波等措施减少干扰。

  4. 数据完整性校验:除了硬件提供的校验位外,还可以在软件层面添加数据校验机制,如CRC校验等,以进一步提高数据传输的可靠性

代码部分见下一篇文。


网站公告

今日签到

点亮在社区的每一天
去签到