N32G003学习——第九章 第二节 USART串口外设

发布时间:2024-01-10 17:09:19

上节已了解串口协议,提到目标? ?1·发送? ?2·发送+接收

1·STM32的USART(串口)

定义:

通用同步/异步收发器

USART是STM32内部集成的硬件外设,

可根据数据寄存器的一个字节数据自动生成数据帧时序,

TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节,存放在数据寄存器

自带波特率发生器,最高达4.5Mbits/s可配置数据位长度(8/9)

停止位长度(0.5 / 1 / 1.5 / 2)

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

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

STM32F103C8T6USART资源(视频资源):USART1、USART2、USART3

A代表同步,S代表异步

我们常说的串口,有时候称UART

STM32的同步模式,只支持时钟输出,主要目的是兼容其他协议

所以不支持两个USART之间的同步通信

一般串口很少用到同步模式

所以USART和UART使用起来,区别不大

串口通信,主要是?异步通信(没时钟线,通过约定的采集频率,如比特率)

硬件流控制:(很少用,知道有这个就好)

A发送给B,A发送很快,B来不及接收,如果没有硬件流控制,B处理不过来,只能抛弃新数据或者覆盖原数据;如果有硬件流控制,就会多一根线,B没准备好,就置高电平,准备好,就置低电平,A接收到B的反馈后,等B准备好的时候,A才发送数据;如果B没准备好,A接收到B的反馈,知道不发送数据

硬件流控制,可以防止因B处理慢,而导致数据丢失。

DMA:数据转运,减轻CPU负担

智能卡、IrDA、LIN:协议,和串口很像,一般不用

USART1、USART2、USART3:

这款STM32,带3个USART外设,?可挂很多设备

注意这3个USART外设,知道对应的总线

USART1属于APB2总线上,USART2、USART3属于APB1总线上

需开启对应总线的使能,才能用对应的USART外设

STM32的USART框图

(有很多不用看,只看红色的)

TX

RX

TDR发送数据寄存器:只写

RDR接收数据寄存器:只读

发送移位寄存器

接收移位寄存器

发送过程

写一段数据给TDR发送数据寄存器,

这段数据全部移到发送移位寄存器,发送数据寄存器就空了,TXE位自动置1

检测TXE位为1就可以写下一段数据给发送数据寄存器了。

当一段数据完全移位到发送移位寄存器,

开始往右移位,一位位的传到TX引脚,这就是所谓的低位先行

?

TDR发送数据寄存器,会等发送移位寄存器空了,再传数据,给发送移位寄存器

同样的,等发送数据寄存器空了,TXE位自动置1了,才会在写入下一段数据给发送数据寄存器

有了这两个寄存器的缓存,这样发送出来的数据,是一段接一段,连续的,数据帧之间没有空隙?

接收过程

同理,RX接收数据,给到接收移位寄存器,再给到接收数据寄存器,等完整一段数据都到了接收数据寄存器后,同样的,RXNE自动置1,检测到RXNE置1了,说明可以把里面的数据,发送给总线上,进行读取数据。

同样的,有了这两个寄存器的缓存,读取的数据帧是连续的

其他功能

(简单了解)

硬件数据流控:

nRTS引脚,输出,告诉别人,当前能不能接受数据

nCTS引脚,输入,接收别人的nRTS,能不能发送

(n代表低电平有效)

上面可能讲的有点复杂,具体用法,就很好理解:

找另一个串口,

别人CTS接自己RTS

自己RTS置低电平,告诉别人可以发数据过来,我会接收

别人CTS得到低电平,哦就知道,别人可以发数据过来了

(也可以理解为使能)

反之,当自己数据处理不过来的时候,

自己的RTS置高电平

别人的CTS得到高电平

别人就知道不发送数据过来。

(这个RTS和CTS,我们一般不用的,了解即可)

产生同步时钟信号(同步很少用,了解即可)

和发送移位寄存器配合

每移位一次,同步时钟电平就跳变一个周期

简单理解:

告诉别人,我移出去1位数据了

看看我的时钟信号,指导你接收?

这个时钟只支持输出,不支持输入

所以两个USART之间,只能是异步的串口通信,不能同步

(有时钟输出的串口,很像SPI,能兼容SPI,我也不懂SPI,后面再理解这句话)

当不知道别人的波特率时候

这个时钟,也可以做自适应波特率

测量一下别人的时钟信号的周期,计算出别人的波特率

这个时钟,一般不用,了解即可

唤醒单元(一般不使用,了解即可)

实现串口挂载多设备

上节说到,串口是点对点CSDN

这个兼容多设备

譬如唤醒单元,是老师

老师找班上某个人谈话,某个人有座位(地址),

老师通过唤醒单元收到的地址,确认找哪个人谈话

SR?状态寄存器

常用的标志位:如之前说的TEX、RXNE(上面的发送过程,有讲解)

中断控制

配置中断,是不是能通向NVIC(NVIC统一分配中断优先级别、管理中断的)N32G003学习—— 第五章 第一节 EXTI外部中断_qq_34525008的博客-CSDN博客

波特率发生器

其实就是个分频器

APB时钟分频,得到发送和接收移位时钟

这里的时钟输入是fPCLKx(x=1或者2)

譬如USART1规定挂在APB2,

所以USART1就是fPCLK2的时钟,一般是72M

之后通过USART DIV分频(左黄)

分频就是除以一个数(右黄)

看到这个数分为整数和小数,因为譬如72M除以一个整数,除不尽,有误差

所以这个分频系数,是有小数,减少误差

这款STM32波特率的分频系数,支持小数点后4位,分频出来就更加准确了

分完频,记住不是分频就完事,还要除以16

(因为他把采集一位,分16次,这样采集的数据才更加准确)

才得到? 发送器时钟?和?接收器时钟

如果TE为1,就是发送器使能了,发送部分的波特率就有效

如果RE为1,就是接收器使能了,接收部分的波特率就有效

串口通讯引脚

在复用功能里,比如STM32

USART1的TX是PA9口,RX是PA10口

USART2的TX是PA2口,RX是PA3口

USART3的TX是PB10口,RX是PB11口

也有可能在重映射里

USART1的TX映射在PB6

USART1的RX映射在PB7

USART的基本结构:(先看前面,在看这图,才更好理解)

数据帧(上节有提过)

(1)起始位+数据位8位+停止位
(2)起始位+数据位8位+奇偶校验位+停止位

奇偶校验位:在配置寄存器CR选择? 无校验? /?奇校验 /?偶校验

停止位:可选0.5 / 1 / 1.5 / 2 (指的是时长)

起始位侦测(了解即可)

他把采集一位,分16次,这就是为什么之前波特率计算,除分频系数,还要除16的原因

噪音对起始位侦测电路有影响,噪音导致采集的0有些会波动成1,

NE标志位自动置1,就说明不是每次采集都是0,说明有噪音,悠着点用

按照2:1原则,譬如有2次是0,1次是1,就确定0

若设置第8/9/10次才采集,确定了0,那么往后的采集,都在第8/9/10次的位置上,刚好在位的中间,这样采集数据会更加准确。

BRR寄存器( 波特比率寄存器 )

要产生波特率大小,由BRR寄存器决定。

发送器和接收器的波特率,就是由BRR里的DIV决定

(DIV:分频系数,包含整数,和四位小数)

计算公式:波特率 =?

举例:

需要配置USART1为9600的波特率

9600=72/(16*DIV)? 代入公式,72前面也说过,是USART1挂在APB2总线,系统频率为72M

DIV=72/9600/16=468.75

十进制468.75👉二进制111010100.11

写在DIV,空的补0,得000111010100? 1100

当然,用库函数就简单,需要波特率就写进去,库函数自己帮我们算。

拓展:USB转串口原理

USB有4根线:GND? /? VCC / D+? /? D-

USB通过通信线D+ .? D- ,传给CH340G转成串口,由TXD和RXD出去

所有的电,都是由USB的VCC+5V来

(左上方)然后VCC+5V 通过稳压管降压VCC+3V3

之后通过排针(CON6)把VCC+5V和VCC+3V3都引出来

可通过跳线帽,把排针的5脚和6/4脚连起来,把电给到CH340G芯片

给到CH340G芯片的电,

若是5V,TLL电平就是5V

若是3V3,TLL电平就是3V3

看自己需要,跳线帽,连上所需电压

(TTL电平:串口输入输出的电平,譬如5V代表1,3V3代表1)

(右下角,那块电路是指示灯和滤波,方便我们观察)

外设都有的三类寄存器

CR控制寄存器:使能之类的

SR状态寄存器:存放各种标志位

DR数据寄存器:存放最关键数据

说到寄存器,看使用手册,有时候会很乱,怎么那么多寄存器,

其实用到不多的。用上的才设置。

其它没用上的,不用管。

文章来源:https://blog.csdn.net/qq_34525008/article/details/132732895
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。