hooziyang 发表于 2019-11-13 11:42:38

stm32F429 串口采用DMA方式发送,数据流使能失败

最近项目要使用F429的DMA进行串口发送数据,烧录之后程序无法正常运行,仿真发现在执行完DMA_Cmd(DMA2_Stream7, ENABLE)之后并没有被使能,反而多了两个错误中断标志,一个是传输错误中断标志
,一个是 FIFO 错误中断标志 ,这个是什么原因呢?搞了好久也没找出原因,求各位大佬指点。以下为DMA初始化函数内容: DMA_InitTypeDef DMA_InitStructure;/*开启DMA时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
__nop();__nop();__nop();                  //等待 DMA1 时钟稳定
DMA_DeInit(DMA2_Stream7);// 复位初始化DMA数据流
while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE){ }// 确保DMA数据流复位完成
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
      
DMA_InitStructure.DMA_Channel = DMA_Channel_4; //usart1 tx对应dma2,通道4,数据流7
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR);//设置DMA源:串口数据寄存器地址         
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)SendBuff; //内存地址(要传输的变量的指针)      
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//方向:从内存到外设               
DMA_InitStructure.DMA_BufferSize = 5;//传输大小   
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;      //内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据单位      
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;      //内存数据单位 8bit
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;      //DMA模式:不断循环
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //优先级:中      
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //禁用FIFO      
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;   
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发传输 单次传输   
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发传输 单次传输                  
DMA_Init(DMA2_Stream7, &DMA_InitStructure);//配置DMA2的数据流7

DMA_Cmd(DMA2_Stream7, ENABLE);//使能DMA
while(DMA_GetCmdStatus(DMA2_Stream7) != ENABLE);// 等待DMA数据流有效


http://www.openedv.com/data/attachment/forum/201911/13/014851flc8u32kzlk2nzn7.jpg可以看到数据流未被正常使能。
http://www.openedv.com/data/attachment/forum/201911/13/014912yi0s0n0f52b30rbt.jpg可以看到出现两个错误标志。
串口已经在初始化DMA之前初始化成功。

mikecai 发表于 2019-11-13 16:01:45

DMA 空间 SendBuff 要提前分配啊;
如过您不熟 uart DMA 初始化,可以用 CubeMX 来做啊。
参考 论坛视频
10.11 STM32Cube HAL实验室UART - UART DMA
https://www.stmcu.org.cn/video/index/detail/id-4188

hooziyang 发表于 2019-11-13 16:16:16

mikecai 发表于 2019-11-13 16:01
DMA 空间 SendBuff 要提前分配啊;
如过您不熟 uart DMA 初始化,可以用 CubeMX 来做啊。
参考 论坛视频


是提前分配的啊,我是定义的一个全局变量数组
页: [1]
查看完整版本: stm32F429 串口采用DMA方式发送,数据流使能失败