USART串口通信

总结stm32USART串口通信

简介

USART:通用同步异步收发器,可以最低使用两个线进行通信。

UART:通用同步收发器,它也是一种USART。其特点是:

通用异步接收器/发送器 (UART) 是通过具有并行和串行接口来实现串行通信的模块。

一侧(并联)由数据线组成,另一侧(串行)由发送 (TX) 和接收 (RX) 线组成。切勿将 TX 连接到 TX,将 RX 连接到 RX!电线应交叉,TX 应连接到 RX,RX 应连接到单独的串行通信设备之间的 TX。UART确实作为独立的IC存在,但它们更常见于微控制器内部。

  1. 串行
  2. 异步
  3. 全双工
  4. 两根线

我们主要将该传输协议分为两层:物理层和协议层

物理层

将USART传输协议分为物理层和协议层,其中物理层使用RS-232标准,这个标准主要规定了,数据传输的接口、信号的通途、电平标准(RS-232使用的是-15 15V的标准)

不同于TTL电平标准使用5V表示1,0V表示0。RS232标准使用-15V表示1,15V表示0。由于控制芯片大部分使用的是TTL电平标准,所以需要使用一个单独的芯片如(MAX3232)来将RS-232电平标准转换为TTL电平标准。

DB9物理接口:

串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。 例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

虽然DB9一共有9根线,但是在目前的其它工业控制使用的串口通讯中,一般只使用RXD、TXD以及GND三条信号线, 直接传输数据信号,而RTS、CTS、DSR、DTR及DCD信号都被裁剪掉了。

协议层

我们主要讲解USART中的异步通信(即USRT),而不是同步通信。

由于是异步通信,所以是没有时钟线的,该方式通过在传输的数据中添加一些数据校验位来保证数据的传输正确。并且需要约定好两个通信设备之间的波特率,所谓的波特率就相当于人与人说话时的语速,单片机要求通信的设备之间的语速要一致。,常见的波特率为4800、9600、115200等。

起始结束位:数据包的起始信号由一个逻辑0的数据位表示, 而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。

有效数据位:在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7或8位长。

校验位:这个是可选的。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity)。

编程

USART结构体定义

其实就是上面的协议层的第一幅图

1
2
3
4
5
6
7
8
typedef struct {
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; // 字长
uint16_t USART_StopBits; // 停止位
uint16_t USART_Parity; // 校验位
uint16_t USART_Mode; // USART模式
uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
  1. USART_BaudRate: 波特率设置。一般设置为2400、9600、19200、115200。标准库函数会根据设定值计算得到USARTDIV值,从而设置USART_BRR寄存器值。

  2. USART_WordLength: 数据帧字长,可选8位或9位。它设定USART_CR1寄存器的M位的值。如果没有使能奇偶校验控制,一般使用8数据位;如果使能了奇偶校验则一般设置为9数据位。

  3. USART_StopBits: 停止位设置,可选0.5个、1个、1.5个和2个停止位,它设定USART_CR2寄存器的STOP[1:0]位的值,一般我们选择1个停止位。

  4. USART_Parity: 奇偶校验控制选择,可选USART_Parity_No(无校验)、USART_Parity_Even(偶校验)以及USART_Parity_Odd(奇校验),它设定USART_CR1寄存器的PCE位和PS位的值。

  5. USART_Mode: USART模式选择,有USART_Mode_Rx和USART_Mode_Tx,允许使用逻辑或运算选择两个,它设定USART_CR1寄存器的RE位和TE位。

  6. USART_HardwareFlowControl: 硬件流控制选择,只有在硬件流控制模式才有效,可选有使能RTS、使能CTS、同时使能RTS和CTS、不使能硬件流。

USART时钟结构体定义

1
2
3
4
5
6
typedef struct {
uint16_t USART_Clock; // 时钟使能控制
uint16_t USART_CPOL; // 时钟极性
uint16_t USART_CPHA; // 时钟相位
uint16_t USART_LastBit; // 最尾位时钟脉冲
} USART_ClockInitTypeDef;
  1. USART_Clock: 同步模式下SCLK引脚上时钟输出使能控制,可选禁止时钟输出(USART_Clock_Disable)或开启时钟输出(USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定USART_CR2寄存器的CLKEN位的值。

  2. USART_CPOL: 同步模式下SCLK引脚上输出时钟极性设置,可设置在空闲时SCLK引脚为低电平(USART_CPOL_Low)或高电平(USART_CPOL_High)。它设定USART_CR2寄存器的CPOL位的值。

  3. USART_CPHA: 同步模式下SCLK引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge)或在时钟第二个变化沿捕获数据。它设定USART_CR2寄存器的CPHA位的值。USART_CPHA与USART_CPOL配合使用可以获得多种模式时钟关系。

  4. USART_LastBit: 选择在发送最后一个数据位的时候时钟脉冲是否在SCLK引脚输出,可以是不输出脉冲(USART_LastBit_Disable)、输出脉冲(USART_LastBit_Enable)。它设定USART_CR2寄存器的LBCL位的值。

  5. USART_Clock: 同步模式下SCLK引脚上时钟输出使能控制,可选禁止时钟输出(USART_Clock_Disable)或开启时钟输出(USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定USART_CR2寄存器的CLKEN位的值。

  6. USART_CPOL: 同步模式下SCLK引脚上输出时钟极性设置,可设置在空闲时SCLK引脚为低电平(USART_CPOL_Low)或高电平(USART_CPOL_High)。它设定USART_CR2寄存器的CPOL位的值。

  7. USART_CPHA: 同步模式下SCLK引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge)或在时钟第二个变化沿捕获数据。它设定USART_CR2寄存器的CPHA位的值。USART_CPHA与USART_CPOL配合使用可以获得多种模式时钟关系。

  8. USART_LastBit: 选择在发送最后一个数据位的时候时钟脉冲是否在SCLK引脚输出,可以是不输出脉冲(USART_LastBit_Disable)、输出脉冲(USART_LastBit_Enable)。它设定USART_CR2寄存器的LBCL位的值。

总结

USART时钟结构体,大多都是同步模式需要使用的。

OL极性和HA相位之间的关系:

HAL 库的相关使用

在使用 HAL库 的时候的配置步骤:

  1. 初始化 USART 结构体
  2. 完成串口使用的函数的初始化
  3. 开启中断
  4. 设置中断优先级
  5. 编写中断服务函数
  6. 发送数据

总结

  1. 时钟结构体是适用于同步模式的,如果你使用的是异步模式则不需要初始化这个结构体。

这种协议有以下缺点:

  1. 通信速率低
  2. 通信的距离短
  3. 无法进行多个设备通信

由于以上的缺点,所以就出现了各种各样的通信协议。我们必须根据我们的需求选择适合的协议。下面中的出现的协议前面的文字正是该协议的最大优点

参考资料


USART串口通信
https://ysc2.github.io/ysc2.github.io/2023/11/20/Stm32中的USART串口通信/
作者
Ysc
发布于
2023年11月20日
许可协议