1.我们知道DMA可以自动的不在CPU干预下,自动把数据重外设存储到内存(我们这节讲的),内存到外设,内存到内存等。但是DMA接收的是指定长度的,在接收不定长数据的时候DMA就傻眼了。网上有许多方法讲解运用定时器超时检测来接收不定长数据,而我们现在要讲的是运用串口空闲中断+DMA的方式接收不定长数据。
2.我们调试用的是串口1、DMA_Channel_4。具体的配置见下面程序:
DMA接收配置:
void USART1_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//开启DMA时钟
DMA_InitStructure.DMA_Channel = DMA_Channel_4;//通道4
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART1_DR_Address; //外设地址为[#define USART1_DR_Address (0x40011000+0x04)]
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Data_Buffer; //内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到内存
DMA_InitStructure.DMA_BufferSize = 65535; //缓冲大小
DMA_InitStructure