请选择 进入手机版 | 继续访问电脑版
查看: 340|回复: 3

[原创] 一种基于HAL+UART+DMA环形队列接收数据实现方法

[复制链接]

该用户从未签到

8

主题

105

帖子

28

蝴蝶豆

高级会员

最后登录
2019-6-27
发表于 2019-6-13 10:11:00 | 显示全部楼层 |阅读模式
本帖最后由 songshiqun2010 于 2019-6-13 12:01 编辑

复制代码
1.空闲中断回调函数定义 如下
  1. void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)
  2. {
  3.   if(huart->Instance == USART1){
  4.     if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) ){
  5.       uint16_t rx_buffer_len,i;
  6.       __HAL_UART_CLEAR_IDLEFLAG(huart);
  7.       HAL_UART_DMAStop(huart);
  8.       rx_buffer_len = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx);
  9.       //TO DO:
  10.       //将数据(huart->pRxBuffPtr 中 rx_buffer_len个字节)压入环形队列
  11.       //这里未做环形队列实现,请自行填充
  12.       HAL_UART_Receive_DMA(huart,huart->pRxBuffPtr,huart->RxXferSize);
  13.     }
  14.   }
  15. }
复制代码

2.回调函数调用方式如下
  1. /**
  2.   * @brief This function handles USART1 global interrupt.
  3.   */
  4. void USART1_IRQHandler(void)
  5. {
  6.   /* USER CODE BEGIN USART1_IRQn 0 */
  7.   extern void HAL_UART_IdleCallback(UART_HandleTypeDef *huart);
  8.   HAL_UART_IdleCallback(&huart1);
  9.   /* USER CODE END USART1_IRQn 0 */
  10.   HAL_UART_IRQHandler(&huart1);
  11.   /* USER CODE BEGIN USART1_IRQn 1 */

  12.   /* USER CODE END USART1_IRQn 1 */
  13. }
复制代码
3.初始化如下

  1. uint8_t rx_buffer[256];

  2.   HAL_UART_Receive_DMA(&huart1,rx_buffer,sizeof(rx_buffer));
  3.   __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
复制代码
4.环形队列keil5 pack ctb.ringbuffer.1.0.0.zip (3.61 KB, 下载次数: 17, 售价: 1 ST金币)
回复

使用道具 举报

该用户从未签到

61

主题

2074

帖子

31

蝴蝶豆

版主

最后登录
2019-6-27
发表于 2019-6-13 13:56:06 | 显示全部楼层
感谢分享      
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

492

帖子

33

蝴蝶豆

金牌会员

最后登录
2019-6-27
发表于 2019-6-13 17:13:29 | 显示全部楼层
Ringbufer 也可以直接生成 , 真是越來越方便了
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

28

帖子

0

蝴蝶豆

初级会员

最后登录
2019-6-27
发表于 2019-6-17 08:05:45 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2019-6-27 17:15 , Processed in 0.135290 second(s), 18 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表