串口通信(USART)

一、串口通信协议简介

       物理层:规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。其实就是硬件部分。

       协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。其实就是软件部分。

       简单来说物理层规定我们用嘴巴还是肢体来交流。
       写一层规定我们用中文还是用英文来交流。

       补充:USART中“S”指的是同步(synchronization)。

1.RS232标准

这里先说一下RS-232电平和TTL电平的区别:
串口通信(USART)_第1张图片
       TTL:直接从单片机或者直接从芯片出来的电平都叫TTL电平。高电平又5V或3.3V来表示。

       RS-232: 如上图,RS-232电平用-15V来表示高电平(也就是1),由+15V来表示低电平(也就是0)

RS-232标准串口通讯结构图:
串口通信(USART)_第2张图片
       如图是两个设备的通讯(设备A和设备B),控制器A有两根线,一个发送一个接收,输出的TTL电平需经过一个电平转换芯片将TTL电平转换为RS-232电平,由DB9接口传输给设备B的DB9接口,然后在经过电平转换芯片将转换好的TTL电平送给控制器B。
DB9公头及母头:
串口通信(USART)_第3张图片
       关于DB9接口,有兴趣的可以搜一下专门介绍这个的文章。
       RS232,RS485 标准DB9接口(串口通信线标准接口)

       ①RS232标准串口主要用于工业设备直接通信。工业设备可能静电比较多,还有震动,粉尘等,用-15V表示1,-15V表示0,峰峰值是30V,所以容错能力很强。
       ⑤电平转换芯片一般有MAX232,SP3232。

2.USB转串口(TTL)

串口通信(USART)_第4张图片
       ①USB转串口主要用于设备跟电脑通信。
       ②电平转换芯片一般有CH340、PL2303、CP2102、FT232。
       ③使用的时候电脑端需要安装电平转换芯片的驱动。

3.原生的串口到串口(TTL —> TTL )

串口通信(USART)_第5张图片
       ①原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信。
       ②GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块。

串口通信(USART)_第6张图片
       起始位:由1个逻辑0的数据位表示,即就是0。

       结束位:由0.5个、1个、1.5个或2个逻辑1的数据位表示。

       有效数据:在起始位后紧接着的就是有效数据,有效数据的长度常被约定为5、6、7或8位长。

       校验位:可选,为的是数据的抗干扰性。
校验方法分为:
       1-奇偶校验(odd)、2-偶校验(even)
       3-0校验(space)、4-校验(mark)
       5-无校验(noparity)

       奇校验(odd):有效数据和校验位中“1”的个数为奇数

       比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。

       偶校验(even):有效数据和校验位中“1”的个数为偶数

       比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到偶校验效果,校验位为“0”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。

       0校验是不管有效数据中的内容是什么,校验位总为“0”。
       1校验是校验位总为“1”。
       无校验就是数据包中不包含校验位。

二、STM32串口相关寄存器及框图

USART框图:
串口通信(USART)_第7张图片

1.引脚

       由图可以看出,USART有8个引脚,分别是:TX(数据发送)、RX(数据接收)、SCLK(时钟,仅同步通信时使用,但是我们一般使用异步,所以一般不使用这个时钟)、nRTS(请求发送)、nCTS(清除发送),“n”表示低电平有效,nRTS和nCTS这两个引脚也很少用。SW_RX、IRDA_OUT、IRDA_IN这些引脚也很少用,如果需要用到的话,可以查对应的IO引脚分配表。

2.寄存器

①关于字长:

串口通信(USART)_第8张图片
       字长可以通过编程USART_CR1寄存器中的M位,选择8或9位。在起始位期间,TX脚处于低电平,在停止位期间处于高电平。
串口通信(USART)_第9张图片
       其中n个停止位中的“n”是不确定的,它可以通过USART_CR2的STOP位来配置:
串口通信(USART)_第10张图片
       我们常用的是1个停止位。

       可能的奇偶校验位由USART_CR1的PCE、PS和PEIE位配置:
串口通信(USART)_第11张图片
       先设置PCE(校验控制使能)位进行使能,使能后再设置PS(校验选择)位决定是奇校验还是偶校验,使能PEIE(PE中断使能)位在校验结果和预期的结果不一样时产生中断。 产生中断以后就会有相应的标志位置位,就是USART_SR的PE位置位:
串口通信(USART)_第12张图片
       将该位置为1表示奇偶校验出错。

       数据寄存器:USART_DR,9位有效,包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。一个地址对应了两个物理内存。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口,RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。

②发送数据和接收数据的过程。

       发送数据之前需要先设置USART_CR1的UE、TE和RE位:
串口通信(USART)_第13张图片
       UE(USART使能)位设为1则USART使能,即打开串口。

串口通信(USART)_第14张图片
       TE(发送使能)可以让串口通过外部引脚对外发送数据。

在这里插入图片描述
       RE(接收使能)可以让串口通过引脚接收外部设备发送的数据。

       发送数据:
       设置UE=1,TE=1,
串口通信(USART)_第15张图片
       发送的数据可以来自CPU或来自DMA请求,将数据写入到发送数据寄存器(TDR)中,然后发送数据寄存器里的数据会发送到发送移位寄存器中,这时候USART_SR寄存器的TXE位会被置1;然后发送移位寄存器会将数据一个bit一个bit发到TX端。当数据发送完成后USART_SR寄存器的TC位会被置1。
串口通信(USART)_第16张图片
       接收数据:
       UE=1,RE=1。
串口通信(USART)_第17张图片
       外部设备的数据由RX传到接收移位寄存器,当接收移位寄存器里的数据全部发送到接收数据寄存器后,USART_SR的RXNE位置1,表示数据已经收到,可以读出了。

       还有一些和发送接收数据相关的寄存器(都在USART_CR1中):
串口通信(USART)_第18张图片

③波特率

       波特率是由波特比率寄存器(USART_BRR)设置的。
串口通信(USART)_第19张图片
这是波特率的公式: 串口通信(USART)_第20张图片
       所以我们要设置波特率,只要算出USARTDIV的值就行,算出以后写入到USART_BRR寄存器中就设置好波特率了。下面是一些计算USARTDIV的例子:
在这里插入图片描述
串口通信(USART)_第21张图片
串口通信(USART)_第22张图片

你可能感兴趣的:(STM32)