这两天重写了一下串口的DMA传输代码,结果发现串口发送的字符串始终只有首个字节。
/*DMA_USART2_TX, RAM->USART2, DMA1_Channel7*/
DMA_DeInit(DMA1_Channel7); //将DMA的通道7寄存器重设为缺省值
DMA1_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(USART2->DR)); //启动传输前装入实际RAM地址
DMA1_InitStructure.DMA_MemoryBaseAddr = (u32)(USART2_TX_BUF); //设置发送缓冲区首地址
DMA1_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //设置外设数据宽度为8位
DMA1_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //设置内存数据宽度为8位
DMA1_InitStructure.DMA_PeripheralInc = DISABLE; //外设地址寄存器不变
DMA1_InitStructure.DMA_MemoryInc = ENABLE; //内存地址寄存器递增
DMA1_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向:内存->外设
DMA1_InitStructure.DMA_BufferSize = USART2_MAX_TX_LEN; //DMA通道的DMA缓存的大小
DMA1_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常模式,只发送一次
DMA1_InitStructure.DMA_Priority = DMA_Priority_High; //拥有最高优先权
DMA1_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁能内存到内存传输
DMA_Init(DMA1_Channel7, &DMA1_InitStructure);
想来想去,才怀疑有可能地址没有递增,细看了代码才发现原来习惯性地将使能/禁能,用了ENABLE/DISABLE,DMA_PeripheralInc和DMA_MemoryInc有自己的宏定义。