2020.12.10第二十九天学习总结
主要内容为串口通信讲解
1.串口通信是一种设备间非常常用的串行通信方式。由于其简单便捷的特性而成为大部分电子设备都支持的一种通信方式。
2.物理层面
串口通信的物理层其实有很多标准,而我们所学的也是比较常用的就是RS-232标准,而这个标准主要是规定了信号的用途,通信接口以及信号的点评标准。
(1)使用RS-232标准的串口设备间通信方式为两个设备之间通过设备上的“DB9接口”之间通过RS-232标准的串口信号先相连接。
由于RS-232电平信号不能被控制器直接识别,因此就引出了TTL标准。这是电子电路中常用的电平标准。因此整个过程就是设备A的控制器A产生的TTL电平信号,由电平转换芯片转换成RS-232标准的电平,由DB9接口的数据线转到设备B上的控制器B。
(2)RS-232信号线
其实最开始使用RS-232串口标准常用在计算机,路由器与猫之间的通信上。像我们的电脑上就有一个COM接口也叫DB9接口。这种接口的数据线就是RS-232标准的。
顾名思义它有9个信号线。都是有不同作用的。电脑比较复杂,一般的工业控制在使用串口通信时,一般只用到RXD、TXD、GND三条线。其中RXD与TXD彼此交叉相连,GND之间相连。
3.协议层面
数据是由发送设备的TXD接口传输到接受设备的RXD接口的。
协议层就是规定了数据的内容,包含了起始位、主体数据、校验位和停止位。还规定了收发双方的数据格式必须一致。
(1)起始和停止位
起始位为逻辑“0”;停止位为0.5、1、1.5、2个逻辑“1”。
(2)有效数据
指的是真正要传输的有效数据信息。长度一般为5、6、7或8位。
(3)数据校验
校验位其实是非必要的。在数据通信协议容易受到干扰而出现偏差时才会使用。每发送一组数据都要校验一次,看是否出错。
校验方法有四种,非别为奇/偶校验和0/1校验。
例如当为奇校验时,就是有效数据加校验位中“1”的个数位奇数个才行。
(4)波特率
我们常用的串口通信主要分为串口同步通信和串口异步通信。其实两者各有利弊,同步的效率高但允许的误差小,异步虽说数据中心包含了很多与实际信息有关的字符,但是少了时钟信号使得允许误差变得了,容错率变得更高了。
由于异步通信没有时钟信号,通信双方格式又要保持一致,因此就引入了波特率这个概念,波特率就是每秒钟传输了多少个码元。我们可能会与比特率搞混,比特率指的是每秒钟传输的比特数,也就是说比特率是传输速率,而波特率为调制速率,码元的大小是我们自己设定的,他可以是一个比特,也可以是多个比特。因此由于数据是一位一位传输的,所以就用波特率这种传输速率作为异步通信的同步标准。常见的有4800、9600、115200等,我们使用的就是115200。
4.STM32中的通用同步异步收发器
STM32中有多个外设用于串口通信,其中包括4个USART和4个UART。而其中也只有USART1和USART6是连接在APB2上的,也就是当我们设置系统时钟频率为180MHz时,这两个端口的时钟就位90MHz。我们这里使用的就是USART1端口。
首先由于收发双方都有TXD和RXD信号线,因此串口通信都为全双工的通信模式。
USART其实有很多种功能,在STM32上用到最多的就是他的“打印”系统信息的功能,当调试程序时会把调试信息“打印”在串口调试助手上,从而可以了解程序是否运行正确,以及指出哪里出错了。
(1)USART有六种功能引脚,由于我们只是用了他的异步通信功能,并且是全双工的模式,因此我们最终只使用到了两个功能引脚,即TX:发动数据输出引脚和RX:接收数据输入引脚。我们用的USART1分别对应的I/O口就为PA9和PA10。
(2)数据传输的方式:数据存储在MCU中,当需要发送数据是数据从MUC转移到缓冲区再发送到数据寄存器DR中,最后发送到USART1端口。这个过程是系统自动进行的,并且是使用的并行通信方式,而数据在USART端口间传输则是使用的串行通讯方式,即数据一位一位的传输。
(3)小数比特率生成
提到波特率计算首先要提到一个概念就是“过采样”。而过采样就是当我们需要知道一个信号的真实情况时,我们就需要一个比这个信号频率更高的采样信号来对其进行检测,这就称为“过采样”。过采样的频率大小决定最后得到信号源的准确度,过采样的频率越高则准确度就越高,但是不是一味的提高过采样频率就更好,因为过采样的频率越高,获得采样也就越难,而且还需要更多的运算以及更高的功耗。因此这个值要酌情处理。
采样的方法是有控制寄存器CR1的OVER8位决定的。当其为1时,表示8倍过采样,也就是用8个采样信号采样一位数据。当为0时,表示16倍过采样,也就是用16个采样信号采样亿微数据。
8倍过采样速度更快,其最大速度可达到端口时钟的8分频。虽然16倍过采样的速度相对较慢,但是其获得的数据更为准确。
由此我们得到波特率的共识为:
波特率=fpclk/(8*(2-OVER8)USARTDIV)
其中USARTDIV表示的时一个存放在波特率寄存器中的一个无符号定点数。这个数是有小数位的,当采用的16分频时其小数位才有效,8分频时小数位要被舍掉。
波特率公式的用法是当我们需要一个特定值的波特率时,我们会得出相应的DIV值,并将其写入波特率寄存器内。
无论是通过DIV来获得波特率还是通过波特率来计算DIV的值,我们都会遇到数除不尽的情况,因此我们就需要在一个可接受的范围内对数值进行一定的取舍,来获得一个合理的估值。
(4)校验位生成
由于数据寄存器DR只有低9位有效,并且第九位是否有效还要看控制寄存器CR的M位如何设置。因此当决定使用校验位并开启时,系统会自动生成校验位,并在数据传输时自动对其进行校验。当出现校验失败时,移位寄存器就会做出相应的变化,从而产生一次校验位中断。
(5)中断控制
如上所提到的校验位中断,在USART中有很多种中断请求,大约有9中。