做网站排名软件,电子商务说白了是干嘛的,电子工程世界app下载,wordpress站点收录好USART介绍 USART#xff1a;另外我们经常还会遇到串口#xff0c;叫UART#xff0c;少了个S#xff0c;就是通用异步收发器#xff0c;一般我们串口很少使用这个同步功能#xff0c;所以USART和UART使用起来#xff0c;也没有什么区别。 其实这个STM32的USART同步模式另外我们经常还会遇到串口叫UART少了个S就是通用异步收发器一般我们串口很少使用这个同步功能所以USART和UART使用起来也没有什么区别。 其实这个STM32的USART同步模式只是多了个时钟输出而已它只支持时钟输出不支持时钟输入所以这个同步模式更多的是为了兼容别的协议或者特殊用途而设计的并不支持两个USART之间进行同步通信。所以我们学习串口主要还是异步通信。 串口的协议串口主要就是靠收发这样的、约定好的波形来进行通信的那这个USART外设就是串口通信的硬件支持电路。 USART分为发送和接收两部分发送是将数据寄存器的一个字节数据自动生成协议规定的波形从TX引脚发送出去。接收是自动接收RX引脚的波形按照协议规定解码为一个字节数据存放在数据寄存器里这就是USART电路功能。 波特率发生器就是用来配置波特率的其实是一个分频器比如我们APB2总线给个72MHZ的频率然后波特器进行一个分频得到我们想要的波特率时钟最后在这个时钟下进行收发就是我们指定的通信波特率。 停止位长度在进行连续发送时停止长度决定了帧的间隔最常用的是1位停止位。 同步模式就是多了个时钟CLK的输出硬件流控制比如A设备的TX脚向B设备的RX脚发送数据A设备一直在发发的太快了B处理不过来如果没有硬件流控制那B就只能抛弃新数据或者覆盖原数据了。如果有硬件流控制在硬件电路上会多出一根线如果B没准备好接收就置高电平如果准备好了就置低电平。A接收到了B反馈的准备信号就只会在B准备好的时候才发数据如果B没准备好那数据就不会发送出去这就是硬件流控制可以防止因为B处理慢而导致数据丢失的问题。 DMA是这个串口支持DMA进行数据转运可以使用DMA转运数据减轻CPU的负担。 最后智能卡、IrDA用于红外通信的、LIN局域网通信协议这些是其他的一些协议。因为这些协议和串口是非常的像所以STM32就对USART加了一些小改动就能兼容这么多协议了不过我们一般不用。 USART1是APB2总线上的设备USART2、 USART3是APB1总线上的设备。
USART框图 引脚部分 TX 发送数据输出引脚。 RX 接收数据输入引脚。 SCLK 发送器时钟输出引脚。这个引脚仅适用于同步模式。 USART_DR包含了已发送的数据或者接收到的数据。USART_DR实际是包含了两个寄存器一个专门用于发送的可写TDR 一个专门用于接收的可读RDR。 这两个寄存器占用同一个地址在程序上只表现为一个寄存器。当进行发送操作时往USART_DR写入数据会自动存储在TDR内当进行读取操作时向USART_DR读取数据会自动提取RDR数据。TDR和RDR都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的发送时把TDR内容转移到发送移位寄存器 然后把移位寄存器数据每一位发送出去接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR。
面是两个移位寄存器一个用于发送一个用于接收。发送移位寄存器的作用就是把一个字节的数据一位一位地移出去正好对应串口协议的波形的数据位。这两个寄存器是怎么工作的呢 比如你在某时刻给TDR写入了0x55这个数据在寄存器里就是二进制存储0101 0101 那么此时硬件检测到你写入数据了它就会检查当前移位寄存器不是有数据正在移位。 如果没有这个0101 0101就会立刻全部移动到寄存器准备发送当数据从TDR移动到移位寄存器时会置一个标志位叫TXE (TX Empty)发送寄存器空我们检查这个标志位如果置1了我们就可以在TDR写入下一个数据了。
注意一下当TXE标志位置1时数据其实还没有发送出去只要数据从TDR转移到发送移位寄存器了TXE就会置1我们就可以写入新的数据了。
然后发送移位寄存器就会在下面这里的发生器控制的驱动下向右移位然后一位一位地把数据输出到TX引脚。这里是向右移位的所以正好和串口协议规定的低位先行是一致的当数据移位完成后新的数据就会再次自动地从TDR转移到发送移位去存器里来 如果当前移位奇存器移位还没有完成TDR的数据就会选行等待但移位完成就会立刻转移过来有了TDR和移位寄存器的双重缓存可以保证连续发送数据的时候数据帧之间不会有空闲提高了工作效率。
简单来说就是数据一旦从TDR转移到移位寄存器了管你有没有移位完成就立刻把下一个数据放在TDR等着一旦移完了新的数据就会立刻跟上。 然后接收端也是类似的。数据从RX引脚通向接收移位寄存器在接收器控制的驱动下一位一位地读取RX电平先放在最高位然后向右移移位8次之后就能接收一个字节了。 同样因为串口协议规定是低位先行所以接收移位寄存器是从高位往低位这个方向移动的。
之后当一个字节移位完成之后这一个字节的数据就会整体地一下子转移到接收数据寄存器RDR里来在转移的过程中也会置一个标志位叫RXNE RXNot Empty接收数据寄存器非空当我们检测到RXNE置1之后就可以把数据读走了。同样这里也是两个寄存器进行缓存当数据从移位寄存器转移到RDR时就可以直接移位接收下一帧数据了。这就是USART外设整个的工作流程。
控制部分和其他增强部分
下面这里是发送器控制它就是用来控制发送移位寄存器的工作的接收器控制用来控制接收移位寄存器的工作然后左边这里有一个硬件数据流控也就是硬件流控制简称流控。 这里流控有两个引脚一个是nRTS一个是nCTS。nRTSRequest To Send是请求发送是输出脚也就是告诉别人我当前能不能接收nCTS Clear To Send是清除发送是输入脚也就是用于接收别人nRTS的信号的。这里前面加个n意思是低电平有效。 首先我们需要找到一个支持流控的串口并将它的TX连接到我们的RX。同时我们的RTS需要输出一个接收反馈信号并将其连接到对方的CTS。当我们可以接收数据时RTS会置为低电平请求对方发送。对方的CTS接收到信号后就可以继续发送数据。如果处理不过来比如接收数据寄存器未及时读取导致新数据无法接收此时RTS会置为高电平对方的CTS接收到信号后就会暂停发送直到接收数据寄存器被读取RTS重新置为低电平数据才会继续发送。
当我们的TX向对方发送数据时对方的RTS会连接到我们的CTS用于判断对方是否可以接收数据。TX和CTS是一对对应的信号RX和RTS也是一对对应的信号。此外CTS和RTS之间也需要交叉连接这就是流控的工作模式。然而我们一般不使用流控因此只需要了解一下即可。少用原因应该是多消耗两根通信线 接着继续看右边这个模块这部分电路用于产生同步的时钟信号它是配合发送移位寄存器输出的发送寄存器每移位一次同步时钟电平就跳变一个周期。时钟告诉对方我移出去一位数据你看要不要让我这个时钟信号来指导你接收一下当然这个时钟只支持输出不支持输入所以两个USART之间不能实现同步的串口通信。
那这个时钟信号的作用 1.兼容别的协议。比如串口加上时钟之后就跟SPI协议特别像,所以有了时钟输出的串口就可以兼容SPI。 2.另外这个时钟也可以做自适应波特率比如接收设备不确定发送设备给的什么波特率然后再计算得到波特率不过这就需要另外写程序来实现这个功能了。这个时钟功能我们一般不用所以也是了解一下就行。 这部分的作用是实现串口挂载多设备。我们之前说串口一般是点对点的通信只支持两个设备互相通信。而多设备在一条总线上可以接多个从设备每个设备分配一个地址我想跟某个设备通信就先进行寻址确定通信对象再进行数据收发。
那回到这里这个唤醒单元就可以用来实现多设备的功能在这里可以给串口分配一个地址当你发送指定地址时此设备唤醒开始工作当你发送别的设备地址时别的设备就唤醒工作这个设备没收到地址就会保持沉默。这样就可以实现多设备的串口通信了这部分功能我们一般不用。 中断申请位就是状态寄存器这里的各种标志位状态寄存器这里有两个标志位比较重要一个是TXE发送寄存器空另一个是RXNE接收寄存器非空这两个是判断发送状态和接收状态的必要标志位剩下的标志位了解一下就行。中断输出控制这里就是配置中断是不是能通向NVIC。 波特率发生器其实就是分频器APB时钟进行分频得到发送和接收移位的时钟。看一下这里时钟输入是fPCLKxx1或2USART1挂载在APB2所以就是PCLK2的时钟一般是72M其他的USART都挂载在APB1所以是PCLK1的时钟一般是36M。
之后这个时钟进行一个分频除一个USARTDIV的分频系数并且分为了整数部分和小数部分因为有些波特率用72M除一个整数的话可能除不尽会有误差。所以这里分频系数是支持小数点后4位的分频就更加精准之后分频完之后还要再除个16得到发送器时钟和接收器时钟通向控制部分。
然后右边这里如果TE (TX Enable为1就是发送器使能了发送部分的波特率就有效如果RERX Enable为1就是接收器使能了接收部分的波特率就有效。
串口引脚 这些引脚都必须按照引脚定义里的规定来或者看一下重映射这里有没有重映射这里有USART1的重映射所以有机会换一次口剩下引脚就没有机会作为USART1的接口了。
USART基本结构 最左边这里是波特率发生器用于产生约定的通信速率时钟来源是PCLK2/1经过波特率发生器分频后产生的时钟通向发送控制器和接收控制器。发送控制器和接收控制器用来控制发送移位和接收移位。
之后由发送教据寄存器和发送移位寄存器这两个寄存器的配合将数据一位一位地移出去通过GPIO的复用掩出输出到TX引脚产生串口协议规定的波形这里画了几个右移的符号就是代表这个移位寄存器是往右格的是低位先行。 当数琚由数据寄存器转到移位寄存器时会置一个TXE的标志位我们判断这个标志位就可以知道是不是可以写下一个数据。
然后接收部分也是类似的RX引脚的波形通过GPIO输入在接收控制器的控制,下一位一位地移入接收移位寄存器这里画了右移的符号也是右移的因为是低位先行所以要从左边开始移进来移完一帧数据后 数据就会统一转运到接收数据寄存器在转移的同时会置一个RXNE标志位我们检查这个标志位就可以知道是不是收到数据了。同时这个标志位也可以去申请中断这样就可以在收到数据时直接进入中断函数然后快速地读取和保存数据。
那右边这实际上有四个寄存器但在软件层面只有一个DR寄存器可以供我们读写写入DR时数据走上面这条路进行发送读取DR时数据走下面这条路进行接收这就是USART进行串口数据收发的过程。
数据帧
这个图是在程序中配置8位字长和9位字长的波形对比。这里的字长就是我们前面说的数据位长度。他这里的字长是包含校验位的是这种描述方式。 那看一下上面这个9位字长的波形第一条时序很明显就是TX发送或者RX接收的数据帧格式。 空闲高电平然后起始位0然后根据写入的数据置1或0依次发送位0到位8加起来就是9位最后停止位1数据帧结束。在这里位8也就是第9个位置是一个可能的奇偶校验位通过配置寄存器就可以配置成奇校验、偶校验或者无校验这里可以选择配置成8位有效载荷1位校验位也可以选择9位全都是有效载荷。不过既然你选择了9位字长那一般都是要加上校验位的因为8位有效载荷正好对应一个字节。
然后下面这个时钟就是我们之前说的同步时钟输出的功能可以看到这里在每个数据位的中 间都有一个时钟上升沿时钟的频率和数据速率也是一样的接收端可以在时钟上升沿进行采样这样就可以精准定位每一位数据。这个时钟的最后位可以通过这个LBCL位控制要不要揄出。另外这个时钟的极性、相位什么的也可以通过配置寄存器配置。 然后下面这两个波形一个是空闲帧就是从头到尾都是1还有一个是断开帧从头到尾都是0.这两个数据帧是局域网协议用的我们串口用不著不用管的。
接下来是8位字长的波形可以看到这里的数据位是从位0一直到位7总共是8位比上面这个少了一个位8同样这个最后一位位7也是一个可能的奇偶校验位。还是同样既然你选择了8位字长那这里就最好选择无校验要不然你校验位占1位有效载荷就只剩7位了一个字节都发不了。
不同停止位的波形变化 STM32的串口可以配置停止位长度为0.5、1、1.5、2这四种。
这四种参数的区别就是停止位的时长不一样。第一个是1个停止位这时停止位的时长就和数据位的一位时长一样然后是1.5个停止位这时的停止位就是数据位一位时长的1.5倍2个停止位那停止位时长就是2倍0.5个停止位时长就是0.5倍。这个也好理解就是控制停止位时长的一般选择1位停止位就行了其他的参数不太常用。这个是停止位。
起始位侦测
那我们来看一下STM32是如何来设计输入电路的呢
第一个图展示了USART的起始位侦测。当输入电路侦测到数据帧的起始位后将以波特率的频率连续采样一帧数据。同时从起始位开始采样位置要对齐到位的正中间。只要第一位对齐了后面就都是对齐的。 为了实现这些功能输入电路对采样时钟进行了细分以波特率的16倍频率进行采样。在一位的时间里可以进行16次采样。比如最开始时空闲状态为高电平采样一直是1。在某个位置突然采到0说明两次采样之间出现了下降沿如果没有噪声那之后就应该是起始位了。在起始位会进行连续16次采样没有噪声的话这16次采样肯定都是0。但是实际电路还是会存在一些噪声所以这里即使出现下降沿了后续也要再采样几次以防万一。 根据手册描述接收电路在下降沿之后的第3次、5次、7次进行一批采样在第8次、9次、10次再进行一批采样。这两批采样都要求每3位里面至少应有2个0。如果没有噪声那肯定全是0满足情况如果有一些轻微的噪声导致3位里面只有两个0另一个是1那也算是检测到了起始位但是在状态寄存器里会置一个NENoise 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那它就按照21的规则来2次为1就认为收到了12次为0就认为收到了0在这种情况下噪声标志位NE也会置1告诉你我收到数据了但是有噪声你悠着点用这就是检测噪声的数据采样可见STM32对这个电路的设计考虑还是很充分的。
波特率发生器 计算公式有个16是因为它内部还有一个16倍波特率的采样时钟所以这里输入时钟/DV要等于16倍的波特率最终计算波特率自然要多除一个16了。 举个例子比如我要配置USART1为9600的波特率那如何配置这个BRR寄存器呢。
我们代入公式就是9600等于 USART1的时钟是72M 除 16倍的DIV解得DIV72M/9600/16最终等于468.75则二进制数是11101 0100.11v。所以最终写到这个寄存器就是整数部分为11101 0100前面多出来的补0小数部分为11后面多出来的补0。这就是根据波特率写BRR寄存器的方法了解一下不过我们用库函数配置的话就非常方便需要多少波特率直接写就行了库函数会自动帮我们算。
USB转串口模块原理图