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);
		}

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

相关推荐
东小东博客1 小时前
STM32 WS2812 Proteus仿真 汉字显示 SPI控制
stm32·嵌入式硬件·proteus
czhaii6 小时前
STM32中的位带(bit-band)操作
单片机
嵌入式-老费7 小时前
esp开发与应用(DS18B20温度传感器)
单片机·嵌入式硬件
szxinmai主板定制专家8 小时前
基于ZYNQ MPSOC图像采集与压缩系统总体设计方案
linux·arm开发·人工智能·嵌入式硬件·fpga开发
Jonathan_LF8 小时前
DMA使用心得-STM32
stm32·单片机·嵌入式硬件
国科安芯9 小时前
ASM232S抗辐照RS-232收发器的技术架构与空间环境适应性研究
单片机·嵌入式硬件·安全·架构·安全性测试
嵌入式小站10 小时前
STM32 零基础可移植教程 07:USART 串口打印,从 CubeMX 配置到 printf 输出
stm32·单片机·嵌入式硬件
都在酒里10 小时前
STM32矩阵按键详解——4×4行列扫描与非阻塞消抖(硬件总结六)
stm32·嵌入式硬件·矩阵
都在酒里11 小时前
STM32有限状态机(FSM)详解,综合应用总结(二)
stm32·单片机·嵌入式硬件·状态机
嵌入式-老费11 小时前
esp开发与应用(继电器的使用)
单片机·嵌入式硬件