A---DMA串口通信

Posted haichuangdianzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A---DMA串口通信相关的知识,希望对你有一定的参考价值。

1、芯片:STM32L031F6
2.、实现DMA串口数据发送和接收

cubeMX配置:
1、芯片选择
在这里插入图片描述
2、根据图中三个红框进行配置,本次实验中使用的USART2。根据硬件设计,电脑与单片机是通过USART2通信,因为UART1以后也会用到,目前先做简单设置。

在这里插入图片描述
3、UART1设置。
在这里插入图片描述
在这里插入图片描述
4、UART2设置。
在这里插入图片描述
在这里插入图片描述由于使用DMA,所以也要进行DMA相关配置。
在这里插入图片描述
5、NVIC配置
在这里插入图片描述
5、时钟配置
在这里插入图片描述
在这里插入图片描述
MDK设置
1、在usart.c文件中添加如下代码

/* USER CODE BEGIN 0 */
uint8_t			Rx_Flag = 0;
uint16_t		Rx_Len = 0;
uint8_t			Rx_Buf[1024] = {0};	
/* USER CODE END 0 */

2、在usart.h文件中添加如下代码

#define Rx_Max 1024  	 
extern uint8_t		Rx_Flag;
extern uint16_t		Rx_Len;
extern uint8_t		Rx_Buf[1024];	

3、在stm32f1xx_it.c文件中添加如下代码

在这里插入图片描述
在这里插入图片描述

#include "usart.h"
 if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET)) 
  {   
	/*清除状态寄存器和串口数据寄存器*/
	__HAL_UART_CLEAR_IDLEFLAG(&huart2); 

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

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

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

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

4、在main.c文件中添加如下代码
在这里插入图片描述

HAL_UART_Receive_DMA(&huart2, Rx_Buf, Rx_Max);  
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);  
if(Rx_Flag)    	// Receive flag
{  
	Rx_Flag=0;	// clean flag
	HAL_UART_Transmit_DMA(&huart2, Rx_Buf, Rx_Len);
} 

以上是关于A---DMA串口通信的主要内容,如果未能解决你的问题,请参考以下文章

ROS串口通信简析(一)——串口发送

51单片机串口通讯

串口通信接收区出现多余的乱码怎么解决

串口通信代码

Arduino和C51之串口通信

51单片机做串口通信接收缓存区没反应