STM32—串⼝通讯详解
串⼝通讯⽬录
串⼝通讯(Serial Communication)是⼀种设备间⾮常常⽤的串⾏通讯⽅式,因为它简单便捷,因此⼤部分电⼦设备都⽀持该通讯⽅式,其通讯协议可分层为协议层和物理层。物理层规定通信协议中具有机械、电⼦功能的特性,从⽽确保原始数据在物理媒体的传播;协议层主要规定通讯逻辑,统⼀双⽅的数据打包、解包标准。通俗的讲物理层规定我们⽤嘴巴还是肢体交流,协议层规定我们⽤中⽂还是英⽂交流。下⾯分析⼀下串⼝通讯协议的物理层和协议层。
物理层
1.通讯结构
串⼝通讯的物理层的主要标准是RS-232标准,其规定了信号的⽤途、通讯接⼝及信号的电平标准,其通讯结构如下:
在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平标准传输的,⽽且TTL电平需要经过电平转换芯⽚才能转化为RS-232电平,RS-232电平转TTL电平也是如此。
2.电平标准
根据使⽤的电平标准不同,串⼝通讯可分为 RS-232标准 及TTL标准,具体标准如下:
在电⼦电路中常使⽤TTL的电平标准,但其抗⼲扰能⼒较弱,为了增加串⼝的通讯距离及抗⼲扰能⼒,使⽤RS-232电平标准在设备之间传输信息,经常使⽤MA3232芯⽚对TTL电平及RS-232电平进⾏相互转换。
协议层
1.数据包
串⼝通讯的数据包由发送设备通过⾃⾝的TXD接⼝传输到接收设备得RXD接⼝,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停⽌位,通讯的双⽅必须将数据包的格式约定⼀致才能正常收发数据。
2.波特率
由于异步通信中没有时钟信号,所以接收双⽅要约定好波特率,即每秒传输的码元个数,以便对信号进⾏解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串⼝初始化结构体来实现。
3.起始和停⽌信号
数据包的⾸尾分别是起始位和停⽌位,数据包的起始信号由⼀个逻辑0的数据位表⽰,停⽌位信号可由0.5、1、1.5、2个逻辑1的数据位表⽰,双⽅需约定⼀致。STM32中起始和停⽌信号的设置也是通过串⼝初始化结构体来实现。
4.有效数据
有效数据规定了主题数据的长度,⼀般为8或9位,其在STM32中也是通过串⼝初始化结构体来实现的。
5.数据校验
在有效数据之后,有⼀个可选的数据校验位。由于数据通信相对更容易受到外部⼲扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验⽅法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及⽆(noparity)。这些也都可以在串⼝初始化结构体中实现的。
USART简介
USART(通⽤同步异步收发器)是⼀个串⾏通信设备,可以灵活地与外部设备进⾏全双⼯数据交换。有别于 USART 还有⼀个UART,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时⽤的串⼝通信基本都是 UART。USART 在 STM32 应⽤最多莫过于“打印”程序信息,⼀般在硬件设计时都会预留⼀USART 通信接⼝连接电脑,
⽤于在调试程序是可以把⼀些调试信息“打印”在电脑端的串⼝调试助⼿⼯具上,从⽽了解程序运⾏是否正确、如果出错哪具体哪⾥出错等等。
STM32中⼀共有5个USART,如⽰:
USART的USB转串⼝原理图如下:
USART1的发送和接收端⼝是事先连接好的,如果要使⽤其他USART只需要将相应的发送接收端⼝按图连接好即可。USART有多个中断请求事件:
开发板与上位机的连接
开发板与上位机之间通过USB线连接,所以在上位机上要配置⼀个USB转串⼝ 的驱动,以便把USB传输过来的电平转换为TTL电平,TTL 电平才能与串⼝调试助⼿建⽴联系。⼀般使⽤CH341驱动作为win10下的USB转串⼝,驱动安装成功的情况下接⼊USB会在计算机的设备管理器的端⼝中发现串⼝:
(win7系统⼀般选择CH340作为USB转串⼝驱动。)
代码讲解:
固件库编程的⼀⼤好处就是我们可以根据固件库函数来学习外设的相关知识,⽽且固件库函数的编写都是建⽴在对底层寄存器操作上的,所以通过讲解代码可以更好理解串⼝通讯相关知识。
⼀.初始化结构体
typedef struct {
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; // 字长
uint16_t USART_StopBits; // 停⽌位
uint16_t USART_Parity; // 校验位
uint16_t USART_Mode; // USART 模式
uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
USART初始化结构体中的相应变量都对应着数据包中的相对内容。
⼆.NVIC配置中断优先级
我们在串⼝接收信息时采⽤了触发中断事件,所以要配置⼀下串⼝中断的优先级:
NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 嵌套向量中断控制器组选择 */重定向过多是什么意思
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 配置USART为中断源 */
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
/
* 抢断优先级*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* ⼦优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中断 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/* 初始化配置NVIC */
NVIC_Init(&NVIC_InitStructure);
}
中断相关的知识之前详细讲过,此处就不再累赘讲述。
三.USART配置函数讲解
USART配置函数的主要作⽤是打开串⼝与相应的GPIO引脚,配置好相应串⼝信息与GPIO引脚的⼯作模式,以便信息的传输与接收。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。