为何实现不了定时器DMA Burst传输?

本文探讨了一位开发者在STM32F401上尝试使用定时器DMA Burst传输时遇到的问题。文章指出,实现此功能需要注意定时器支持DMA Burst、触发事件来源、连续寄存器访问以及HAL库的适应性。通过分析,作者发现由于寄存器布局和BURST传输个数设置不当导致问题,并提供了解决方案。此外,还分享了一段使用STM32G4芯片TIM3-CH1实现不同频率脉冲输出的代码示例。
摘要由CSDN通过智能技术生成

07d1d5bc9f667090e73f7492060a7973.png

有人使用STM32F4系列开发产品,程序运行过程中需要不时地对外输出一串驱动脉冲,并要求这几串脉冲的频率可变、占空比固定。他想到使用基于STM32定时器的DMA BURST传输。具体点说,他期望不时地通过TIM3的CH1输出一串频率可变、占空比固定的脉冲然后停下来。这个思路在原理上是没问题的,可是他在测试过程中发现怎么也折腾不出预期的效果。

他目前使用的芯片是STM32F401,虽有点老旧,但我查看了手册,确认该芯片的TIM3是支持基于TIMER事件实现TIME寄存器与内存间的DMA BURST传输的。即每TIMER事件可以申请多个DMA请求从而实现定时器寄存器与内存间的批量数据传输。要知某个STM32 TIMER是否支持上述功能,只需查看STM32参考手册的相关定时器的寄存器中有无TIMx_DCR和TIMx_DMAR寄存器的介绍。

889e0e649e2e845c756e7ee44da8bbd5.png

既然支持,为什么实现不了呢?关于这个功能我们还需要注意几点:

1、所选择的TIMER必须支持基于定时器事件的DMA BURST传输功能。

2、触发事件必须是来自参与DMA传输的定时器事件,不能是别的定时器事件。比方说你想实现TIM1的寄存器与内存间的DMA BURST传输,触发事件不能是来自TIM2、TIM3这些非TIM1的事件。

3、定时器DMA Burst传输时,用来被BURST访问的定时器寄存器应该是同一定时器的而且是地址连续的寄存器,不可跳跃访问。比方说像下面某TIMER的4个比较寄存器物理地址是安排在一起的,而CH2恰好因为某些原因没有被用上。

e6152632919a28c9216c1e5c289f5558.png

如果你仅对CH1/CH3/CH4个通道的比较寄存器的值做BURST访问,此时尽管CH2没有被用上,BURST访问的传输个数应该是4而不是3。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值