STM32通用同步和异步通信技术

一、通信

通信:CPU与外围设备之间的信息交换

通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

1.1 通信分类

基本的通信方式有并行通信和串行通信

串行通信:将数据字节一位一位的依次传送的方式。串行通信的缺点是速度慢,优点是使用的传输线条数少,适用于远距离传输

并行通信:将数据字节的各位同时传送的方式。并行通信的优点是数据传送速度快,缺点是使用的传输线条数多,适用于近距离传输

1.2 通信方式

(1)单工通信:数据只允许向一个方向进行传送

(2)半双工通信:数据允许向两个方向进行传送,但传送与接收的过程不能同时进行

(3)全双工通信:数据允许向两个方向进行传送,并且传送与接收的过程可以同时进行

1.3 通信协议

单端:引脚的电平是对GND的电压差,单端通信的双方要共地

差分信号:差分引脚的电压差来传输信号,在通信时可不接GND(USB需要接GND)

如果通信双方的电平标准不一致时,需要加电平转换芯片,以串口通信为例

二、串行通信

        STM32F103C8T6单片机提供强大的串行通信模块,即通用同步/异步收发器(USART,Universal Synchronous Asynchronous Receiver Transmitter),其支持同步和异步通信,也支持局部互联网(Local Interconnection NetWork,LIN),智能卡协议和红外数据组织(Infrared Data Association,IrDA)协议,以及调制解调器(CTS/RTS)操作,还允许是由DMA,实现数据的高速通信

       STM32F103C8T6单片机 拥有USART1(APB2)、USART2(APB1)、USART3(APB1)串口资源

        USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里

2.1 串行同步/异步通信

        串行异步通信:一次通信传送一个字符帧。在发送字符时,发送的字符之间的时间间隔可以是任意的,但每个数据帧中的各位是以固定时间传送的,但每个数据帧要附加起始位、停止位,有时还要加上校验位。优点:通信设备简单、价格低廉,但因具有起始位和停止位,所以传输效率低

        串行同步通信:采用一个同步时钟,设备在通信之前先建立同步,通过一条同步时钟线,加到收发双方,使其达到完全同步。此时,许多字符组成的信息组,一个接一个的传输。在发送信息时,将多个字符加上同步字符组成一个信息帧,把此后的数位作为实际传输信息来处理,在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙

(注:STM32 USART的同步模式,只支持时钟输出,不支持时钟输入)

优点:传输速度快,可用于点对多点,缺点是需要使用专用的时钟控制线实现同步,对于长距离传输,成本较高,通信速率也会降低

2.2 串行异步通信的数据传输形式

        串口参数:波特率(自带波特率发生器,最高达4.5Mbits/s)、起始位(低电平)、数据位(8/9)、奇偶校验位(数据位中1的个数的奇偶)、停止位(高电平,0.5/1/1.5/2)

        另外,空闲状态下,默认为高电平

        波特率:每秒钟传送的符号(码元)数量,单位baud/s。在通信系统中,携带数据信息的信号单元称为码元,也称为符号(symbol)。

        比特率:每秒钟传送的比特数量,又称为传信率。比特率基本单位为bit/s或bps

码元类型 码元状态  码元状态总数量(N) 单个码元所需比特位数(log₂N)
2种状态的码元 0、1 2 1
4种状态的码元 00、01、10、11 4 2
8种状态的码元 000、001、010、011、100、101、110、110 8 3

二进制中,一个码元就是一个比特。在数值上两者相等,但单位不同

不同位的停止位的使用

2.3 USART的结构

USART的主要组成部分包括接收数据输入(RX)、发送数据输出(TX)、清除发送(nCTS)、发送请求(nRTS)和时钟输出(CK)等引脚

TX(Transmit Exchange,传输交换)、RX(Receive Exchange,接收交换)

发送数据寄存器(Transmit Data Register,TDR)、接收数据寄存器(Receive Data Register,RDR)占用同一个地址,在程序上只表现为一个数据寄存器(DR)

发送过程:把数据写入数据寄存器中,会自动清零TXE(TX Empty,发送寄存器空)。当数据转移到移位寄存器中,TXE被置1(表示TDR为空,可以写入下一字节数据)。而移位寄存器中的数据会在发送器控制下,从低到高依次移出到TX引脚

接收过程:字节数据通过RX引脚,到达接收移位寄存器。当移位寄存器中的字节数据转移到RDR中,RXNE(RX Not Empty,接收数据寄存器非空)被置1,此时RDR中的字节数据可被读出

nRTS(Request To Send,发送请求),nCTS(Clear To Send,清除发送)(n:表示低电平有效)

当接收端可以接收数据时,nRTS置低电平发送收端的nCTS接收后就可以进行发送;当数据没有及时处理时,接收端的nRTS置高电平,发送端的nCTS接收后就停止发送

CK引脚是与TX引脚一起联合工作的,只有在使能了发送器(TE=1),并且发送数据时(写入数

据至USART_DR
寄存器
)才提供时钟。
发送移位寄存器每移位一次,同步时钟电平就跳转一个周期

用途:①
兼容其他通信协议,例如:SPI


自适应波特率。通过测量时钟的周期,通过计算得到波特率

唤醒单元:实现串口挂载多设备。可以给串口分配一个地址,当发送指定地址时,此设备唤醒开始工作

中断控制:

波特率发送器:

TE:发送器波特率使能控制位,RE:接收器波特率使能控制位

USARTDIV是由1
2位整数和4位小数组成的无符号定点数

Fck
:指挂在对应总线说的时钟(APB1、APB2)

16:内部有一个16倍波特率的采样时钟

起始位检测的策略:

当检测到起始位,之后每位的数据都可以在其中间(8、9、10位采样点)采样,提高了准确性

如果不全相等,噪声标志位也会置1

三、串口收发数据包

        对于实际应用中,通常需要将多个字节数据打包成为一个整体,连续进行发送。比如,陀螺仪传感器需要将实时采集的数据(x、y、z)发送至CPU进行处理,这时,对于CPU而言,就需要清楚了明白对应数据的含义

数据包的格式:

对于格式:格式是由个人或其他人定义的,上述格式并不固定

        发送数据包:在发送数据前先要发送包头,之后发送数据,最后发送包尾

接收数据包:每收到一个字节数据,都需要进入一次中断。接收完成之后,就需要退出中断。
每接收到一字节数据都是一个独立的过程

        对于数据包而言,由包头、数据、包尾组成,具有前后关联性。对于数据包的三部分而言,每部分都需要有不同的处理逻辑。
在不同的状态执行不同的操作,同时还需要进行状态的合理转移,称为状态机。在这里使用状态的方法接收一个数据包,状态转移图如上图所示

        每个状态需要使用一个变量标志一下。当S = 0时,判断是否接收到包头,如果接收到包头,将状态变量置1,否则一直等待接收包头;当S = 1时,开始进行接收数据,此时还需要使用一变量记录接收数据的个数,当接收完成后,将状态变量置2,判断是否接收到包尾,如果接收到包尾,将状态变量置0,否则一直等待接收包尾

        使用包头+数据+包尾这种的数据格式,可以预防因数据和包头重复造成的错误

四、串口相关库函数

(1)初始化:USART_Init()

(2)中断配置USART_ITConfig()

(3)发送数据:USART_SendData()

(4)接收数据:USART_ReceiveData()

四、串口收发数据配置

(1)开启串口、GPIO(使用对应通道的引脚)的时钟

        如果选择重映射的方式,先要使能AFIO时钟,并进行重映射配置

        如果重映射的方式,还需要将调式的功能关闭

(2)进行GPIO口的配置

        发数据:复用推挽输出

        收数据:浮空输入或上拉输入

(3)配置串口,完成初始化

	USART_InitTypeDef USART_InitStruct;  //初始化USART
	USART_InitStruct.USART_BaudRate = 9600;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //硬件流控制:失能
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //模式:发送和接收
	USART_InitStruct.USART_Parity = USART_Parity_No;  //奇偶校验
	USART_InitStruct.USART_StopBits = USART_StopBits_1;  //停止位:1位
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;  //字长:8位
	USART_Init(USART1,&USART_InitStruct);

(4)配置串口中断控制

	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //开启接收中断

(5)配置NVIC优先级分组

(6)配置NVIC,完成初始化

(7)使能串口

作者:℡☞小白☜ღ

物联沃分享整理
物联沃-IOTWORD物联网 » STM32通用同步和异步通信技术

发表回复