HAL库STM32串口开启DMA接收数据

STM32CubeMx的配置

此博客仅仅作为记录,这个像是有bug一样,有时候好使,有时候不好,所以趁现在好使赶紧记录一下,很多地方用到串口接收数据,DMA又是一种非常好的接收方式,可以节约CPU的时间,提高利用率,首先是在CubeMX的配置,这个很简单,首先配置成异步收发。这样配置可以接收不固定长度的字符

然后配置DMA接收和发送:

Keil的配置

其余配置都一样,在编译工程里面也需要配置一些东西(Keil工程)

首先就是必须勾选,要不然打印不了数据,使用DMA发送数据的时候,可能printf函数就不好使了,这个需要注意:

代码配置

接下来就是添加代码

先在usart.c文件定义几个变量

复制代码
uint8_t         Rx_Flag = 0;
uint16_t        Rx_Len = 0;
uint8_t         Rx_Buf[Rx_Max] = {0};    

在usart.h文件里面声名一下,防止其他地方调用会报错

复制代码
#define Rx_Max      1024  	 
extern uint8_t		Rx_Flag;  //接收数据标志位
extern uint16_t		Rx_Len;    //DMA接收数据的长度
extern uint8_t		Rx_Buf[Rx_Max];	

先在main函数里面开启DMA接收和开启空闲中断

复制代码
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //开启空闲中断,当时没有数据的时候中断
	HAL_UART_Receive_DMA(&huart1, Rx_Buf, Rx_Max);//开启DMA接收

最后需要在串口中断函数stm32f1xx_it.c操作一些东西,首先在此函数中引用usart.h文件,否则会报错

复制代码
    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);  
	}

在while(1)中的代码操作,就是判断标志位,然后把接收到的数据打印出来

复制代码
		if(Rx_Flag == 1)
		{
			Rx_Flag = 0;
			HAL_UART_Transmit_DMA(&huart1,Rx_Buf,Rx_Len);
		}

结论:接收不固定长度的字符串

相关推荐
三佛科技-134163842121 小时前
智能保温杯方案,保温杯MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
Wave8452 小时前
STM32_标准库转hal库
stm32·单片机·嵌入式硬件
智者知已应修善业3 小时前
【51单片机:两边向中间流水:即两边先点亮然后熄灭,次边的点亮再熄灭,直到最中间的两个点亮再熄灭,然后重复动作。】2023-3-4
c语言·c++·经验分享·笔记·嵌入式硬件·算法·51单片机
嵌入式软硬件攻城狮4 小时前
6.单片机回调函数
单片机·嵌入式硬件
就是蠢啊4 小时前
单片机入门实验——点灯
单片机·嵌入式硬件
@曾记否4 小时前
瑞控FPVF405飞控开发板硬件功能整理
stm32·嵌入式硬件
oshan20125 小时前
小华HC32L136K8TA 单片机LED(三)
单片机·嵌入式硬件
小齐勇闯天涯5 小时前
STM32--PWM原理机制
stm32·单片机·嵌入式硬件
全球通史5 小时前
[特殊字符] RISC-V实战:从0到100+FPS!进迭时空(Spacemit)开发板YOLOv8部署终极指南
嵌入式硬件·yolo·risc-v
brave and determined9 小时前
可编程逻辑器件学习(day22):“让ARM穿上FPGA的马甲“:赛灵思Zynq的命名哲学与技术革命
arm开发·嵌入式硬件·fpga开发·zynq·fpga设计·嵌入式设计·fpga开发流程