CubeMX Stm32 DMA circular(DMA 循环模式)的一个错误

CubeMX Stm32 DMA circular(DMA 循环模式)的一个错误

CubeMX Version 6.4.0

问题

在使用定时器触发 ADC-DMA 时,发现 DMA 在在配置为循环模式后仍然只会被触发一次。
DMA配置

排查

在跟踪DMA寄存器时发现,HAL在初始化DMA时并没有将DMA正确初始化为循环模式,DMA Channel4 的配置寄存器CCR4的循环模式标志<bit CIRC>在初始化后仍未0,CubeMX的配置貌似并没有被正确应用。
在这里插入图片描述
根据Debug跟踪到 HAL_DMA_Init,发现该函数中设置CCR寄存器的语句 hdma->Instance->CCR = tmp; 根本就没起作用(该句被执行后CCR仍然为0),貌似这里有寄存器配置优先级问题。
根据该线索找到ST官方的说法
原文:

Amel NASRI (Employee)
8 months ago
Hi @MMüll.5 (Customer)​ ,

Please check the order of the calls for HAL_ADC_Init() and HAL_DMA_Init().

In the generated code, make sure that HAL_DMA_Init() is called first, then HAL_ADC_Init().

-Amel

大概意思是应该最先初始化 DMA,然后再初始化ADC。

解决

解决很简单,只需将DMA初始化提前即可,在CubeMX中如下配置:
在这里插入图片描述

其它

  • 我并没有找到关于这里是否有寄存器配置优先级的细节问题文档。
  • 该问题在stmf32030和stm32f100上均遇到过。
  • 该问题貌似跟adc无关,在我使用 timer + spi + dma 时仍然遇到过。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值