STM32CubeMx开发之路—4采用DMA方式收发数据

STM32CubeMx开发之路—4采用DMA方式收发数据


运行环境

  • Windows10
  • STM32CubeMX___Version 5.0.0
  • Keil5(MDK5)___Version 5.15

简介

本例程主要讲解如何通过串口发送数据和重定向printf


STM32CubeMx基本配置

基础配置过程请参考 STM32CubeMx(Keil5)开发之路—配置第一个项目


STM32CubeMx USART1配置


1——点击USART1进行设置
2——模式选择Asynchronous异步传输
3——可以看到右边自动出现了Tx和Rx
4——可以自行设置波特率,停止位,校验位等参数


1——选择DMA设置
2——添加DMA
3——添加DMA的Tx和Rx通道


1——选择NVIC设置
2——打开USART1全局中断
3——随便设置一个优先级


代码修改


  • 在usart.c文件中添加如下代码,定义全局变量
UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart1_tx;

  • 在usart.h文件中添加如下代码,声明全局变量
#define Rx_Max 1024  	 
extern uint8_t		Rx_Flag;
extern uint16_t		Rx_Len;
extern uint8_t		Rx_Buf[Rx_Max];	

  • 1——在stm32f1xx_it.c文件中添加对usart.h的声明
  • 2——在stm32f1xx_it.c文件中添加如下代码,对中断的处理
	uint32_t temp;
	if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))  
	{   
		/*清除状态寄存器和串口数据寄存器*/
		__HAL_UART_CLEAR_IDLEFLAG(&huart1); 

		/*失能DMA接收*/
		HAL_UART_DMAStop(&huart1);  

		/*读取接收长度,总大小-剩余大小*/
		temp = huart1.hdmarx->Instance->CNDTR; 
		Rx_Len = Rx_Max - temp; 

		/*接收标志位置1*/
		Rx_Flag=1;  

		/*使能接收DMA接收*/
		HAL_UART_Receive_DMA(&huart1,Rx_Buf,Rx_Max);  
	}

  • 在main.c文件中添加如下代码
	/*Enable DMA IRQ*/
	HAL_UART_Receive_DMA(&huart1, Rx_Buf, Rx_Max);  
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); 
	if(Rx_Flag)    	// Receive flag
	{  
		Rx_Flag=0;	// clean flag
		HAL_UART_Transmit_DMA(&huart1, Rx_Buf, Rx_Len);
	} 

  • 烧录代码后打开出口调试助手
  • 正确的话会看到如下输出

小结

DMA常用场合

  • 对接收和发送数据量比较大的时候,减轻CPU工作
  • 对嵌入式系统实时性要求比较高的时候建议使用

本节主要讲如何采用DMA的方式进行串口数据的接收和发送,使用DMA主要就是减轻CPU的工作,让CPU有更多的时间去处理其他的工作。


发布了45 篇原创文章 · 获赞 101 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_41294615/article/details/86218556