单片机
返回首页

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

2018-06-19 来源:eefocus

使用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_IRQHandler 和 DMA2_Stream7_IRQHandler ,简单试了一下还未实现预定效果,有待改进,也请同道小伙伴告知


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 光控音效发生器电路

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 基于IC555的可变PWM振荡器电路

  • 分享一个电网倾角计电路

  • 电谐波图形均衡器示意图

    相关电子头条文章