当前位置: 首页 > news >正文

STM32中Usart的使用

目录

一、USART简介

1.电平标准

2.通信接口

   3.硬件电路 

4.串口参数以及时序

5.串口时序

二、USART结构介绍

1.USART功能框图 

​编辑  1.1 功能引脚

1.2 数据寄存器

1.3  控制器

1.4 波特率发生器

1.5简化结构图

 2.数据帧


一、USART简介

        USART(Universal Synchronous/Asynchronous Receiver/Transmitter) 是一种串行通信接口,用于实现设备之间的数据交换。它支持 同步模式异步模式,在 STM32 中最常用的是 异步串行通信(UART)模式

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器 USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
  • 自带波特率发生器,最高达4.5Mbits/s
  • 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
  • 可选校验位(无校验/奇校验/偶校验)
  • 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
  • STM32F103C8T6 USART资源: USART1、 USART2、 USART3(USARRT1是APB2总线上的设备,其他的都是APB1总线)

1.电平标准

        电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:TTL电平、RS232电平、RS485电平。根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,见表 TTL 电平标准与 RS232 电平标准(RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)) 。相同的电平才可以互相通信,不同的电平需要加一个电平转换芯片转接一下。

        我们知道常见的电子电路中常使用TTL 的电平标准,理想状态下,使用 5V 表示二进制逻辑 1
使用 0V 表示逻辑 0 ;而为了增加串口通讯的远距离传输及抗干扰能力,它使用 -15V 表示逻辑 1
+15V 表示逻辑 0 。见图 RS-232 TTL 电平标准下表示同一个信号 。这个-15和+15是相对于GND的,相对于GND是正的还是负的。

2.通信接口

  •         通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。
  •         通信协议:制定通信的规则,通信双方按照协议规则进行数据收发。

双工模式解释
全双工
  • 通信双方能够同时进行双向通信
  • 一般全双工的通信线都有两根,如串口:TX:发送,RX:接收
  • 发送线路和接收线路互相不影响
半双工
  • 也支持双向通信,但是同一时间只能一方发送,一方接收,不能同时发送和接收
  • 类似于对讲机,一个人说话时,另一个人必须等待说完才能回话。
时钟特性解释
异步
  • 异步通信是指通信双方没有共享的时钟信号,而是依靠事先约定好的波特率(Baud Rate) 来协调数据的发送和接收时间。
  • 同步方式:通过起始位、停止位和波特率来实现同步
  • 通信效率:较低,但简单可靠,同时硬件复杂度也低,只需要TX和RX
  • 例子:就像两个人用手机发短信聊天,不需要实时通话,只要知道对方说话的速度(波特率),就能理解对方说了什么 —— 这就是“异步”。
同步
  • 同步通信是指通信双方在统一的时钟信号控制下进行数据传输。发送端和接收端共享一个公共时钟源(Clock),数据的发送和接收严格按照时钟节拍进行。
  • 即需要一条专门的时钟线(如 SCLK)
  • 数据与时钟对齐:数据在每个时钟沿(上升沿或下降沿)被采样
  • 通信效率:高,适合高速传输,但是硬件复杂度也高
  • 例子:就像两个人一起听音乐打拍子跳舞,动作完全跟着节奏来 —— 这就是“同步”。
电平特性解释
单端信号
  • 单端信号是指信号通过一个单独的导线传输,并相对于一个共同的参考点(通常是地线GND)进行测量(即共地)。这意味着信号电压是相对于地来定义的。
  • 信号传输:通过单一导线传输信号,相对于地
  • 抗干扰能力:较弱,容易受到电磁干扰(EMI)影响
差分信号
  • 差分信号是指通过一对导线同时传输两个信号,这两个信号相位相反(即一个为正时另一个为负)。接收端通过比较这两条线上电压差值来识别信号状态,而不是相对于地。
  • 信号传输:使用两条线传输互补信号
  • 抗干扰能力:强,因为共模噪声可以被抵消

   3.硬件电路 

  • 简单双向串口通信有两根通信线(发送端TX和接收端RX)
  • TX与RX要交叉连接 当只需单向的数据传输时,可以只接一根通信线
  • 当电平标准不一致时,需要加电平转换芯片

        当有独立供电的时候,VCC可以不连接。单设备1有供电,设备2没有供电的时候,就需要接VCC,用VCC给设备2供电。

4.串口参数以及时序

        串口通讯的数据包由发送设备通过自身的TXD 接口传输到接收设备的 RXD 接口。在串口通讯
的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方
的数据包格式要约定一致才能正常收发数据
  • 波特率:串口通信的速率,异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,串口数据包的基本组成中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、9600、115200等。
  • 起始位:标志一个数据帧的开始,固定为低电平,串口的空闲状态位高电平。数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。
  • 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行。在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7或8位长。
  • 校验位:用于数据验证,根据数据位计算得来。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity)。
  • 停止位:用于数据帧间隔,固定为高电平,为下一个起始位做准备。
波特率解释:如果波特率为1000bps,那就表示1s要发送1000位,每一位的时间就是1ms,发送方每隔1ms发送一位,接收方每隔1ms接收一位。即决定了每多多长时间发送一位。
奇校验:包括校验位在内的9位数据中会出现奇数个1。
偶校验:包括校验位在内的9位数据中出现偶数个1。
就是发送方会在最后一个校验位补1或者不补。

5.串口时序

0x55,9600,8位数据,1位停止,无校验
数据是0x55,9600,8位数据,1位停止,无校验

数据是 0xAA,9600,8位数据,1位停止,无校验
数据是0xFF,9600,8位数据,1位停止,无校验
数据是0x00,9600,8位数据,1位停止,无校验
数据是0x55,4800,8位数据,1位停止,无校验
数据是0x55,9600,8位数据,1位停止,偶校验
数据是0x55,9600,8位数据,1位停止,无校验
数据是0x55,9600,8位数据,2位停止,无校验

 每一位的时间计算:1/波特率

硬件的话会自动执行

软件模拟:定时调用GPIO_ReadInputDataBit来读取每一位


二、USART结构介绍

1.USART功能框图 

  1.1 功能引脚

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

1.2 数据寄存器

        USART数据寄存器 (USART_DR) 只有低 9 位有效,并且第 9 位数据是否有效要取决于 USART
控制寄存器 1(USART_CR1) M 位设置,当 M 位为 0 时表示 8 位数据字长,当 M 位为 1 表示 9位数据字长,我们一般使用8 位数据字长。

        第二个方框中的发送数据寄存器(TDR Transmit DR)和接收数据寄存器(RDR Receive DR)将发送或者接收的数据存储在这里,这两个寄存器占用同一个地址,在程序上,只表现为一个寄存器,就是数据寄存器DR(Data RRegister),但是实际硬件中,是分成两个寄存器,TDR只写,RDR只读,写操作的时候写到了TDR,读操作的从RDR中读出来。

        下面的发送移位寄存器和接收移位寄存器。 发送移位寄存器的作用:把一个字节的数据一位一位的移出去,正好对应串口协议的波形的数据位。接收也是类似的。

        发送移位寄存器和接收移位寄存器的工作原理:就是当写入0X55的数据时,即写入到TDR中,寄存器中就是二进制存储:01010101,此时硬件监测到我们写入的数据,就会检查当前发送移位寄存器是不是又数据正在移位,如果没有,这个0X55的二进制数据就会立刻全部移动到发送移位寄存器中,准备发送,当数据从TDR移动到移位寄存器时,会置一个标志TXE(TX Empty),发送寄存器空,检查这个标志位,如果置1,就可以在TDR中写如下一个数据。然后发送移位寄存器就会在下面发送控制的驱动下,向右移位(低位先行),然后一位一位的把数据输出到TX引脚。当数据移位完成后,新的数据就会再次自动的从TDR转移到发送移位寄存器里面。接收移位寄存器 同理。

1.3  控制器

         第三个框中的发送控制和接收控制就是用来控制发送/接收移位寄存器的工作。

        USART有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用USART之前需要向USART_CR1寄存器的UE位置1使能USART。发送或者接收数据字长可选8位或9位,由USART_CR1M位控制。

发送器
        当USART_CR1 寄存器的发送使能位 TE 1 时,启动数据发送,发送移位寄存器的数据会在 TX引脚输出,如果是同步模式SCLK 也输出时钟信号。
        一个字符帧发送需要三个部分:起始位+ 数据帧 + 停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的8 位或 9 位数据,数据是从最低位开始传输
的;停止位是一定时间周期的高电平。
        停止位时间长短是可以通过USART 控制寄存器 2(USART_CR2) STOP[1:0] 位控制,可选 0.5
个、 1 个、 1.5 个和 2 个停止位。默认使用 1 个停止位。 2 个停止位适用于正常 USART 模式、单线模式和调制解调器模式。0.5 个和 1.5 个停止位用于智能卡模式。
        当选择8 位字长,使用 1 个停止位时,具体发送字符时序图见图 字符发送时序图
        当发送使能位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_CR2寄存器的 RXNEIE 1 的话可以产生中断。
        在接收数据时,编程的时候有几个比较重要的标志位我们来总结下。

        为得到一个信号真实情况,需要用一个比这个信号频率高的采样信号去检测,称为过采样,这个采样信号的频率大小决定最后得到源信号准确度,一般频率越高得到的准确度越高,但为了得到越高频率采样信号越也困难,运算和功耗等等也会增加,所以一般选择合适就好。

        接收器可配置为不同过采样技术,以实现从噪声中提取有效的数据。USART_CR1寄存器的OVER8位用来选择不同的采样采样方法,如果OVER8位设置为1采用8倍过采样,即用8个采样信号采样一位数据;如果OVER8位设置为0采用16倍过采样,即用16个采样信号采样一位数据。

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

        8倍过采样速度更快,最高速度可达fPCLK/8fPCLKUSART时钟,采样过程见图8倍过采样过程。使用第456次脉冲的值决定该位的电平状态。

        16倍过采样速度虽然没有 8 倍过采样那么快,但得到的数据更加精准,其最大速度为 f PCLK /16 ,采样过程见图 16 倍过采样过程 。使用第 8 9 10 次脉冲的值决定该位的电平状态。
没有噪声的理想条件下,这三次全为1或者0,全为1就认为收到了1,全为0就认为收到了0;如果有噪声导致三次不是全为1或者全为0,就按照2:1的规则来,两次为1就认为收到了1,两次为0就认为收到了0,然后噪声标志位NE就会根据这个来置1或者置0。

        左边的硬件数据流控制:简称流控,就是如果发送设备发的太快,接收设备来不及处理,就会出现丢弃或者覆盖数据的现象,有了流控,就可以避免这个问题。流控有两个引脚,一个时nRTS(请求发送,是输出脚,告诉别人,我当前可不可以接收),另外一个是nCTS(清除胡发送,是出入脚,用于接收别人nRTS的信号),前面的n是低电平有效的意思。

1.4 波特率发生器

        波特率发生器就是分频器,APB时钟进行分频,得到发送和接收移位的时钟fPCLKx(x=1或者x=2),USART挂载APB2,所以就是PCLK2的时钟,一般就是72M,在STM32F103C8T6中,其他的都挂载在APB1,所以是PCLK1的时钟,一般就是36M,然后对时钟进行分频,除以一个USARTDIV的分频系数。

        波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位bit/s(bps) 。对于 USART 波特率与比特率相等。波特率越大,传输速率越快。
        USART的发送器和接收器使用相同的波特率。计算公式如下:

        其中,f PLCK USART 时钟; OVER8 USART_CR1 寄存器的 OVER8 位对应的值, USARTDIV是一个存放在波特率寄存器(USART_BRR) 的一个无符号定点数。其中 DIV_Mantissa[11:0] 位定义USARTDIV 的整数部分, DIV_Fraction[3:0] 位定义 USARTDIV 的小数部分, DIV_Fraction[3] 位只有在OVER8 位为 0 时有效,否则必须清零。

1.5简化结构图

 2.数据帧

相关文章:

  • 一个简单测试Deepseek吞吐量的脚本,国内环境可跑
  • 1.1 基于Icarus Verilog、ModelSim和Vivado对蜂鸟E203处理器进行仿真
  • HarmonyOS File和base64字符串转换
  • Note2.2 机器学习训练技巧:Batch and Momentum(Machine Learning by Hung-yi Lee)
  • C语言二级指针与多级指针
  • cannot import name ‘TextKwargs‘ from ‘transformers.processing_utils‘
  • 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法二)定长滑动窗口+数组
  • LeetCode Hot 100 找到字符串中所有字母异位词
  • 编译流程详解
  • 利用ROS打印novatel_msgs/INSPVAX
  • 滑坡监测接收机市场分析
  • libxlsxwriter: 一个轻量级的跨平台的C++操作Excel的开源库
  • 个人日记本小程序开发方案(使用IntelliJ IDEA)
  • python解释器 与 pip脚本常遇到的问题汇总
  • 【stm32】HAL库开发——CubeMX配置ADC
  • Minio入门+适配器模式(实战教程)
  • ZooKeeper深度面试指南三
  • uni-app subPackages 分包加载:优化应用性能的利器
  • uniapp上拉加载和下拉刷新组件mescroll-uni
  • 如何利用好doctor