STM32标准库串口DMA空闲中断接收

1.DMA配置(USART配置在USART中已实现,不再重复叙述)

需要使用标准库头文件“stm32f10x_dma.h”

    DMA_InitTypeDef Usart_DMA;//定义DMA结构体
	DMA_DeInit(DMA1_Channel5);//初始化DMA通道
	Usart_DMA.DMA_BufferSize = 256;//定义DMA缓存区大小
	Usart_DMA.DMA_DIR = DMA_DIR_PeripheralSRC;//定义DMA传输方向
	Usart_DMA.DMA_M2M = DMA_M2M_Disable;//定义DMA是否用于内存到内存传输
	Usart_DMA.DMA_MemoryBaseAddr = (uint32_t)usart1Recdata;//定义DMA内存指向地址
	Usart_DMA.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//定义DMA内存每一帧数据大小
	Usart_DMA.DMA_MemoryInc = DMA_MemoryInc_Enable;//定义DMA内存是否递增
	Usart_DMA.DMA_Mode = DMA_Mode_Normal;//定义DMA传输模式
	Usart_DMA.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);//定义DMA外设地址
	Usart_DMA.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//定义DMA外设每一帧数据大小
	Usart_DMA.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//定义DMA外设是否递增
	Usart_DMA.DMA_Priority = DMA_Priority_High;//定义DMA优先级
	DMA_Init( DMA1_Channel5,&Usart_DMA);//将DMA结构体载入到指定DMA通道
	USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);//使能DMA接收
	DMA_Cmd(DMA1_Channel5,ENABLE);//开启DMA通道

2.DMA空闲中断接收配置

void USART1_IRQHandler(void)
{
	uint8_t temp[256] = {0};
	if(USART_GetITStatus(USART1,USART_IT_IDLE) !=RESET){//检查空闲中断标志量
		DMA_Cmd(DMA1_Channel5,DISABLE);//关闭DMA通道,防止数据丢失
		memcpy(temp,usart1Recdata,256);
		USART_SendString(USART1,temp);
		USART_SendByte(USART1,'\n');
		memset(usart1Recdata,0,sizeof(usart1Recdata));
		memset(temp,0,sizeof(temp));
		USART_ClearITPendingBit(USART1,USART_IT_IDLE);//清除空闲中断标志量
		DMA_SetCurrDataCounter( DMA1_Channel5, 256 );//设置DMA计数器
		DMA_Cmd(DMA1_Channel5,ENABLE);//开启DMA通道
		USART_ReceiveData(USART1);//清除串口中断
	}
}
  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
stm32f103的串口DMA空闲中断接收功能是指通过DMA通道来实现串口接收,并通过空闲中断来触发数据接收完成的事件。下面是修复版的实现过程: 首先,要确保串口DMA的时钟已经使能,并按照正确的引脚配置工作模式。然后,需要配置串口接收的参数,比如波特率、数据位、停止位、奇偶校验等。在这之前,还需要先初始化DMA的通道,并设置合适的传输方向和数据缓冲区。 接下来,在主函数中进行初始化操作。首先,要对串口进行初始化配置,调用相关函数进行参数设置。然后,设置DMA的传输方向为从外设到存储器,并设置数据长度和数据缓冲区地址。 然后,要编写串口空闲中断的处理函数。当DMA传输完成时,触发空闲中断。在空闲中断处理函数中,需要判断是哪个串口触发的空闲中断。通过判断状态寄存器位来判断当前串口是否接收到了数据,并读取接收缓冲区的数据。在接收完数据后,通过设置DMA的数据长度和数据缓冲区地址来启动下一次接收。 最后,在主函数中,使能串口空闲中断,并启动DMA传输。等待空闲中断触发后,会自动执行空闲中断的处理函数。在空闲中断处理函数中,处理完数据后,再次启动DMA传输,实现连续的接收功能。 以上是stm32f103串口DMA空闲中断接收的修复版实现过程。通过合理的初始化配置和中断处理,可以保证串口接收的稳定性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值