STM32 —— STM32 的串口通信

STM32 —— STM32 的串口通信

STM32的串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器)。而对于大容量 STM32F10x 系列芯片,分别有 3 个 USART 和 2 个 UART

串口通信过程:

image

目前还处于入门阶段,所以这里只介绍 USART 串口协议和通信方式

USART 和 UART

USART(Universal Synchronous Asynchronous Receiver and Transmitter)即通用同步异步收发器,它是一个串行通信设备,与外部设备可灵活进行全双工数据交换。在这之前我们常用到的是UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。区分同步和异步最简单的方法就是看通信时需不需要对外提供时钟输出,我们平时使用的串口通信基本都是 UART。

USART

详细内容可以看《STM32中文数据手册V10》的第 25 章

介绍

通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准 NRZ 异步串行数据格式的外部设备之间进行全双工数据交换。USART 利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持 LIN(局部互连网),智能卡协议和 IrDA(红外数据组织) SIR ENDEC 规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的 DMA 方式,可以实现高速数据通信

主要特性

  • 全双工异步通信;

  • 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s;

  • 可编程的数据字长度(8位或者9位);

  • 可配置的停止位(支持1或者2位停止位);

  • 可配置的使用DMA多缓冲器通信;

  • 单独的发送器和接收器使能位;

  • 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志;

  • 多个带标志的中断源,触发中断;

  • 其他:校验控制,四个错误检测标志。

USART 参数设置

串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口,通讯双方的数据包格式要规约一致才能正常收发数据

STM32中串口异步通信需要定义的参数:起始位、数据位(8位或者9位)、奇偶校验位(第9位)、停止位(1,15,2位)、波特率设置

UART串口通信的数据包以帧为单位,常用的帧结构为:1 位起始位+ 8 位数据位+ 1 位奇偶校验位(可选)+ 1 位停止位。如下图所示:

USART 功能详解

功能框图详解

image

框图的上部分,数据从 RX 进入到接收移位寄存器,后进入到接收数据寄存器,最终供 CPU 或者 DMA 来进行读取;数据从 CPU 或者 DMA 传递过来,进入发送数据寄存器,后进入发送移位寄存器,最终通过 TX 发送出去

在 USART 的发送过程和接收过程都需要通过波特率进行控制,那么波特率是怎么控制的呢?

在接收移位寄存器、发送移位寄存器都还有一个进入的箭头,分别连接到接收器控制、发送器控制,而这两者连接的又是接收器时钟、发送器时钟。也就是说,异步通信尽管没有时钟同步信号,但是在串口内部,是提供了时钟信号来进行控制的

接收器时钟和发送器时钟又被连接到同一个控制单元,也就是说它们共用一个波特率发生器。同时也可以看到接收器时钟(发生器时钟)的计算方法、USRRTDIV的计算方法

功能引脚

  1. TX:输出引脚,用于发送数据

  2. RX:输入引脚,用于接收数据

  3. SW_RX:输入引脚,用于单线和智能卡模式,属于内部引脚,没有具体外部引脚引出

  4. RDA_OUT:输出引脚,用于发送红外数据

  5. RDA_IN:输入引脚,用于接收红外数据

  6. nRTS:请求发送(Request To Send),n 表低电平有效。若使能 RTS 硬件流控制,当 USART 接收器准备好接收数据时,nRTS 有效,即它为低电平;当接受寄存器以满时,nRTS 被设置为高电平

  7. nCTS:请求以发送(Clean To Send),n 表低电平有效,若使能 CTS 硬件流控制,发送器在发送下一帧数据前会检测 nCTS 引脚状态,若为低电平表可以发送数据,若为高电平,则在发送完当前数据帧之后停止发送

  8. SCLK:发送器时钟输出引脚,仅适用于同步模式

数据寄存器

USART 数据寄存器(USART_DR)只有低 9 位有效

image

第 9 位是否有效,要取决于控制寄存器1(USART_CR1)中的第 12 位 M ,当 M 为 0 时,数据长为 8 位,当 M = 1 时,数据长为 9 位,我们一般使用的时 8 位数据字长

image

实际上 USART_DR 包含了两个寄存器,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能

TDR 寄存器提供了内部总线和输出移位寄存器之间的并行接口。RDR 寄存器提供了输入移位寄存器和内部总线之间的并行接口

进行发送数据操作时,往 USART_DR 写入数据会自动存储在 TDR 内,当进行读取数据操作时,向 USART_DR 读取数据会自动提取 RDR 数据。串行通信时一位一位传输的,所以 TDR 和 RDR 寄存器都是介于系统总线和移位寄存器间的:发送数据时把 TDR 内容转移到发送移位寄存器上,接收数据时则是把接收到的每一位顺序保存在接收移位寄存器内进而转移到 RDR

控制器

STM32 的 USART 由专门用于控制发送、接收、唤醒单元和中断等的寄存器,如:

  1. USART_CR1 寄存器的 UE 位用于开启/关闭给串口的时钟源的,使用 USART 之前向该位写 1 用于使能 USART

  2. USART_CR1 寄存器的 M 位用于控制发送/接收数据字长可选 8 位/ 9 位

  3. USART_CR1 寄存器的 TE 位用于启停数据发送,向该位写 1 时发送移位寄存器上的数据会从 TX 引脚输出,低位在前,高位在后。如果设置 USART 为同步模式,SCLK 引脚将会输出时钟信号。

  4. USART_CR1 寄存器的 RE 位用于开启/关闭 USART 的接收,若为 1 ,接收器在 RX 线开始接收数据帧的起始位,确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内,接收完成后就要接收移位寄存器移到 RDR 内,并将 USART_SR 寄存器的 RXNE 位置 1 (若 USART_CR2 寄存器的 RXNEIE 置 1 的话此时可以产生中断)

一般我们比较常用的、且比较重要的寄存器有:

发送数据时:

TE:发送使能
TXE:发送寄存器为空
TC: 发送完成
TXIE:发送完成中断使能

接收数据时:

RE:接收使能
RXNE:读数据寄存器非空
RXNEIE:发送完成中断使能

波特率设置

USART 的发送器和接收器使用相同的波特率,计算公式为:Tx/Rx 波特率 = USART 的时钟频率 / (16 * USARTDIV)

USARTDIV 是一个存放波特率寄存器(USART_BRR)的无符号浮点数

image

以 USART1 为例,它是挂接在 APB2 总线上的:

image

即 USART1 的时钟源频率为 72MHz,那么如果要得到 115200 的波特率,即:
115200 = 72000000 / (16 * USARTDIV),USARTDIV = 39.0625,
同理计算可得,DIV_Fraction = 0.0625 * 16 = 1,DIV_Mantissa = 39,USART_BRR 的值设置为 0x271

校验控制

STM32F103 系列单片机的 USART 支持奇偶校验,USART_CR1 寄存器的 PCE 位置 1 就可以启动奇偶校验,奇偶检验由硬件自动完成。使能奇偶校验控制后,每个字符帧的格式变为:

起始位 + 数据帧 + 校验位 + 停止位

注意,当使用校验位时,USART_CR1 寄存器的M位需要设置为 1 ,即 9 位模式,因为串口传输的长度为 8 位数据帧加上 1 位校验位共 9 位。启动奇偶校验控制后,在发送数据帧时会自动添加校验位,接收数据帧时自动验证校验位。接收数据时若出现奇偶校验位验证失败,USART_SR 寄存器的 PE 位会被置 1 并可以产生奇偶校验中断

中断控制

USART有多个中断请求事件,常用中断请求有:

中断事件 事件标志 使能位
发送数据寄存器为空 TXE TXEIE
CTS标志 CTS CTSIE
发送完成 TC TCIE
准备好读取接收到的数据 RXNE RXNEIE
奇偶校验错误 PE PEIE

参考资料

  1. STM32串口USART通讯

  2. 【STM32】串口通信基本原理(超基础、详细版)

  3. 【STM32】串口相关配置寄存器、库函数(UART一般步骤)

posted @ 2022-10-18 13:16  ppqppl  阅读(424)  评论(0编辑  收藏  举报