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——可以自行设置波特率,停止位,校验位等参数

STM32CubeMx开发之路—4采用DMA方式收发数据_第1张图片

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

STM32CubeMx开发之路—4采用DMA方式收发数据_第2张图片

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

STM32CubeMx开发之路—4采用DMA方式收发数据_第3张图片

代码修改


  • 在usart.c文件中添加如下代码,定义全局变量
uint8_t			Rx_Flag = 0;
uint16_t		Rx_Len = 0;
uint8_t			Rx_Buf[Rx_Max] = {0};	
STM32CubeMx开发之路—4采用DMA方式收发数据_第4张图片

  • 在usart.h文件中添加如下代码,声明全局变量
#define Rx_Max 1024  	 
extern uint8_t		Rx_Flag;
extern uint16_t		Rx_Len;
extern uint8_t		Rx_Buf[Rx_Max];	
STM32CubeMx开发之路—4采用DMA方式收发数据_第5张图片

  • 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);  
	}
STM32CubeMx开发之路—4采用DMA方式收发数据_第6张图片
STM32CubeMx开发之路—4采用DMA方式收发数据_第7张图片

  • 在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);
	} 
STM32CubeMx开发之路—4采用DMA方式收发数据_第8张图片

  • 烧录代码后打开出口调试助手
  • 正确的话会看到如下输出
STM32CubeMx开发之路—4采用DMA方式收发数据_第9张图片

小结

DMA常用场合

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

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


你可能感兴趣的:(STM32CubeMX开发之路)