当前位置: 代码迷 >> 综合 >> STM32配置USART2的DMA传输,犯了一个低级错误
  详细解决方案

STM32配置USART2的DMA传输,犯了一个低级错误

热度:69   发布时间:2024-02-07 14:17:51.0

这两天重写了一下串口的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有自己的宏定义。