STM32
直播中

哈哈哈

10年用户 794经验值
擅长:可编程逻辑
私信 关注
[问答]

求助,关于STM32G473 TIM8 DMA burst模式问题求解

我在配置外部触发源定时触发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个脉冲结束,但实测结果从第二次触发开始就不对了

回帖(1)

刘洋

2024-7-23 17:23:23
根据您的描述,您在使用STM32G473的TIM8和DMA1_Channel4进行PWM输出时遇到了问题。在第一次外部触发时,寄存器更新正确,但在之后的触发中,寄存器的值更新出现错乱。以下是一些建议和可能的原因:

1. 检查DMA配置:确保DMA的配置正确,包括源地址、目标地址、传输大小、传输方向等。同时,确保DMA的优先级设置合适。

2. 检查中断优先级:确保DMA传输完成中断的优先级高于TIM8的中断优先级,以避免在DMA传输过程中被其他中断打断。

3. 检查定时器配置:确保TIM8的配置正确,包括时钟频率、预分频器、自动重载寄存器(ARR)、捕获/比较模式寄存器(CCR1)等。

4. 检查外部触发源:确保外部触发源的信号质量和时序正确,以避免触发不稳定或误触发。

5. 检查代码逻辑:在DMA传输完成中断中,确保关闭TIM8、重新配置DMA、重新打开TIM8的顺序正确,避免在重新配置过程中出现寄存器更新错误。

6. 检查缓存一致性:在更新寄存器之前,确保缓存中的数据是一致的。可以使用__HAL_DMA_DISABLE()和__HAL_DMA_CLEAR_FLAG()函数来确保DMA传输完成并清除相关标志。

7. 检查寄存器更新时机:在DMA传输完成中断中,确保在重新配置DMA之前,已经正确更新了ARR、RCR、CCR1寄存器的值。

8. 使用调试工具:使用调试工具(如Keil MDK或STM32CubeIDE)逐步跟踪代码执行过程,观察寄存器值的变化,以便找到问题所在。

9. 检查硬件连接:检查STM32G473与外部触发源之间的硬件连接是否正确,确保信号传输稳定。

10. 考虑使用其他方法:如果问题仍然无法解决,可以考虑使用其他方法实现PWM输出,例如使用软件定时器或修改现有的DMA和定时器配置。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便进一步分析。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分