串口通信协议

串口通信协议

目录

什么是串口通信协议

嵌入式开发中,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使用方式是一样的,都使用异步模式。

串口通信协议有什么特点

  • 只需要两根数据线
  • 全双工

它的主要协议内容有哪些

  • image-20220301191420988
  • 起始位
  • 数据位
  • 奇偶校验位
  • 停止位
  • 空闲位或起始位
  • 波特率

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中止接收完整的回调函数。
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值