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 文件,里面都是配置所需功能的宏定义及串口相关的初始化函数和功能函数

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

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.找到系统的串口初始化函数

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

 我这是在函数内部调用,你们也可在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文件 打开

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


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.配置串口基本参数

2.开启串口DMA

 

 3.打开串口中断

 4.在NVIC中配置中断优先级


实际应用

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缓存数据
	}
}


源码在这请自取: STM32Fx系列串口DMA中断接收(简单配置即可直接使用)资源-CSDN文库一键三连关注私聊博主有例程哦~

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来解答你的问题。 首先,你需要使用STM32CubeMX来配置你的串口。在配置中,选择串口2,并启用DMA中断。你需要将USART2的时钟使能,设置波特率和数据位、校验位、停止位等参数。在DMA设置中,选择通道和传输方向以及DMA传输的缓存区大小等。在中断设置中,选择接收中断和错误中断,并编写相应的中断处理程序。 接下来,我为你提供一个简单串口通信代码的示例,你可以参考一下: ```c #include "stm32f10x.h" #define BUFFER_SIZE 256 uint8_t RxBuffer[BUFFER_SIZE]; uint8_t TxBuffer[BUFFER_SIZE]; int main(void) { USART_InitTypeDef USART_InitStruct; DMA_InitTypeDef DMA_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; /* Enable clocks for USART2 and DMA1 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* Configure USART2 */ USART_StructInit(&USART_InitStruct); USART_InitStruct.USART_BaudRate = 9600; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStruct); USART_Cmd(USART2, ENABLE); /* Configure DMA for USART2 Rx */ DMA_StructInit(&DMA_InitStruct); DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR); DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)RxBuffer; DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStruct.DMA_BufferSize = BUFFER_SIZE; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; DMA_InitStruct.DMA_Priority = DMA_Priority_High; DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel6, &DMA_InitStruct); DMA_Cmd(DMA1_Channel6, ENABLE); /* Configure DMA for USART2 Tx */ DMA_StructInit(&DMA_InitStruct); DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR); DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)TxBuffer; DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStruct.DMA_BufferSize = BUFFER_SIZE; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; DMA_InitStruct.DMA_Priority = DMA_Priority_High; DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel7, &DMA_InitStruct); DMA_Cmd(DMA1_Channel7, ENABLE); /* Configure NVIC for DMA1_Channel6 */ NVIC_InitStruct.NVIC_IRQChannel = DMA1_Channel6_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); /* Configure NVIC for DMA1_Channel7 */ NVIC_InitStruct.NVIC_IRQChannel = DMA1_Channel7_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); /* Enable USART2 DMA Rx and Tx */ USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); /* Enable USART2 DMA interrupts */ DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE); while (1) { /* Main loop */ } return 0; } void DMA1_Channel6_IRQHandler(void) { if (DMA_GetITStatus(DMA1_IT_TC6)) { DMA_ClearITPendingBit(DMA1_IT_TC6); /* Rx DMA transfer complete */ } } void DMA1_Channel7_IRQHandler(void) { if (DMA_GetITStatus(DMA1_IT_TC7)) { DMA_ClearITPendingBit(DMA1_IT_TC7); /* Tx DMA transfer complete */ } } ``` 这是一个基本的串口通信代码,你可以根据自己的需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值