1、串口介绍
1.1、 数据通信概念
在单片机中我们常用的通信方式有 USART、IIC、SPI、CAN、USB 等;
1、数据通信方式
根据数据通信方式可分为串行通信和并行通信两种,如下图:
串行通信基本特征是数据逐位顺序依次传输,优点:传输线少成本低,抗干扰能力强可用于远距离传输,缺点传输速率低
并行通信特征是数据各位可通过多条线同时传输,优点传输速率高,缺点是成本高,抗干扰能力差;
2、数据传输方向
按照数据传输方向可分为全双工、半双工和单工通信,如下图所示:
3、数据同步方式
根据数据同步方式可分为同步通信和异步通信,如下图所示:
同步通信要求通信双方共用同一时钟信号,在总线上保持统一的时序和周期完成信息传输。
异步通信不需要时钟信号,而是在数据信号中加入开始位和停止位等一些同步信号,一般通信双方还会约定传输速率。
4、通信速率
在数字通信系统中,通信速率(传输速率)指数据在信道中传输的速度,分为两种:传信率和传码率
传信率:每秒钟传输的信息量,即每秒钟传输的二进制位数,单位为 bit/s(即比特每秒),因而又称为比特率
传码率:每秒钟传输的码元个数,单位为 Baud(即波特每秒),因而又称为波特率;
码元是信号被调制后的概念,每个码元可以表示一定 bit 的数据信息量。例如子啊 TTL 电平标准的通信中,0V 表示逻辑 0
5V 表示逻辑 1,这时码元就只可以表示两种状态。若在其它通信标准电平中电平信号 0V、2V、4V 和 6V 分别表示二进制
00、01、10、11,这时候码元就可以表示四种状态。
比特率和波特率的关系可以用以下关系式表示:
比特率 = 波特率 * log2 M
M 表示码元承载的信息量,可以理解 M 为码元的进制数
1.2、串口通信协议简介
串口按位(bit)发送和接收字节。串口通信协议是指规定了数据包的内容,内容包含了起始位、数据区、校验位及停止位,
在串口通信中,常用的协议包括 RS-232、RS-422 和 RS-482 等;如下图所示:
1、波特率
UART 是串口异步通信,不需要时钟信号,只需约定好两个设备之间的波特率,常见的波特率是 4800、9600、115200 等;
2、数据帧格式
串口通信的数据帧包括起始位、停止位、有效数据位以及校验位;
起始位:一般由一个逻辑 0 的数据位表示
有效数据位:起始位之后就是数据位,有效数据位一般会被约定为 5、6、7 或者 8 个位长,一般是低位(LSB)在前高位(MSB) 在后
校验位:一般用来判断接受的数据有无错误,校验方法有:奇校验、偶校验、0 校验、1 校验及无校验;
奇校验:指有效数据的和与校验位中"1"的个数为奇数,如一个 8 位长有效数据为 11001100,共 4 个"1",为达到奇校验效果
校验位则为"1";
偶校验:与上述奇校验要求相反,要求帧数据与校验位中"1"的个数为偶数;如数据帧为 11001100,则此时偶校验位为"0"
0 校验:指不管数据帧的内容,校验位总为"0"
1 校验:即校验位总为"1"
无校验:指数据帧中不包含校验位,一般不使用
停止位:一般通信双方需约定 0.5、1、1.5 或 2 个逻辑 1 的数据位表示;
1.3、STM32H5 串口外设介绍
STM32H562 的最多可提供 6 路串口(5 路普通串口和 1 路低功耗串口),支持 8/16 倍过采样、支持自动波特率检测、支持 Modbus
通信、支持同步单线通信和半双工单线通讯、支持 LIN、支持调制解调操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 功能;
USART 框图如下所示:
1、时钟与波特率
该部分主要功能是为 USART 提供时钟以及配置波特率;
如上图,我们可以看到两个时钟域,usart_pclk 时钟域及 usart_ker_ck 内核时钟域。
usart_pclk 是外设总线时钟;
usart_ker_ck 是 USART 时钟源,独立于 usart_pclk,由 RCC 提供;
波特率,即每秒钟传输的码元个数,波特率计算公式分为 16 倍过采样和 8 倍过采样;
16 倍过采样下,波特率计算公式如下:
baud = usart_ker_ckpres/USARTDIV
8 倍过采样下,波特率计算公式如下:
baud = (2*usart_ker_ckpres)/USARTDIV
2、收发数据
USART 双向通信有两个引脚 TX/RX;
USART_TDR 是 USART 发送数据寄存器,USART_RDTR 是 USART 接收数据寄存器,这两个寄存器都是低 9 位有效;
可通过 USART_CR1 寄存器的 M 位设置字长:
7 位字符长度:M[1:0] = “10”
8 位字符长度:M[1:0] = “00”
9 位字符长度:M[1:0] = “01”
基本都是使用 8 位数据字长;
3、控制寄存器
可以通过控制寄存器控制 USART 数据的发送、数据接收、各种通信模式的设置、中断、DMA 模式及唤醒单元等;
4、DMA 和中断功能
USART 支持 DMA 传输,可实现高速数据传输;
5、USART 信号引脚
在 RS232 硬件流控制模式下需要以下两个引脚:
CTS(清除以发送):发送器在发送下一帧数据之前会检测 CTS 引脚,若为低电平,表示可发送数据;若为高电平则在发送完当前数据之后停止发送
RTS(请求以发送):若为低电平,则该信号用于指示 USART 已准备好接收数据。
在 RS485 硬件控制模式下需要下面该引脚:
DE(驱动器使能):该信号用于激活外部收发器的发送模式。
在同步主/从模式和智能卡模式下需要以下引脚:
CK:该引脚在同步主模式和智能卡模式下用作时钟输出,在同步从模式下用作时钟输入。
NSS:该引脚在同步从模式下用作从器件选择输入。
2、代码详解
代码如下:
UART_HandleTypeDef UART1_Handler;
DMA_HandleTypeDef UART1TxDMA_Handler;
DMA_HandleTypeDef UART1RxDMA_Handler;
//发送接收缓冲区
uint8_t rx_buffer[512];
uint8_t tx_buffer[256];
volatile uint8_t rxComplete = 0;
volatile uint16_t rxlen = 0;
volatile uint8_t dma_tx_busy = 0;
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance == USART1)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_Initure.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_Initure.Mode = GPIO_MODE_AF_PP;
GPIO_Initure.Pull = GPIO_NOPULL;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_Initure.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA,