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)使能串口
作者:℡☞小白☜ღ