STM32串口通信——DMA中断 (简单配置即可直接使用)

这篇具有很好参考价值的文章主要介绍了STM32串口通信——DMA中断 (简单配置即可直接使用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

各函数的功能及使用方法

1.串口调试输出

2. 串口调试输出 接口设置   

3. 串口格式化输出

4.用户串口DMA中断初始化函数

使用方法

1.找到系统的串口初始化函数

2.在结束位置添加我们的串口初始化函数

 5.用户中断回调函数

使用方法

1.找到系统的中断服务.c文件 打开

 2.找到串口中断服务函数 在结束位置添加我们的中断服务函数

6.校验字符串函数

CubeMx 串口配置

1.配置串口基本参数

2.开启串口DMA

 3.打开串口中断

 4.在NVIC中配置中断优先级​编辑

实际应用

源代码 "usart_dma.c"

源代码 "usart_dma.h"


话不多说,直接上教程

文章末尾附源代码


 这是 usart_dma.h 文件,里面都是配置所需功能的宏定义及串口相关的初始化函数和功能函数

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

配置的方法都·已经注释说明了,只需要启用需要使用的串口或者禁用不需要使用的串口即可

usart_dma.c 文件不用管 只需要配置该头文件就能使用了


各函数的功能及使用方法


1.串口调试输出

void debug(char* p, ...);	//串口调试输出

2. 串口调试输出 接口设置   

#define PRINTF	1			//   1: 启用串口1调试输出		 2: 启用串口2调试输出	
                            //   3: 启用串口3调试输出      4: 启用串口4调试输出		
                            //   5: 启用串口5调试输出	     其他:禁用串口调试输出

3. 串口格式化输出

/******************************************************************************
	*方法名称: void User_Printf(UART_HandleTypeDef *huart,char *p,...)
	*功能:     使用指定的串口格式化输出
	*参数:     * huart :用来输出数据的串口句柄
			    * p, ...:需要输出的数据
	*返回:		    无
	*说明:			无
*******************************************************************************/
void User_Printf(UART_HandleTypeDef *huart,char *p,...);		//串口格式化输出

4.用户串口DMA中断初始化函数

/******************************************************************************
	*方法名称:	void User_USART_UART_Init(UART_HandleTypeDef huart);
	*功能:     串口初始化输出
	*参数:     串口对应的 huart 句柄

	*返回:		无
	*说明:			用户串口DMA接收模式初始化函数
					需在系统串口初始化函数 MX_USARTx_UART_Init(void) 结束时调用
*******************************************************************************/
void User_USART_UART_Init(UART_HandleTypeDef huart); 
// 用户 串口DMA接收模式初始化函数需在 系统初始化函数 MX_USARTX_UART_Init(void) 函数结束时调用

使用方法

1.找到系统的串口初始化函数

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

2.在结束位置添加我们的串口初始化函数

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

 我这是在函数内部调用,你们也可在main函数中直接调用,只需保证在系统初始化函数后面就行


 5.用户中断回调函数

/******************************************************************************
	*方法名称: void User_UART_RxCpltCallback(UART_HandleTypeDef *huart)
	*功能:     串口回调函数  重新开启串口DMA接收
	*参数:     *huart: 串口对应的 huart 句柄

	*返回:		无
	*说明:			用户串口中断回调函数
					需在系统中断函数 USARTx_IRQHandler() 结束时调用
*******************************************************************************/
void User_UART_RxCpltCallback(UART_HandleTypeDef* huart); 
//用户 串口中断回调函数   需在系统中断回调函数 USARTx_IRQHandler() 函数结束时调用

使用方法

1.找到系统的中断服务.c文件 打开

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

 2.找到串口中断服务函数 在结束位置添加我们的中断服务函数

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件


6.校验字符串函数

/******************************************************************************
	*方法名称: unsigned char hand(char* rec_data,char *ptr)
	*功能:     校验字符串 rec_data 是否包含字符串 ptr
	*参数:     rec_data :需要校验的字符串
			    ptr		 :需要包含的字符串
	*返回:		  校验结果 1:包含  0:不包含
	*说明:			无
*******************************************************************************/
unsigned char hand(char* rec_data,char *ptr);	
//校验字符串 rec_data 是否包含字符串 ptr    校验结果 1:包含  0:不包含

CubeMx 串口配置

1.配置串口基本参数

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

2.开启串口DMA

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

 stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

 3.打开串口中断

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件

 4.在NVIC中配置中断优先级stm32 串口dma,STM32,stm32,单片机,嵌入式硬件


实际应用

void usart3(void)
{
	/****************************************  从这里添加串口3功能代码 ****************************************/
	if ( (USART_RX_STA & ~(0x0001<<2)) != 0)		//串口3接收到数据
	{
		USART_RX_STA &= ~(0x0001<<2);	//串口3清标志位
		if (hand((char *)u3NewBuffer, "QRcode"))	//串口收到的数据是否包含 "QRcode"
		{
			destination=My_Atoi((char *)u3NewBuffer);	//如果包含则执行这条代码
		}
		User_Printf(&huart1, "usart3:%s \n  ", u3NewBuffer);	//使用串口1发送串口3接收到的数据
		memset(u3NewBuffer, '\0', strlen((char *)u3NewBuffer)); // 清除串口3缓存数据
	}
}

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件


源代码 "usart_dma.c"

/**
  ******************************************************************************
  * @file    usart_dma.c
  * @brief   This file provides code for the configuration
  *          of the USART_DMA instances.
  ******************************************************************************
  */
  /* Includes ------------------------------------------------------------------*/
#include "usart_dma.h"

#include <stdarg.h>		  //  标准头文件
#include <stdio.h>
#include <string.h>


uint16_t USART_RX_STA;//串口接收状态标记

#if USART_DMA1
		unsigned char u1NewBuffer[USART1_REC_LEN];			//串口1接收缓存
#endif


#if USART_DMA2
		unsigned char u2NewBuffer[USART2_REC_LEN];			//串口2接收缓存
#endif


#if USART_DMA3
		unsigned char u3NewBuffer[USART3_REC_LEN];			//串口3接收缓存
#endif

#if USART_DMA4
		unsigned char u4NewBuffer[USART4_REC_LEN];			//串口4接收缓存
#endif

#if USART_DMA5
		unsigned char u5NewBuffer[USART5_REC_LEN];			//串口5接收缓存
#endif

void debug(char* p, ...)
{

	char temp[64];		//格式化字符串缓存

	/*  格式化数据  */
	va_list ap;
	va_start(ap, p);
	vsprintf(temp, p, ap);
	va_end(ap);

	//  信息输出接口
#if PRINTF == 1	&& USART_DMA1
	HAL_UART_Transmit(&huart1, (uint8_t*)temp, strlen(temp), 200);
#endif

#if PRINTF == 2	&& USART_DMA2
	HAL_UART_Transmit(&huart2, (uint8_t*)temp, strlen(temp), 200);
#endif

#if PRINTF == 3	&& USART_DMA3
	HAL_UART_Transmit(&huart3, (uint8_t*)temp, strlen(temp), 200);
#endif

#if PRINTF == 4	&& USART_DMA4
	HAL_UART_Transmit(&huart4, (uint8_t*)temp, strlen(temp), 200);
#endif

#if PRINTF == 5	&& USART_DMA5
	HAL_UART_Transmit(&huart5, (uint8_t*)temp, strlen(temp), 200);
#endif
}


/******************************************************************************
	*方法名称: void User_Printf(UART_HandleTypeDef *huart,char *p,...)
	*功能:     使用指定的串口格式化输出
	*参数:     * huart :用来输出数据的串口句柄
			    * p, ...:需要输出的数据
	*返回:		    无
	*说明:			无
*******************************************************************************/
void User_Printf(UART_HandleTypeDef* huart, char* p, ...)
{
	char temp[64];		//格式化字符串缓存
	
	/*  格式化数据  */
	va_list ap;
	va_start(ap, p);
	vsprintf(temp, p, ap);
	va_end(ap);
#if USART_DMA1
	if (huart->Instance == USART1)
	{
		HAL_UART_Transmit(&huart1, (uint8_t*)temp, strlen(temp), 200);	// 串口1格式化输出
	}
#endif

#if USART_DMA2
	if (huart->Instance == USART2)
	{
		HAL_UART_Transmit(&huart2, (uint8_t*)temp, strlen(temp), 200);	// 串口2格式化输出
	}
#endif

#if USART_DMA3
	if (huart->Instance == USART3)
	{
		HAL_UART_Transmit(&huart3, (uint8_t*)temp, strlen(temp), 200);	// 串口3格式化输出
	}
#endif

#if USART_DMA4
	if (huart->Instance == USART4)
	{
		HAL_UART_Transmit(&huart4, (uint8_t*)temp, strlen(temp), 200);	// 串口4格式化输出
	}
#endif

#if USART_DMA5
	if (huart->Instance == USART5)
	{
		HAL_UART_Transmit(&huart5, (uint8_t*)temp, strlen(temp), 200);	// 串口5格式化输出
	}
#endif
}


/******************************************************************************
	*方法名称: unsigned char hand(char* rec_data,char *ptr)
	*功能:     校验字符串 rec_data 是否包含字符串 ptr
	*参数:     rec_data :需要校验的字符串
			    ptr		 :需要包含的字符串
	*返回:		  校验结果 1:包含  0:不包含
	*说明:			无
*******************************************************************************/
unsigned char hand(char* rec_data, char* ptr)
{
	if (strstr(rec_data, ptr) != NULL)
		return 1;
	else
		return 0;
}

/******************************************************************************
	*方法名称:	void User_USART_UART_Init(UART_HandleTypeDef huart);
	*功能:     串口初始化输出
	*参数:     串口对应的 huart 句柄

	*返回:		无
	*说明:			串口DMA接收模式初始化函数
					需在 MX_USARTx_UART_Init(void) 函数结束时调用
*******************************************************************************/
void User_USART_UART_Init(UART_HandleTypeDef huart)
{
#if USART_DMA1
	if (huart.Instance == USART1)
	{
		HAL_UART_Transmit(&huart1, (uint8_t*)"\r\nUSART1 Open", 14, 10);
		__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
		HAL_UART_Receive_DMA(&huart1, u1NewBuffer, sizeof(u1NewBuffer));
	}
#endif

#if USART_DMA2		
	if (huart.Instance == USART2)
	{
		HAL_UART_Transmit(&huart2, (uint8_t*)"\r\nUSART2 Open", 14, 10);
		__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
		HAL_UART_Receive_DMA(&huart2, u2NewBuffer, sizeof(u2NewBuffer));
	}
#endif

#if USART_DMA3			
	if (huart.Instance == USART3)
	{
		HAL_UART_Transmit(&huart3, (uint8_t*)"\r\nUSART3 Open", 14, 10);
		__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
		HAL_UART_Receive_DMA(&huart3, u3NewBuffer, sizeof(u3NewBuffer));
	}
#endif	

#if USART_DMA4			
	if (huart.Instance == USART4)
	{
		HAL_UART_Transmit(&huart4, (uint8_t*)"\r\nUSART4 Open", 14, 10);
		__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
		HAL_UART_Receive_DMA(&huart4, u4NewBuffer, sizeof(u4NewBuffer));
	}
#endif	

#if USART_DMA5			
	if (huart.Instance == USART5)
	{
		HAL_UART_Transmit(&huart5, (uint8_t*)"\r\nUSART5 Open", 14, 10);
		__HAL_UART_ENABLE_IT(&huart5, UART_IT_IDLE);
		HAL_UART_Receive_DMA(&huart5, u5NewBuffer, sizeof(u5NewBuffer));
	}
#endif	
}


/******************************************************************************
	*方法名称: void User_UART_RxCpltCallback(UART_HandleTypeDef *huart)
	*功能:     串口回调函数  重新开启串口DMA接收
	*参数:     *huart: 串口对应的 huart 句柄

	*返回:		无
	*说明:			串口中断回调函数
					需在 USARTx_IRQHandler() 函数结束时调用
*******************************************************************************/
void User_UART_RxCpltCallback(UART_HandleTypeDef* huart)
{
	int size;
	if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)	// 是否接收完一帧数据
	{
		__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_IDLE | UART_FLAG_RXNE);	// 清帧中断标志 UART_FLAG_IDLE   清字节中断标志 UART_FLAG_RXNE

		//读寄存器以清除标志
		size = huart->Instance->DR;		// 清串口数据寄存器
		size = huart->Instance->SR;		// 清串口状态寄存器

		HAL_UART_DMAStop(huart);	//停止DMA接收
		size = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx);	//计算接收数据帧长度
		huart->RxXferCount = size;	//存到串口接收结构体成员中


		__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);	//重新开启串口接收帧中断

#if USART_DMA1			
		if (huart->Instance == USART1)
		{
			HAL_UART_Receive_DMA(huart, u1NewBuffer, sizeof(u1NewBuffer));	//开启串口1DMA接收
		}
#endif


#if USART_DMA2			
		if (huart->Instance == USART2)
		{
			HAL_UART_Receive_DMA(huart, u2NewBuffer, sizeof(u2NewBuffer));	//开启串口1DMA接收
		}
#endif


#if USART_DMA3			
		if (huart->Instance == USART3)
		{
			HAL_UART_Receive_DMA(huart, u3NewBuffer, sizeof(u3NewBuffer));	//开启串口1DMA接收
		}
#endif

#if USART_DMA4			
		if (huart->Instance == USART4)
		{
			HAL_UART_Receive_DMA(huart, u4NewBuffer, sizeof(u4NewBuffer));	//开启串口1DMA接收
		}
#endif

#if USART_DMA5			
		if (huart->Instance == USART5)
		{
			HAL_UART_Receive_DMA(huart, u5NewBuffer, sizeof(u5NewBuffer));	//开启串口1DMA接收
		}
#endif
		HAL_UART_RxCpltCallback(huart);	// 调用接收回调函数
	}
}


/**
  * @brief  Rx Transfer completed callbacks.
  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart)		// 接收回调函数
{
	/* Prevent unused argument(s) compilation warning */
	UNUSED(huart);
#if USART_DMA1	
	if (huart->Instance == USART1)
	{
		USART_RX_STA |= 0x0001;				//串口1标志位置1  需手动清0		USART_RX_STA &= ~0x0001;
	}
#endif

#if USART_DMA2		
	if (huart->Instance == USART2)
	{
		USART_RX_STA |= (0x0001<<1);		//串口2标志位置1  需手动清0		USART_RX_STA &= ~(0x0001 << 1);
	}
#endif

#if USART_DMA3		
	if (huart->Instance == USART3)
	{
		USART_RX_STA |= (0x0001 << 2);		//串口3标志位置1  需手动清0		USART_RX_STA &= ~(0x0001 << 2);
	}
#endif			

#if USART_DMA4		
	if (huart->Instance == USART4)
	{
		USART_RX_STA |= (0x0001 << 3);		//串口4标志位置1  需手动清0		USART_RX_STA &= ~(0x0001 << 3);
	}
#endif		

#if USART_DMA5		
	if (huart->Instance == USART5)
	{
		USART_RX_STA |= (0x0001 << 4);		//串口5标志位置1  需手动清0		USART_RX_STA &= ~(0x0001 << 4);
	}
#endif		
}

源代码 "usart_dma.h"

/**
  ******************************************************************************
  * @file    usart_dma.h
  * @brief   This file contains all the function prototypes for
  *          the usart_dma.c file
  ******************************************************************************
  */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_DMA_H__
#define __USART_DMA_H__

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/********************************* 配置所需要的功能 *********************************/

#define USART_DMA1	1		//   1: 启用串口1 				0:禁用串口1
#define USART_DMA2	1		//   1: 启用串口2  				0:禁用串口2
#define USART_DMA3	1		//   1: 启用串口3  				0:禁用串口3
#define USART_DMA4	0		//   1: 启用串口4  				0:禁用串口4
#define USART_DMA5	0		//   1: 启用串口5  				0:禁用串口5

#define PRINTF	1			//   1: 启用串口1调试输出		 2: 启用串口2调试输出	 3: 启用串口3调试输出  
							//	 4: 启用串口4调试输出		 5: 启用串口5调试输出	 其他:禁用串口调试输出


/********************************* 需要用到的函数 *********************************/

void debug(char* p, ...);	//串口调试输出
void User_Printf(UART_HandleTypeDef *huart,char *p,...);		//串口格式化输出
void User_USART_UART_Init(UART_HandleTypeDef huart); //串口DMA接收模式初始化函数   需在 MX_USARTX_UART_Init(void) 函数结束时调用
void User_UART_RxCpltCallback(UART_HandleTypeDef* huart); //串口中断回调函数   需在 USART1_IRQHandler() 函数结束时调用
unsigned char hand(char* rec_data,char *ptr);	//校验字符串 rec_data 是否包含字符串 ptr    校验结果 1:包含  0:不包含

/**********************************************************************************/

extern uint16_t USART_RX_STA;//串口接收状态标记

/*
*	USART_RX_STA & ~0x0001 != 0			 串口1接收到数据		清状态标记 USART_RX_STA &= ~0x0001
*	USART_RX_STA & ~(0x0001<<1) != 0     串口2接收到数据		清状态标记 USART_RX_STA &= ~(0x0001 << 1)
*	USART_RX_STA & ~(0x0001<<2) != 0     串口3接收到数据		清状态标记 USART_RX_STA &= ~(0x0001 << 2)
*	USART_RX_STA & ~(0x0001<<3) != 0     串口4接收到数据		清状态标记 USART_RX_STA &= ~(0x0001 << 3)
*	USART_RX_STA & ~(0x0001<<4) != 0     串口5接收到数据		清状态标记 USART_RX_STA &= ~(0x0001 << 4)
*/


#if USART_DMA1
		#define USART1_REC_LEN  200	//定义USART1最大接收字节数
		extern unsigned char u1NewBuffer[USART1_REC_LEN];			//串口1接收缓存
		extern UART_HandleTypeDef huart1;		
#endif


#if USART_DMA2
		#define USART2_REC_LEN  200	//定义USART2最大接收字节数
		extern unsigned char u2NewBuffer[USART2_REC_LEN];			//串口2接收缓存
		extern UART_HandleTypeDef huart2;
#endif


#if USART_DMA3
		#define USART3_REC_LEN  200	//定义USART2最大接收字节数
		extern unsigned char u3NewBuffer[USART3_REC_LEN];			//串口3接收缓存
		extern UART_HandleTypeDef huart3;
#endif

#if USART_DMA4
#define USART4_REC_LEN  200	//定义USART2最大接收字节数
		extern unsigned char u4NewBuffer[USART4_REC_LEN];			//串口4接收缓存
		extern UART_HandleTypeDef huart4;
#endif

#if USART_DMA5
#define USART5_REC_LEN  200	//定义USART2最大接收字节数
		extern unsigned char u5NewBuffer[USART5_REC_LEN];			//串口5接收缓存
		extern UART_HandleTypeDef huart5;
#endif

#endif /* __USART_DMA_H__ */


觉得博主写的还不错的话 还请一键三连支持一下喔

stm32 串口dma,STM32,stm32,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-703114.html

到了这里,关于STM32串口通信——DMA中断 (简单配置即可直接使用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 cubemx+串口空闲中断+DMA双缓冲

            写这篇文章是为了记录下之前做过的项目中用到的一部分关键技术,之前做过的项目中涉及到 采用最小开销来实时接收遥控器数据、能够准确验证传输过来数据的准确性 ,减小误差率,要求能稳定适用于不同的环境。 目录 1、为什么要用到串口空闲中断? 2、为

    2024年02月09日
    浏览(63)
  • 【STM32】CUBEMX之串口:串口三种模式(轮询模式、中断模式、DMA模式)的配置与使用示例 + 串口重定向 + 使用HAL扩展函数实现不定长数据接收

    目录   总览 使用CUBEMX创建工程的基本配置 CUBEMX中的配置 Keil中的配置 实物连接 串口轮询模式 轮询模式HAL库函数 特点 实验一:发送数据给单片机并让其返回相同值 串口重定向 串口中断模式 在CUBEMX中打开串口中断 中断模式HAL库函数 特点 实验二:使用中断回调完成实验一

    2024年04月10日
    浏览(75)
  • STM32 F4串口空闲中断 + DMA实现数据发送

    最近在做 STM32 + ROS车的项目,STM32与ROS之间通信由于数据量大,所以在 STM32端 使用 空闲中断 + DMA 的方案来减轻 CPU 的压力。 一、空闲中断 空闲中断 顾名思义为空了,闲了,没事了进的中断,在 没有数据流 的时候会进入进行读取。 在我们串口进行发送时实则为连续发送,两

    2024年02月16日
    浏览(64)
  • 【STM32 HAL库实战】串口DMA + 空闲中断 实现不定长数据接收

    STM32CubeMX最新版: 打开STM32CubeMX软件,点击ACCESS TO MCU SELECTOR,在Commercial Part Number 中输入MCU型号,例如我在这里输入了STM32L431RCT6。选中正确型号然后双击进入下一步的配置界面。 1.1 SYS配置如图 1.2 RCC配置如图 开启了外部晶振,若无则都选择Disable 1.3 USART1配置 NVIC Settings 注意

    2024年02月03日
    浏览(80)
  • STM32学习笔记(五)串口空闲中断+DMA实现不定长收发(stm32c8t6)

    记录一下学习过程 DMA DMA,全称为: Direct Memory Access,即直接存储器访问, DMA 传输将数据从一个 地址空间复制到另外一个地址空间。 这一过程无需cpu的参与,从而提高cpu使用的效率 DMA相关的参数:1 数据的源地址、2 数据传输的目标地址 、3 传输宽度,4 传输多少字节,5 传

    2024年02月14日
    浏览(47)
  • STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据

           在STM32每个串口的内部都有两个寄存器:发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时,CPU会将数据依次将数据发送到数据寄存器中,移位寄存器中的数据会根据我们设置的比特率传化成高低电平从TX引脚输出。待发送移位寄存器中发

    2024年02月07日
    浏览(57)
  • STM32使用三种方式(阻塞、中断、DMA)实现串口发送和接收数据

    记录下学习STM32开发板的心得的和遇见的问题。 板卡型号:STM32F405RGT6 软件:STM32CubeMX、IAR STM32串口外设提供了3种接收和发送方式:阻塞、中断、DMA,主要给大家分享中断方式接收不定长数据和DMA使用空闲中断接收不定长数据。 阻塞发送: 阻塞接收: 两个函数需要注意的就

    2024年02月03日
    浏览(52)
  • STM32通过DMA方式实现串口通信

    目录 一、DMA工作原理  二、创建工程项目 三、编写代码 1.在main.c写入以下函数 2.main函数中的while循环中写入以下代码

    2024年02月15日
    浏览(45)
  • (stm32之HAL库)UART工作在DMA模式要打开串口中断吗?

    最近学习了stm32(F4xx)的串口在DMA模式下的使用,期间以ST官方提供的例程进行参考学习,发现其初始化过程中是打开了UART的中断的,而且HAL库中stm32f4xx_hal_uart.c文件中的DMA模式使用说明里也有这么一句话: 即在非循环模式下(也就是发完一次数据就停止的常用模式)需要配置

    2024年02月12日
    浏览(40)
  • STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

    能够点进这篇文章的小伙伴肯定是对STM32串口DMA空闲中断接收数据感兴趣的啦,今天用这一功能实现串口解析航模遥控器sbus信号时,查阅了很多网友发布的文章(勤劳的搬运工~),包括自己之前写过一篇博客 STM32_HAL库_CubeMx串口DMA通信(DMA发送+DMA空闲接收不定长数据)。本文

    2024年02月09日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包