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

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

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);//清除串口中断 } }
posted @ 2024-03-01 21:32  T7H  阅读(37)  评论(0编辑  收藏  举报