STM32 USART

[STM32] USART

USART简介

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器,一般我们串口很少使用这个同步功能,所以USART和UART使用起来,区别不大。同步模式,只是多了个时钟输出,并且只支持时钟输出,不支持时钟输入,是为兼容别的协议所设计的

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

  • 自带波特率发生器,最高达4.5Mbits/s,用于配置波特率,起始就是一个分频器,比如我们APB2总线给个72MHZ的频率,然后波特率发生器进行一个分频,得到我们想要的波特率时钟。最后在这个时钟下,进行收发,就是我们指定的通信波特率。

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

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

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

  • STM32F103C8T6 USART资源: USART1、 USART2、 USART3。其中,USART1是APB2总线上的设备,USART2、USART3是APB1总线上的设备。

串口参数,我们最常用的是:

  • 波特率 9600或者115200
  • 数据位8位
  • 停止位1位
  • 无校验

硬件流控制:比如A设备有个TX向B设备的RX发送数据,A设备一直在发,发的太快了,B处理不过来,如果没有硬件流控制,那B就只能抛弃新数据或者覆盖原数据了,如果有硬件流控制,在硬件电路上,会多出一根线, 如果B没准备好接收,就置高电平,如果准备好了,就置低电平,A接收到了B反馈的信号,就只会在B准备好的时候,才发数据,如果B没准备好,那数据就不会发送出去。这就是硬件流控制,可以防止因为B处理慢而导致数据丢失的问题。

USART框图

在这里插入图片描述

发送数据寄存器(TDR)和接收数据寄存器(RDR)这两个寄存器共用同一个地址,在程序上,只表现为一个寄存器,就是数据寄存器DR(Data Register),但实际硬件中,是分成了两个寄存器

  • 一个用于发送(TDR),TDR是只写的,当进行写操作时,数据就写入到TDR。
    • 发送移位寄存器 把一个字节的数据一位一位地移出去,正好对应串口协议的波形的数据位。比如在某时刻给TDR写入了0x55这个数据,在寄存器里就是二进制存储,0101 0101,那么此时,硬件检测到你写入数据了,它就会检查,当前移位寄存器是不是有数据正在移位,如果没有这个0101 0101就会立刻全部移动到移位寄存器,准备发送,当数据从TDR移动到移位寄存器时,会置一个标志位TXE(TX Empty)发送寄存器空,我们检查这个标志位,如果置1了,我们就可以在TDR写入下一个数据了。注意一下,当TXE标志位置1时,数据其实还没有发送出去,只要数据从TDR转移到发送移位寄存器了,TXE就会置1,我们就可以写入新的数据了。然后发送移位寄存器就会在发生控制器的驱动下,向右移位,然后一位一位地,把数据输出到TX引脚。向右移位正好和串口协议规定的低位先行,是一致的,当数据移位完成后,新的数据就会再次自动地从TDR转移到发送移位寄存器里来,如果当前移位寄存器移位还没有完成,TDR地数据就会进行等待,一旦移位完成,就会立刻转移过来。有了TDR和移位寄存器的双重缓存,可以保证连续发送数据的时候,数据帧之间不会有空闲,提高了工作效率。
  • 一个用于接收(RDR),RDR是只读的,当你进行读操作时,数据就是从RDR读出来的。
    • 原理类似

硬件数据流控、SCLK、唤醒单元仅作了解即可

中断输出控制(配置中断是否能通过NVIC)

中断申请位,就是状态寄存器里的各种标志位,有两个标志位比较重要

  • TXE发送寄存器空
  • RXNE接收寄存器非空

这两个是判断发送状态和接收状态的必要标志位。

波特率发生器

  • 波特率发生器起始就是分频器,APB时钟进行分频,得到发送和接收移位的时钟。图上时钟输入是fPCLKx(x=1或2),USART1挂载在APB2,所以就是PCLK2的时钟,一般是72MHZ,其他的USART都挂载在APB1,所以是PCLK1的市长,一般是36MHZ。
  • 之后这个时钟进行一个分频,除一个USARTDIV的分频系数,USARTDIV分为了整数部分和小数部分,防止有些波特率无法用72MHZ除以一个整数得到,产生误差,所以这里的分频系数支持小数点后4位,分频更加精准,分频完之后,还要再除16,得到发送器时钟和接收器时钟,通向控制部分。
  • TE(TX Enable)发送器使能,发送部分的波特率有效。RE(RX Enable)接收器使能,接收部分的波特率有效。
  • USART1_TX复用在PA9 USART1_RX复用在PA10

USART基本结构图

在这里插入图片描述

  • 波特率发生器,用于产生约定的通信速率,时钟来源是PCLK2或1,经过波特率发生器分频后,产生的时钟通向发送控制器和接收控制器,发送控制器和接收控制器,用来控制发送移位和接收移位,之后由发送数据寄存器和发送移位寄存器这两个寄存器配合,将数据一位一位地移出去,通过GPIO的复用输出,输出到TX引脚,产生串口协议规定的波形。
  • 当数据由数据寄存器转到移位寄存器时,会置一个TXE标志位,我们判断这个标志位,就可以知道是不是可以写下一个数据了。接收部分类似,RX引脚的波形,通过GPIO输入,在接收控制器的控制下,一位一位地移入接收移位寄存器,移完一帧数据后,数据就会统一转运到接收数据寄存器,在转移的同时,置一个RXNE标志位,我们检查这个标志位就可以知道是不是收到数据了,同时这个标志位也可以去申请中断,这样就可以在收到数据时,直接进入中断函数,快速地读取和保存数据。实际上有四个寄存器,但是在软件层面,只有一个DR寄存器可以供我们读写,写入DR时,数据走上面这条路,进行发送,读取DR时,数据走下面这条路进行接收。最后用Cmd开启一下外设。

数据帧

在这里插入图片描述

在这里插入图片描述

输入电路

起始位侦测

在这里插入图片描述

当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率,连续采样一帧数据,同时从起始位开始,采样位置就要对齐到位的正中间,只要第一位对齐了,后面肯定都是对齐的。

为了实现这个功能

  • 首先,输入的这部分电路对采样时钟进行了细分,它会以波特率的16倍频率进行采样,也就是在一位的时间里,可以进行16次采样。
  • 最开始,空闲状态高电平,采样就一直是1,在某个位置,突然采到一个0,那么就说明,在这两次采样之间,出现了下降沿,如果没有任何噪声,那之后就应该是起始位了,在起始位,会连续进行16次采样,没有噪声的话,这16次采样,肯定都是0,就没有问题,但是实际电路还是会存在一些噪声,所以即使出现下降沿,后续也要再采样几次,以防万一。根据手册描述,这个接收电路,还会再下降沿之后的第3次、5次、7次,进行一批采样,在第8次、9次、10次,再进行一批采样,且这两批采样,都要要求每3位里面至少应有2个0,如果没有噪声,那肯定全是0,满足情况,如果有一些轻微的噪声,导致这里3位里面,只有2个0,另一个是1,那也算是检测到了起始位,但是在状态寄存器里会置一个NE(Noise Error),噪声标志位,就是提醒一下,数据收到了,但是有噪声。如果3位里面,只有1个0,就不算检测到了起始位,可能前面那个下降沿是噪声导致的,这时电路就忽略前面的数据重新开始捕捉下降沿,这就是STM32的串口,在接收过程中,对噪声的处理。
  • 如果通过了起始位侦测,那接收状态就由空闲,变为接收起始位,同时,第8、9、10次采样的位置,就正好是起始位的正中间,之后,就收数据位时,就都在第8、9、10次进行采样,这样就能保证采样位置在位的正中间了,这就是起始位侦测和采样位置对齐的策略。

数据采样

在这里插入图片描述

  • 从1到16,是一个数据位的时间长度,在一个数据位,有16个采样时钟,由于起始位侦测已经对齐了采样时钟,所以这里直接在第8、9、10次采样数据位,为了保证数据的可靠性,这里是连续采样3次,没有噪声的理想情况下,这3次肯定全为1或者全为0,全为1,就认为收到了1,全为0,就认为收到了0。如果有噪声,导致3次采样不全为1或者全为0,那它就按照2:1的规则来,2次为1就认为收到了1,2次为0,就认为收到了0,在这种情况下,噪声标志位NE也会置1,这就是检测噪声的数据采样。

波特率发生器

在这里插入图片描述

  • 发送器和接收器的波特率由波特率寄存器BRR里的DIV确定

  • 计算公式:波特率 = fPCLK2/1 / (16 * DIV)

因为内部还有一个16倍波特率的采样时钟,所以输入时钟/DIV要等于16倍的波特率

比如配置9600的波特率

根据计算可知 DIV=468.75 换算成二进制 11101 0100.11

配置步骤

  • 开启时钟,把需要用到的USART和GPIO的时钟打开
  • GPIO初始化,把TX配置成复用输出,RX配置成输入
  • 配置USART,直接使用一个结构体,配置所有参数
  • 开启USART
  • 如果需要接收的功能,可能还需要配置中断,那就在开启USART之前,再加上ITConfig和NVIC的代码就行了
  • 如要发送,就调用发送的函数;如要接收,就调用接收的函数;如果要获取发送和接收的状态,就调用获取标志位的函数
    需要接收的功能,可能还需要配置中断,那就在开启USART之前,再加上ITConfig和NVIC的代码就行了
  • 如要发送,就调用发送的函数;如要接收,就调用接收的函数;如果要获取发送和接收的状态,就调用获取标志位的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YRr YRr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值