你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
hooziyang 提问时间:2019-11-13 11:42 /
最近项目要使用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数据流有效


可以看到数据流未被正常使能。
可以看到出现两个错误标志。
串口已经在初始化DMA之前初始化成功。
<
收藏 评论2 发布时间:2019-11-13 11:42

举报

2个回答
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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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

是提前分配的啊,我是定义的一个全局变量数组

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版