欢迎光临
我们一直在努力

STM32(十六)——USART串口通信

一、简介

USARTUniversal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器

USARTSTM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里

自带波特率发生器,最高达4.5Mbits/s

可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2

可选校验位(无校验/奇校验/偶校验)

支持同步模式、硬件流控制、DMA、智能卡、IrDALIN

STM32F103C8T6 USART资源: USART1 USART2 USART3

硬件电路

简单双向串口通信有两根通信线(发送端TX和接收端RX

TXRX要交叉连接

当只需单向的数据传输时,可以只接一根通信线

当电平标准不一致时,需要加电平转换芯片

电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

  • TTL电平:+3.3V+5V表示10V表示0
  • RS232电平:-3~-15V表示1+3~+15V表示0
  •  RS485电平:两线压差+2~+6V表示1-2~-6V表示0(差分信号

串口参数

  • 波特率:串口通信的速率
  • 起始位:标志一个数据帧的开始,固定为低电平
  • 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
  • 校验位:用于数据验证,根据数据位计算得来
  • 停止位:用于数据帧间隔,固定为高电平

二、USART结构

USART的基本结构

发送控制器

  • 波特率发生器:它是整个模块的 “节拍器”,会根据外设时钟(PCLK2/1)生成精准的波特率时钟,为发送和接收提供同步基准。
  • 发送控制器:在波特率时钟的驱动下,控制整个发送时序。
  • 发送数据寄存器(TDR):CPU 会先把要发送的并行数据写入这里暂存。
  • 发送移位寄存器:它会从 TDR 中取出并行数据,然后在波特率时钟的控制下,从数据最低位开始,逐位移出到 TX 引脚。
  • 接收控制器

  • 波特率发生器:同样为接收过程提供同步时钟。
  • 接收控制器:负责检测 RX 引脚上的起始位,并在波特率时钟的同步下控制接收时序。
  • 接收移位寄存器:它会从 GPIO 的 RX 引脚逐位接收串行数据,先存入移位寄存器的最低位位宽,逐位接收后再拼接成 并行数据,存入 RDR 。
  • 接收数据寄存器(RDR):拼接完成的并行数据会被存入这里,等待 CPU 读取。
  • 映射

    USART框图

    1.数据收发核心
    • 发送通道:CPU/DMA 将并行数据写入发送数据寄存器(TDR),数据随后被送入发送移位寄存器(TSR)。该寄存器会按低位先行的顺序,逐位将数据移位输出到 TX 引脚。

    • 接收通道:RX 引脚的串行信号会被送入接收移位寄存器(RSR),它将串行数据拼接为并行数据,然后存入接收数据寄存器(RDR),等待 CPU/DMA 读取。

    • 关键设计:TDR 和 TSR、RDR 和 RSR 的分离设计,形成了一级缓冲,可减少 CPU 的响应压力,提升通信效率。

    2. 波特率生成单元

    USART 的波特率由USART_BRR寄存器配置,计算公式为:

    USARTDIV =(PCLK1/2)/ (16 *波特率)

    USARTDIV = DIV_Mantissa + (DIV_Fraction / 16)

    其中:

    • DIV_Mantissa是直接取USARTDIV的整数部分(不管小数是多少,直接舍掉,比如 39.0625 取 39,19.53125 取 19);DIV_Fraction是把USARTDIV的纯小数部分 ×16,取整数结果(这是寄存器能识别的,范围 0~15,因为 16 是 2^4,对应寄存器 4 个位)

    • 波特率发生器会根据外设时钟(PCLK1/2)和USARTDIV值,生成收发器所需的同步时钟

    • 发送器和接收器可独立使能,通过TE(发送使能)和RE(接收使能)位控制

    3. 控制与状态系统
    • 控制寄存器(CR1/CR2/CR3):负责配置帧格式(数据位长度、停止位数量)、校验模式、中断使能、DMA 请求等。

    • 状态寄存器(SR):实时反映通信状态,例如TXE(发送寄存器空)、TC(发送完成)、RXNE(接收寄存器非空)、ORE(溢出错误)等标志位。

    • 中断控制:可根据状态标志触发中断,例如发送完成中断、接收数据可用中断,让 CPU 无需轮询即可响应通信事件。

    4. 增强功能模块
    • 硬件流控(nRTS/nCTS):通过 RTS(请求发送)和 CTS(清除发送)引脚实现硬件握手,避免高速传输时的数据丢失。

    • IrDA 红外通信:通过 IrDA 编解码模块,可将 UART 信号转换为红外信号,实现短距离无线通信。

    • 同步通信模式:通过 SCLK 引脚提供同步时钟,支持 SPI-like 的同步通信,提升传输可靠性。

    • DMA 接口:支持 DMA 直接读写 TDR/RDR,减少 CPU 介入,适合大数据量、低延迟的通信场景。

    三、数据格式

    数据帧

    无论是 8 位还是 9 位字长,一个完整的 USART 数据帧都包含以下几个部分:

    • 起始位:固定为 1 位低电平,用于同步接收端的时序。
    • 数据位:可以是 8 位或 9 位,数据传输遵循低位先行(bit0 最先发送)。
    • 奇偶校验位(可选):1 位,用于简单的错误检测,可配置为奇校验或偶校验。
    • 停止位:1 位、1.5 位或 2 位高电平,标志着一帧数据的结束。

    起始位侦测

    STM32 的 USART 会在1 位时间内采样 16 次,用前 8 次采样来验证是否为有效起始位,而非噪声干扰:

    • 第一阶段(第 1~3 次采样):要求 3 次采样中至少 2 次为低电平,初步确认低电平不是瞬间干扰。
    • 第二阶段(第 4~6 次采样):再次验证,同样要求 3 次采样中至少 2 次为低电平,进一步排除干扰。
    • 第三阶段(第 7~8 次采样):最终验证,确保低电平持续稳定。

    只有连续通过这三轮验证,硬件才会确认这是一个有效起始位,并开始后续的数据位采样。

    采样时钟:每 1 位时间内产生 16 个采样脉冲,是硬件的 “眼睛”。

    数据采样点:在确认起始位后,硬件会将采样时钟的第 7 个脉冲作为数据位的同步基准,后续每个数据位都在第 7、8、9 次采样中取多数值,进一步保证数据准确性。

    时间偏移:图中标注的7/16和6/16,是硬件为了避开信号跳变的不稳定区域,特意选择在位中间位置进行采样的设计,这也是抗干扰的关键。

    检测噪声

    多数判决原则:硬件会对第 8、9、10 次的采样结果进行 “少数服从多数” 的判决。比如 3 次采样结果为0、0、1,则判定该数据位为0,这样可以有效过滤单次噪声脉冲的干扰。

    数据模式

    HEX模式/十六进制模式/二进制模式:以原始数据的形式显示

    文本模式/字符模式:以原始数据编码后的形式显示

    HEX数据包

    选用在正常数据中极少出现的字节(如0xFF、0xFE)位包头包尾,将数据放在包头包尾的中间,通过辨别包头包尾来识别数据的开始与结束。

    固定包长:数据包总长度不变。

    可变包长:数据包总长度可变。

    HEX数据包接收

    • 收到 0xFF → 从 S=0 进入 S=1。
    • 依次收到 0x01、0x02、0x03、0x04 → 缓存满 4 字节,从 S=1 进入 S=2。
    • 收到 0xFE → 验证通过,触发数据就绪事件,缓存数据 0x01~0x04 被取出处理,然后回到 S=0,等待下一帧。
    文本数据包

    包头(@) + 固定/不固定长度的字符数据段 + 包尾(\\r\\n)

    文本数据包接收

    • 收到 @ → 从 S=0 进入 S=1,清空缓存。
    • 依次收到 A、B、C → 字符被加入缓存。
    • 收到 \\r → 从 S=1 进入 S=2。
    • 收到 \\n → 验证通过,触发数据就绪事件,缓存内容 A B C 被取出处理,回到 S=0。
    • 收到下一个 @ → 重复上述流程,处理数据包 @D E\\r\\n。
    赞(0)
    未经允许不得转载:171主机测评 » STM32(十六)——USART串口通信
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址