串口通信协议
目录
文章目录
什么是串口通信协议
嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。
大部分的开发板存在同时存在UART和USART(Universal Synchronous Asynchronous Receiver and Transmitter通用同步异步收发器)串口,USART相当于UART的升级版,USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。
串口通信协议有什么特点
- 只需要两根数据线
- 全双工
它的主要协议内容有哪些
-
- 起始位
- 数据位
- 奇偶校验位
- 停止位
- 空闲位或起始位
- 波特率
STM32是如果实现串口通信的
- 硬件
- RX
- TX
- Step
- 发送或接收前保持空闲线路
- 起始位
- 数据(字长 8 位或 9 位),最低有效位在前
- 用于指示帧传输已完成的 0.5 个、1 个、1.5 个、2 个停止位
- 该接口使用小数波特率发生器 - 带 12 位尾数和 4 位小数
- 状态寄存器 (USART_SR)
- 数据寄存器 (USART_DR)
- 波特率寄存器 (USART_BRR) - 12 位尾数和 4 位小数。
- 智能卡模式下的保护时间寄存器 (USART_GTPR)。
- 在同步模式下连接时需要以下引脚
- SCLK:发送器时钟输出。该引脚用于输出发送器数据时钟,以便按照 SPI 主模式进行同步发送(起始位和结束位上无时钟脉冲,可通过软件向最后一个数据位发送时钟脉冲)。RX 上可同步接收并行数据。这一点可用于控制带移位寄存器的外设(如 LCD 驱动器)。时钟相位和极性可通过软件编程。
- 在智能卡模式下,SCLK 可向智能卡提供时钟。在硬件流控制模式下需要以下引脚:
- nCTS:“清除以发送”用于在当前传输结束时阻止数据发送(高电平时)
- nRTS:“请求以发送”用于指示 USART 已准备好接收数据(低电平时)
- 工作原理
- FIFO
- UART的使能和BUSY标志位
- 中断控制
STM32CubeMX应该如何配置串口通信协议
- 设置RCC、时钟树
- 配置串口参数
HAL库有哪些串口通信相关的主要函数
-
初始化、还原初始化函数
/* Initialization/de-initialization functions **********************************/ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart); //根据UART_InitTypeDef中指定的参数初始化UART模式,并创建关联的句柄。 HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart); //根据UART_InitTypeDef中指定的参数初始化半双工模式并创建关联句柄。 HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength); //根据UART_InitTypeDef中指定的参数初始化LIN模式,并创建关联的句柄。 HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod); //根据UART_InitTypeDef中指定的参数初始化多处理器模式,并创建关联的句柄。 HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart); //非初始化UART外围设备。 void HAL_UART_MspInit(UART_HandleTypeDef *huart); //弱函数UART MSP初始化 void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); //弱函数UART MSP初始化还原
-
IO口操作函数
/* IO operation functions *******************************************************/ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);//以阻塞模式发送大量数据。 HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); //在阻塞模式下接收大量数据。 HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); //以非阻塞模式发送大量数据。 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); //在非阻塞模式下接收大量数据。 HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); //以非阻塞模式发送大量数据。 HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); //在非阻塞模式下接收大量数据。 HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart); //暂停DMA传输。 HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart); //恢复DMA传输。 HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart); //停止DMA传输。
-
传输中断函数
/* Transfer Abort functions */ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart); //中止正在进行的传输(阻塞模式)。 HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart); //中止正在进行的传输传输(阻塞模式)。 HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart); //中止正在进行的接收传输(阻塞模式)。 HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart); //中止正在进行的传输(中断模式)。 HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart); //中止正在进行的传输(中断模式)。 HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart); //中止正在进行的接收传输(中断模式)。
-
中断处理及回调函数
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //函数处理UART中断请求。 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //Tx传输完成回调函数。 void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //Tx半传输完成回调函数。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //Rx传输完成回调函数。 void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); //Rx完成一半传输回调函数。 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart); //UART错误回调函数。 void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart); //UART中止完成回调函数。 void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart); //UART中止完成回调函数。 void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); //UART中止接收完整的回调函数。