前言
我们在51单片机中就已经学习过了串口通信的相关知识点,那么我们现在在32单片机上进一步学习通信的原理。我们主要讲解串口功能框图以及串口初始化结构体以及固件库讲解。
STM32第十二节(中级篇):串口通信(第一节)——功能框图讲解
URAST框图:分为四个部分,分别是引脚,数据寄存器,控制器,波特率。
引脚介绍
TX:数据发送;
RX:是数据接收;
SCLK:时钟,仅同步通信时使用;
nRTS:请求发送(Request To Send);
nCTS :允许发送(Clear To Send)。
引脚必然会对应相对应的GPIO口,我们所学的指南者所对应的GPIO引脚就在下面了,我们发现USART1挂载在APB2总线上,剩下的都在APB1总线上,我们要注意写代码的时候要打开APB1以及APB2总线的时钟。
数据寄存器
数据寄存器-USART DR:
9位有效,包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。一个地址对应了两个物理内存。我们通过观察USART_DR的前九位,是由控制寄存器(USART_CH1以及USART_CR2)所控制的。
字长M:
在由控制寄存器USART_CH1的13位是M(字长),控制着数据字的长度,由软件对其设置和清零。
0:一个起始位,8个数据位,n个停止位:
1:一个起始位,9个数据位,n个停止位。
注意:在数据传输过程中(发送或者接收时),不能修改这个位。
停止位(STOP):
我们观察上图发现,在启动位之后会有数据帧,数据传输结束后会有停止位(STOP);而停止位由控制寄存器USART_CH2决定。
STOP:停止位(STOP bits)这2位用来设置停止位的位数
00:1个停止位;
01:0.5个停止位;
10:2个停止位;
11:1.5个停止位;
注:UART4和UART5不能用0.5停止位和1.5停止位。
可能的奇偶校验位:
位10:
PCE:检验控制使能(Parity control enable)
用该位选择是否进行硬件校验控制(对于发送来说就是校验位的产生;对于接收来说就是校验位的检测)。当使能了该位,在发送数据的最高位(如果M=1,最高位就是第9位;如果M=0,最高位就是第8位)插入校验位;对接收到的数据检查其校验位。软件对它置"1或清0’。一旦设置了该位,当前字节传输完成后,校验控制才生效。
0:禁止校验控制:
1:使能校验控制。
位9:
PS:校验选择(Parity selection)
当校验控制使能后,该位用来选择是采用偶校验还是奇校验。软件对它置"1或清0’。当前字节传输完成后,该选择生效。
0:偶校验:
1:奇校验
位8:
PEIE: PE中断使能(PE interrupt enable)该位由软件设置或清除。
0:禁止产生中断:
1:当USART_SR中的PE为'1'时,产 生USART中断。
数据发送和接收具体的流程:
我们一步步来,
UE:USART使能(USART enable)
当该位被清零,在当前字节传输完成后USART的分频器和输出停止工作,以减少功耗。该位由软件设置和清零。
0:USART分频器和输出被禁止;
1:USART模块使能。
TE:发送使能(Transmitter enable)
该位使能发送器。该位由软件设置或清除。
0:禁止发送;
1:使能发送
注意:
1.在数据传输过程中,除了在智能卡模式下,如果TE位上有个0脉冲(即设置为'0'之后再设置为'1’),会在当前数据字传输完成后,发送一个“前导符"(空闲总线)。
2.当TE被设置后,在真正发送开始之前,有一个比特时间的延迟。
RE:接收使能(Receiver enable)
该位由软件设置或清除。
0:禁止接收;
1:使能接收,并开始搜寻RX引脚上的起始位。
通过观察功能框图,我们发现具体的流程为:
发送数据:
UE=1;TE=1
而数据从CPU或DMA从内存里读取来,然后就会。放到发送数据寄存器(TDR)中,然后转交给发送移位寄存器,然后八位数据一位一位的通过串行的方式传输到TX引脚,表示发送完成。
在这个过程中,有两个寄存器的位会改变,在TDR中,TXE为空.
TXE:发送数据寄存器空(Transmit data register empty)
当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。如果USARTCR1寄存器中的TXEIE为1,则产生中断。对USARTDR的写操作,将该位清零。
0:数据还没有被转移到移位寄存器:
1:数据已经被转移到移位寄存器。
注意:单缓冲器传输中使用该位。
TC:发送完成(Transmission complete)
当包含有数据的一帧发送完成后,并且TXE=1时,由硬件将该位置"1'。如果USARTCR1中的TCIE为"1’,则产生中断。由软件序列清除该位(先读USART SR,然后写入USART_DR)。TC位也可以通过写入0'来清除,只有在多缓存通讯中才推荐这种清除程序。
0:发送还未完成:
1:发送完成。
接收数据:
UE=1;RE=1
相反的,接收数据就是先从RX(GPIO口)进入数据,然后转到接收移位寄存器中,再到接收数据寄存器(RDR)中,同时也有位的改变(标志位):
RXNE:读数据寄存器非空(Read data register not empty)
当RDR移位寄存器中的数据被转移到USART DR寄存器中,该位被硬件置位。如果USART CR1寄存器中的RXNEIE为1,则产生中断。对USART DR的读操作可以将该位清RXNE位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。
0:数据没有收到;
1:收到数据,可以读出。
控制器(USART_CRx(1,2,3))
熟读手册即可,手册可在官网中找到:
野火手册下载https://doc.embedfire.com/products/link/zh/latest/index.html
波特率
USART BRR:波特率寄存器。
以下是波特率计算公式:
为了计算出USARTDIV,我们需要知道时钟配置为72M还是别的,然后根据给定的波特率即可计算出USARTDIV的值,计算结果分为整数和小数两个部分,分开计算,小数部分要乘以16达到所计算的值。最后以16进制相加,即可求出结果。
小结
本节课讲了关于功能框图的讲解,细致的展现了从寄存器到固件库的讲解,下节课将继续代码部分的实操。
创作不易,点个三连支持一下吧!