[应用相关] HAL库开发教程(四)—串口FIFO使用

[复制链接]
2046|11
 楼主| 梅花香自123 发表于 2021-9-28 21:11 | 显示全部楼层 |阅读模式
本文主要介绍STM32_HAL库开发中串口_FIFO的使用。

一、开发步骤
1. Cubemx配置
在左侧引脚配置栏选择目标串口号
在串口模式处配置串口模式为异步通信模式
在串口配置处配置中断使能和串口参数:波特率、数据长度、停止位、发送接收模式等。(注意在GPIO引脚处和硬件引脚进行确认)
82930615314798af59.png

 楼主| 梅花香自123 发表于 2021-9-28 21:12 | 显示全部楼层
2. 中断函数编写
生成KEIL文件后,编写中断响应函数。

  1. void USART2_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART2_IRQn 0 */

  4.   /* USER CODE END USART2_IRQn 0 */
  5.   HAL_UART_IRQHandler(&huart2);
  6.   /* USER CODE BEGIN USART2_IRQn 1 */
  7.   InterRxBufferWrite();
  8.   /* USER CODE END USART2_IRQn 1 */
  9. }
 楼主| 梅花香自123 发表于 2021-9-28 21:14 | 显示全部楼层
3. 功能函数编写
此处使用环形FIFO缓存区对串口数据进行处理,因此编写环形FIFO缓冲区的功能函数
  1. uint8_t InterRxBufferWrite(void)  //串口接收缓冲区写函数
  2. {
  3.   if (InterFifo.RxBufferWptr  ==  (InterFifo.RxBufferRptr - 1))  //串口缓冲区满了
  4.   {
  5.                 return 0;               
  6.   }       
  7.   HAL_UART_Receive_IT(&huart2, &InterFifo.RxBuffer[InterFifo.RxBufferWptr++], 1);       
  8.   InterFifo.RxBufferWptr %= INTER_BUFFER_NUM;//写入一个字节数据到缓冲区中
  9.         return 1;
  10. }

  11. uint8_t InterRxBufferRead(uint8_t* data) //串口接收缓冲区读函数
  12. {
  13.   if (InterFifo.RxBufferRptr == InterFifo.RxBufferWptr)        //串口缓冲区为空
  14.   {
  15.                 return 0;
  16.   }
  17.   *data =  InterFifo.RxBuffer[InterFifo.RxBufferRptr++];        //从缓冲区读取一个字节数据并返回
  18.   InterFifo.RxBufferRptr %= INTER_BUFFER_NUM;       
  19.   return 1;
  20. }

  21. uint8_t InterTxBufferWrite(uint8_t data) //串口发送缓冲区写函数
  22. {
  23.   if(InterFifo.TxBufferWptr == (InterFifo.TxBufferRptr - 1)) //串口缓冲区满了
  24.   {
  25.       return 0;               
  26.   }
  27.   InterFifo.TxBuffer[InterFifo.TxBufferWptr++] = data;                                                                               
  28.   InterFifo.TxBufferWptr %= INTER_BUFFER_NUM; //写入一个字节数据到缓冲区中
  29.   return 1;
  30. }

  31. uint8_t InterTxBufferRead(uint8_t* data) //串口发送缓冲区读函数
  32. {
  33.   if(InterFifo.TxBufferRptr == InterFifo.TxBufferWptr) //串口缓冲区为空
  34.   {
  35.       return 0;
  36.   }
  37.   *data =  InterFifo.TxBuffer[InterFifo.TxBufferRptr++];        //从缓冲区读取一个字节数据并返回
  38.   InterFifo.TxBufferRptr %= INTER_BUFFER_NUM;       
  39.   return 1;
  40. }
 楼主| 梅花香自123 发表于 2021-9-28 21:25 | 显示全部楼层
二、主要接口函数
1. 串口中断函数
void USART2_IRQHandler(void):
如果设置为接收中断,则没收到一个字节出发一次中断。
注意添加使用串口接收中断配置函数:__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
 楼主| 梅花香自123 发表于 2021-9-28 21:27 | 显示全部楼层
2. HAL库串口发送函数
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
参数:串口名、串口数据地址、串口数据长度、超时时间
将指定地址和长度和数据通过串口进行发送
 楼主| 梅花香自123 发表于 2021-9-28 21:27 | 显示全部楼层
3.HAL库串口接收函数
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL库串口接收函数
参数:串口名、串口数据地址、串口数据长度
接收指定长度的数据到指定数据地址。
 楼主| 梅花香自123 发表于 2021-9-28 21:30 | 显示全部楼层
总结
本项目中串口的使用主要可以归纳为:
1.串口环形FIFO缓冲区功能函数编写
2.串口FIFO使用至串口中断内
3.根据串口中断使用灵活使用串口
heimaojingzhang 发表于 2021-10-11 13:33 | 显示全部楼层
为什么不是堆栈呢
tpgf 发表于 2021-10-11 13:35 | 显示全部楼层
串口都是fifo吗
guanjiaer 发表于 2021-10-11 13:46 | 显示全部楼层
这个是自己自主定义的吧
keaibukelian 发表于 2021-10-11 14:51 | 显示全部楼层
在头文件里有详细的参数解析
labasi 发表于 2021-10-11 15:05 | 显示全部楼层
我一般都是用的默认的配置 呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1216

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部