有人使用STM32F4系列开发产品,程序运行过程中需要不时地对外输出一串驱动脉冲,并要求这几串脉冲的频率可变、占空比固定。他想到使用基于STM32定时器的DMA BURST传输。具体点说,他期望不时地通过TIM3的CH1输出一串频率可变、占空比固定的脉冲然后停下来。这个思路在原理上是没问题的,可是他在测试过程中发现怎么也折腾不出预期的效果。
他目前使用的芯片是STM32F401,虽有点老旧,但我查看了手册,确认该芯片的TIM3是支持基于TIMER事件实现TIME寄存器与内存间的DMA BURST传输的。即每个TIMER事件可以申请多个DMA请求从而实现定时器寄存器与内存间的批量数据传输。要知某个STM32 TIMER是否支持上述功能,只需查看STM32参考手册的相关定时器的寄存器中有无TIMx_DCR和TIMx_DMAR寄存器的介绍。
既然支持,为什么实现不了呢?关于这个功能我们还需要注意几点:
1、所选择的TIMER必须支持基于定时器事件的DMA BURST传输功能。
2、触发事件必须是来自参与DMA传输的定时器事件,不能是别的定时器事件。比方说你想实现TIM1的寄存器与内存间的DMA BURST传输,触发事件不能是来自TIM2、TIM3这些非TIM1的事件。
3、定时器DMA Burst传输时,用来被BURST访问的定时器寄存器应该是同一定时器的而且是地址连续的寄存器,不可跳跃访问。比方说像下面某TIMER的4个比较寄存器物理地址是安排在一起的,而CH2恰好因为某些原因没有被用上。
如果你仅对CH1/CH3/CH4三个通道的比较寄存器的值做BURST访问,此时尽管CH2没有被用上,BURST访问的传输个数应该是4而不是3。