
我在配置外部触发源定时触发TIM8_CH1输出PWM时,打算使用DMA1_Channel4在每次TIM8 UP时触发DMA传输来更新ARR、RCR、CCR1寄存器,在DMA传输完成中断中关闭TIM8、重新配置DMA,最后再重新打开TIM8,等待下次外部触发源到来,如此往复。 初始化配置完成后实测发现,只有第一次外部触发时,在DMA传输完成中断中调试发现ARR、RCR、CCR1更新正确,但之后的每次进DMA中断发现三个寄存器的值更新是错乱的。 初始化配置的DMA传输数据数目为6,也就是第二个更新DMA请求结束后会进入DMA传输完成中断; TIM8时钟频率为120Mhz; dma更新缓存内容 uint32_t tim8dmabuf[6] = {30-1, 344-1, 15-1, 48-1, 1-1, 33-1}; 我想实现的效果就是TIM8连续输出344个PWM脉冲后,再输出1个脉冲结束,但实测结果从第二次触发开始就不对了。 |
现在内存缓存数组有6个数据,分别对应两组配置。两组数据使用完毕对应DMA传输完成中断。
ARR、RCR、CCR三个寄存器都带有预装功能。你如果希望即时生效,按理需要关闭预装功能。
你说在DMA传输完成中断里停止TIMER输出,这点似乎不太合理。DMA传输完成不等于对应的PWM输出完成了。
因为此时后面的那1个脉冲可能还没有完成输出。
是否可以基于第1组配置产生更新事件后来准备新的数据呢?同时加载第2组配置。
基于第2组配置产生的更新事件 加载下一批的第1组配置数据。
整个过程就无须对TIM8做停止操作了。当然,如果你的确需要暂停一会儿就另当别论。
这里有两篇基于STM32 TIMER DMA burst传输的文章及示例,可以看看:
STM32定时器BURST传输介绍及示例
为何实现不了定时器DMA Burst传输?
我验证了参考文章1,按那个配置出来,实际上DMA搬运的数据也是错位的
另外,你还要注意CCR ARR预装方面的细节问题。