OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4890|回复: 0

分享STM32L011串口空闲中断+DMA【分包接收数据】

[复制链接]

84

主题

558

帖子

0

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2014-9-30
在线时间
136 小时
发表于 2021-5-12 11:28:57 | 显示全部楼层 |阅读模式
分享 STM32L011串口空闲中断+DMA【分包接收数据】
折腾了两天:虽然说是 HAL库 其实有些写法还是不同的这只能:依靠【 悟性 】,现在 执行结果 总算是正确了。



DMA 配置为 Normal 模式 。利用 串口空闲中断 实现 “分帧”
——固定将每包数据的前 8字节 复制到 OutBuf 输出 (后处理)。

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
    uint8_t TmpCnt;
    if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
    {           
      __HAL_DMA_DISABLE(&hdma_usart2_rx);       //关闭DMA_rx
      for (TmpCnt=0;TmpCnt<8;TmpCnt++) OutBuf[TmpCnt] = rx_buffer[TmpCnt];

      rx_len = 32-(__HAL_DMA_GET_COUNTER(&hdma_usart2_rx));
      DMA1_Channel5->CNDTR = 32;                //复位DMA指针(缓冲区长度为32字节)
      __HAL_DMA_ENABLE(&hdma_usart2_rx);        //使能DMA_rx

      __HAL_UART_CLEAR_IT(&huart2,UART_FLAG_IDLE);        //清除串口空闲中断标志位
      __HAL_UART_CLEAR_IDLEFLAG(&huart2);               //清除串口空闲标志位谁对??
      HAL_UART_Receive_DMA(&huart2,rx_buffer,32);       //再次启动接收  
      recv_end_flag = 1;
    }   
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}


反馈.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 07:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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