STM32CubeMX串口接收数据(DMA方式,HAL库)

使用DMA方式可以减轻CPU负担,此例子相关配置可以参考

STM32CubeMX串口接收数据(中断方式,HAL库)

(1)设置USART1中断,NVIC配置如下图
这里写图片描述

(2)设置USART1的DMA,如下图
这里写图片描述

注意:要将RX的模式设置为circular ,否则只能接收一次,如果这里不作设置,网上也有其他方法介绍代码实现多次接收的,但既然用到了STM32CubeMX就尽量发挥最大作用吧!

这里写图片描述
(3)生成项目工程

(4)在main.c里设置变量以及启动DMA接收

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t aRxBuffer1[1];      //接收缓存
uint8_t aTxBuffer[] = "*********SENDING DATA USING USART1 with DMA***********\r\n";

/* USER CODE END PV */

 /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_UART_Receive_DMA(&huart1,aRxBuffer1,1);// 启动DMA接收
  HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer));// DMA发生数据
  while (1)
  {
  }

  /* USER CODE END WHILE */编写USART1接收中断处理函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_DMA(&huart1,aRxBuffer1,1); // DM2发送出去
// HAL_UART_Receive_DMA(&huart1,aRxBuffer1,1); // 重新DMA接收
}
“`
注意这里和只采用中断方式的不同,配置了循环模式后可以不用自己手动再次启动DMA接收

linux下(windows下是一样的)使用串口助手cutecom效果如下:
这里写图片描述

不足之处:
如果一开始不使能串口中断,那么DMA接收完成后就不会进入HAL_UART_RxCpltCallback函数,虽然有单独的DMA中断处理函数DMA2_Stream2_IRQHandlerDMA2_Stream7_IRQHandler ,简单试了一下还未实现预定效果,有待改进,也请同道小伙伴告知~^_^

  • 19
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值