STM32工作笔记0052---串口通信原理--UART

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

 

这里需要理解一下这个并行通信和串行通信,

这个并行通信就想,比如我要从A传输8个bit到B

那么用并行通信的话就可以,8个bit,一起传输过去,这个时候占用8个引脚.

串行通信就是这8个bit,一个位一个位的传输过去,只占用1个引脚,这样的话,对应的优缺点就显示出来了.

串行通信,传输慢,但是占用的引脚少,但是并行通信传输的快,但是占用的引脚多.

单工通信是

单工通信就是只能从A传输到B,单向的.

可以看到这里,有半双工和全双工 

半双工的意思是,A,和B都可以接收和发送,但是同一时间只能有一个,

也就是同一个时间,只能是发送或者接收.要求A,B都要有,发送接收的能力.

全双工,同一时间可以发送,也可以接收,但是要求A,B都要有,发送接收的能力.

来说一下这个同步通信和异步通信.

注意这里的同步通信,是带有时钟同步信号的通信,也就是比如从A传输到B,这个时候,除了上面的传输数据以外

还需要,同步一个时钟信号,也就上跟上面的一样,同步时钟信号,比如时钟信号,每次向上高电平的时候,就传输一位.

对于异步通信来说,因为没有时钟同步信号,那么这个时候就需要约定好,这里就是约定使用的波特率,

也就是,比如每隔1s,就去采样一次,这样.就如上面画的那样,如果没有约定的话,A到B传输的时候,可能就乱了,因为不知道

什么时候,收的地方,开始采样,取数据等.

这里说几种常见的通信标准.异步通信不用时钟.

USART可以做为同步异步来用,UART只能用来做异步收发器,对于这个芯片有5个可以使用3个USART,2个UART.

这里看一下,这个发送和接收,对于两个芯片之间通过UART通信的话,就是连接方式,就是上面左侧.

发送和接收会通过TTL电平来实现的.

而对于,UART和电脑的通信是这样的:

电脑的发送和接收引脚会通过一个DB9,转换为RS232电平,然后芯片的接收和发送也是会被转换成RS232电平,

通过这样的方式来实现.

战舰版有这个DB9接口

可以看到上面的部分就是DB9接口

DB9接口,连接某个电路,然后再连接到对应的针脚上,然后

这个DB9接口,是没办法直接连接另外的一个芯片的,需要连接的话,需要把另一个芯片出来的电平,转换为

R232电平.也就是把TTL电平,转换为R232电平.

STM32F103的对应的5个串口,对应的引脚下面都有了.

也可以去看文档可以在这个文档中查.

看一下这里的,注意分数波特率发生器系统的设置,后面会说,

然后可编程波特率后面也会说.

看一下串口通信过程,就是说外部设备,用高低电平传输数据,这个传输数据的速度,跟

波特率有关,RXD这个是接收引脚,TXD这个是发送引脚

可以看到他都是先放到串行输入移位寄存器中,然后再放入输入数据寄存器中,或者输出数据寄存器中

然后再进行发送或者接收,相应的MCU才能去对应的,输入,输出寄存器中去读取,放入数据.

看一下这个串口异步通信的过程,

就跟上面说的一样,首先要有一个起始位,标志着,开始进行数据传输了,然后

然后后面的8位就是数据位,然后第9位是奇偶校验位.

然后还有一个是停止位,比如约定好,0就是起始位,然后1就是停止位,他就是从接收数据开始算,

第0位是0的话,就是起始位,然后是8位数据位,1位奇偶校验位,然后1位停止位,这个停止位读取到1就

停止一个数据的接收.

这里的奇偶校验位是什么意思呢,比如

要传输的8位数据是0000 0111 这个时候奇偶校验位就位自动补齐一个1,这样就让1的个数凑够4个

也就是偶数个.如果是要发送的数据是0000 1111,那么对应的奇偶校验位就设置为 0,这样也能保证

1的个数是偶数位.

也就是说如果,接收的数据,如果1的个数不是偶数位的话,那么这个数据就有可能是错误的.

通过这样的方法,来保证数据的正确性.

再来看这个串口的框图:这个很重要

比如上面,首先IRDA_OUT IRDA_IN这个先不用看,因为这个是做红外控制用的.

然后,看对应的RX接收引脚,接收引脚,连接接收移位寄存器,把数据一位一位的移动到接收移位寄存器中

以后,然后再移位到接收数据寄存器RDR中,然后MCU就可以从这个RDR中去读取数据了.

然后,再看这个TX发送,这个时候,首先MCU会把数据,放入到发送数据寄存器中,然后,发送数据寄存器中的数据

再通过移位放到这个发送移位寄存器中,然后,数据再一位一位的通过串口的TX发送引脚,发送出去

这个过程中的数据发送速度是通过波特率来控制的,发送的时候会按照事先定义好的波特率,一位一位的移出.

再往下看,那么他是怎么实现的数据发送呢,可以看到,这里发送移位寄存器,连接了发送控制器,

而接收移位寄存器连接了接收器控制.

然后,客户以看到这里,发送器控制的发送器时钟,和接收器控制的接收器时钟,都连接了一个单元,用来提供

时钟.通过时钟来实现的动力驱动位移动.

这样也就明白了,串口的,发送和接收,他都用同一个波特率发生器来产生,也就是来源于同一个

时钟源.

注意,这里的时钟来源,对于STM32F103系列,这个串口的时钟来源,

串口1 UART1的时钟来源于PCLK2 

串口2-4的时钟来源是PCLK1 

这个时钟要知道,他是通过这个USART_BRR这个寄存器,包括后面的

DIV_Marissa DIV_Fraction

下面的这个是一个是整数,一个是小数,也就是说,这个/USARTDIV,这个其实是一个分频器

经过他的分频以后,然后再16分频,产生的波特率,就作为发送时钟源和接收时钟源了.

因为这里有小数和整数的处理,所以这里,可以进行小数分频,比如36.005这样,其实实际上不能用这个小数

他要用16分之一的倍数,这个样的小数,作为分频系数才行.

讲到这里就知道了,他这个发送移位寄存器和接收移位寄存器,实际上是通过下面的时钟源产生的.

上边这部分是跟智能卡什么的相关的,先不管.

再看这一部分,这里先看这个SR,这个寄存器,实际上是记录了一些标志位,

然后再看这个CR1寄存器,这个寄存器实际上是一些使能位,比如这里的TE发送使能transfer enable,然后

RE 接收使能.

然后看左边,可以看到有些IDLE RXNE TXEIE..等这些是一些中断的使能位,使能了某个中断,

就可以使用对应的中断了,可以写对应的中断函数.来控制数据的传输.

讲解这个框图让大家对这个串行通信原理有个理解.

猜你喜欢

转载自blog.csdn.net/lidew521/article/details/108186998