【STM32】USART UART 串口通信详解【原理】-Jojo

前注:本文章主要讲解【原理】【固件库(标准库)】【HAL库】

内容为 'Jojo'编写,日常学习总结,内容如有不足、不妥之处请私信告知,谢谢!

A.硬件原理

一、通信理论知识

串行/并行通信

按数据传送的方式,通讯可分为串行通讯并行通讯 

串行通讯就像单个车道的公路,同一时刻只能传输 一个数据位的数据。
并行通讯就像多个车道的公路,可以同时传输多个数据位的数据。

特性对比

传输方向

根据串行通信数据传输的方向,可将串行通信方式分为:单 工方式、半双工
方式和全双工方式
单工 方式指数据传输仅能沿着一个方向,不能反向传输。
半双工 指的是数据传输可以沿着两个方向, 但是不能同时发送,这就表示 发送/ 接收 是有先后顺序的。
全双工 指的是可以同时进行双向传输。全双工和半双工通信的本质区别是半双工通信双方只共用一条线路实现双向通信,但是全双工却利用两条线路,一条作发送数据用,另一条作接收数据用。

 

 

同步通讯与异步通讯

根据传输方式的不同,可以分为同步通信和异步通信

在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据, 通讯中通常 双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样(时钟线)

在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还 需要双方约定数据的传输速率(波特率) ,以便更好地同步。

串口电平

 串口连接和时序

  • 波特率:一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数 (bit);
  • 起始位:先发出一个逻辑”0”的信号,表示传输数据的开始;
  • 数据位:可以是5~8位逻辑”0””1”,先传输bit 0,在传输bit 1,依次类推;
  • 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位是可选的,可以不传输;
  • 停止位:它是一个字符数据的结束标志,数据线变回逻辑”1”

 

 

二、串口

STM32F103 系列最多有 3 个通用同步异步收发器(usart),2个通用异步收发器(uart)。USART和UART的主要区别在于,USART支持同步通信,该模 式有一根时钟线提供时钟。
串口在嵌入式中经常使用,一般使用 UART 就足够了,常见的用途如下:
1. 作为调试口,打印程序运行的状态信息;
2. 连接串口接口的模块(比如 GPS 模块),传输数据;
3. 通过电平转换芯片变为 RS232/RS485 电平,连接工控设备;

STM32功能支持图

框图 

1. ①功能引脚
  • TX:发送数据输出引脚。
  • RX:接收数据输入引脚。
  • SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
  • nRTS:请求以发送(Request To Send)n 表示低电平有效。如果使能 RTS 流控制,当USART接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时, nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
  • nCTS:清除以发送(Clear To Send)n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
  • SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

USART1 最大频率为 72MHz ,其他四个最大频率为 36MHz UART 只是异步传输功能,所以没有 SCLK nCTS nRTS 功能引脚
2. ②数据寄存器
USART 数据寄存器 (USART_DR) 只有低 9 位有效,并且第 9 位数据是否有效要取决于USART 控制寄存器 1(USART_CR1) M 位设置,当 M 位为 0 时表示 8 位数据字长,当 M位为 1 表示 9 位数据字长,我们一般使用 8 位数据字长。
USART_DR 包含了已发送的数据或者接收到的数据。 USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR ,一个专门用于接收的可读 RDR 。当进行发送操作时,往USART_DR 写入数据会自动存储在 TDR 内;当进行读取操作时,向 USART_DR 读取数据会自动提取 RDR 数据。
TDR RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把 TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。
USART_DR 寄存器包含了一个内部总线和发送移位寄存器之间的缓冲器。

3. ③控制器
        USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。
使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能 USART UE 位用来开启
供给给串口的时钟。发送或者接收数据字长可选 8 位或 9 位,由 USART_CR1 M 位控制。

 

发送器(搭配手册发送器篇一起看 效果更佳)
        当 USART_CR1 寄存器的发送使能位 TE 1 时,启动数据发送,发送移位寄存器的
数据会在 TX 引脚输出, 低位在前,高位在后 。如果 是同步模式 SCLK 也输出时钟信号
1 .在数据传输期间不能复位 TE 位,否则将破坏 TX 脚上的数据,因为波特率计数器停止计数。 正在传输的当前数据将丢失。
2 TE 位被激活后将发送一个空闲帧。
        一个字符帧发送需要三个部分:起始位+ 数据帧 + 停止位。起始位是 一个位周期的低电
,位周期就是每一位占用的时间;数据帧就是我们要发送的 8 位或 9 位数据,数据是从
最低位开始传输 的;停止位是一定时间周期的高电平。
        停止位时间长短是可以通过 USART 控制寄存器 2(USART_CR2) STOP[1:0] 位控制, 可选 0.5 个、 1 个、 1.5 个和 2 个停止位。
1 个停止位
停止位位数的默认值
2 个停止位
可用于常规 USART 模式、单线模式以及调制解调器模式。
0.5 个停止位在智能卡模式下接收数据时使用。
1.5 个停止位
在智能卡模式下发送和接收数据时使用。

 

 

当发送使能位 TE 1 之后,发送器开始会先发送 一个空闲帧(一个数据帧长度的高电
平) ,接下来就可以往 USART_DR 寄存器写入要发送的数据。在写入最后一个数据后,需
要等待 USART 状态寄存器 (USART_SR) TC 位为 1 ,表示数据传输完成,如果
USART_CR1 寄存器的 TCIE 位置 1 ,将产生中断。

 

接收器
如果将 USART_CR1 寄存器的 RE 位置 1 使能 USART 接收 ,使得接收器在 RX 线开
始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。

接收完成后就把接收移位寄存器数据移到 RDR 内,并把 USART_SR 寄存器的 RXNE 位置 1,同时如果 USART_CR1 寄存器的 RXNEIE 置 1 的话可以产生中断

 

 4. ④小数波特率生成

接收器和发送器的波特率在 USARTDIV 的整数和小数寄存器中的值应设置成相同。

其中, f PLCK USART 时钟, USARTDIV 是一个存放在波特率寄存器 (USART_BRR)
的 一个 无符号定点数。 其中 DIV_Mantissa[11:0] 位 定义 USARTDIV 的 整数 部分 ,
DIV_Fraction[3:0]位定义 USARTDIV 的小数部分。

假设所需波特率为 115200 ,当前 USART 时钟为 72MHz ,则 USARTDIV=72000000/(115200*16)=39.0625
USART_BRR 寄存器使用高 12 [15:4] 存放整数部分,低 4 [3:0] 存放小数部分,小数部分每一位对应 1/2的4次方  =0.0625(0.625*2的4次方=1) 。因此,整数 39 对应 16 进制为 0x27 ,左移 4 位为 0x270 ,小数 0.0625 ,对应 0x1 USART_BRR=0x271 即可。
只有USART1的波特率计算中的 能取最大系统时钟72MHz,其它的 USART/UART 只能取 36MHz

波特率的常用值有 2400960019200115200

小数x16就是寄存器的值 

5. 校验控制
        STM32F103 系列控制器 USART 支持奇偶校验。当使用校验位时,串口传输的长度将
8 位的数据帧加上 1 位的校验位总共 9 位,此时 USART_CR1 寄存器的 M 位需要设置为
1 ,即 9 数据位。将 U SART_CR1 寄存器的 PCE 位置 1 就可以启动奇偶校验控制 ,奇偶校
验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收
数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见 USART_SR 寄存
器的 PE 位置 1,并可以产生奇偶校验中断
        使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+ 数据帧 + 校验位 + 停止位。

 

 6. 中断控制

 

B.固件库

结构体

涉及文件stm32f10x_usart.h,stm32f10x_usart.c,stm32f10x.h

USART 寄存器结构体

typedef struct
{
  __IO uint16_t SR;       //状态寄存器
  uint16_t  RESERVED0;    //保留0
  __IO uint16_t DR;       //数据寄存器
  uint16_t  RESERVED1;    //保留1
  __IO uint16_t BRR;      //波特比率寄存器
  uint16_t  RESERVED2;    //保留2
  __IO uint16_t CR1;      //控制寄存器1
  uint16_t  RESERVED3;    //保留3
  __IO uint16_t CR2;      //控制寄存器2
  uint16_t  RESERVED4;    //保留4
  __IO uint16_t CR3;      //控制寄存器3
  uint16_t  RESERVED5;    //保留5
  __IO uint16_t GTPR;     //保护时间和预分频寄存器
  uint16_t  RESERVED6;    //保留6
} USART_TypeDef;

 

USART 初始化结构体

1 typedef struct {
2 uint32_t USART_BaudRate;            // 波特率
3 uint16_t USART_WordLength;          // 字长
4 uint16_t USART_StopBits;            // 停止位
5 uint16_t USART_Parity;              // 校验位
6 uint16_t USART_Mode;                // USART 模式
7 uint16_t USART_HardwareFlowControl; // 硬件流控制
8 } 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 时钟初始化结构体

 typedef struct {
2 uint16_t USART_Clock;     // 时钟使能控制
3 uint16_t USART_CPOL;      // 时钟极性
4 uint16_t USART_CPHA;      // 时钟相位
5 uint16_t USART_LastBit;   // 最尾位时钟脉冲
6 } 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 位的值。

函数

引用中的代码展示了一个基于STM32UART串口通信的示例程序。在这个示例中,首先通过引入相关头文件,包括"stm32f10x.h"和"bsp_usart.h"来实现对USART的初始化配置。然后,在主函数main中,通过调用USART_Config函数来进行USART的初始化配置,包括设置波特率、数据位数、停止位数等参数。接着使用Usart_SendString函数向串口发送一串字符串,并通过printf函数向终端输出一段欢迎信息。最后,通过一个无限循环来保持程序的运行。 引用和引用提供了更具体的关于初始化和配置串口的过程和代码说明。在这些引用中,首先要进行相关的时钟使能和GPIO配置,然后设置引脚的复用模式,接着进行串口参数的初始化配置,包括波特率、数据位数、停止位数等。如果需要开启中断,则需要进行中断配置和中断处理函数的编写。最后,使能串口以开始通信。 综上所述,如果您需要实现STM32UART串口通信,可以参考以上提供的代码和过程。请根据自己的具体需求进行相应的配置和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [STM32——USART接发通信实验代码解析(适合野火stm32f103ZE)](https://blog.csdn.net/m0_57396609/article/details/120387284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [(十三)STM32——串口通信UART)](https://blog.csdn.net/weixin_66578482/article/details/126270118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值