上节已了解串口协议,提到目标? ?1·发送? ?2·发送+接收
定义:
通用同步/异步收发器
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外设
(有很多不用看,只看红色的)
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里的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有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数据寄存器:存放最关键数据
说到寄存器,看使用手册,有时候会很乱,怎么那么多寄存器,
其实用到不多的。用上的才设置。
其它没用上的,不用管。