自学内容网 自学内容网

STM32使用TIM2+DMA产生PWM波形异常分析

1、问题描述

使用 STM32F4 的 TIM2 结合 DMA,产生的 PWM 波形不符合预期,但是相同的配置使用在 IM3 上,得到的 PWM 波形就是符合预期的。其代码和配置都是从 F1 移植过来的,在 F1 上使用 TIM2 是没有问题的,对于 F4 的 TIM2 发生的问题,客户一直没有找到根本原因。

2、试验分析

根据客户的反馈,我们进行了实验。
硬件:STM32F401RE-NUCLEO
在 STM32CubeMX 中,将 TIM2 和 TIM3 所有参数均做相同的配置, 其中配置 DMA 两端均为 halfword 长度。
在这里插入图片描述
在这里插入图片描述
生成代码,并定义两个数组如下图所示:
在这里插入图片描述
在主函数中开启 Timer。
在这里插入图片描述
我们可以发现,实验结果如客户反馈的,TIM2 输出的 PWM 是不正确的,TIM3 输出的PWM 是正确的。
在这里插入图片描述

3、问题分析

我们的实验中,TIM2 和 TIM3 的配置是完全一样的,即使传输相同的数据,得到的 PWM 波形也是不同的。为此我们比较了 TIM2 和 TIM3 的硬件属性,可以很容易查看出,TIM2 的计数器是 32bit 的,而 TIM3 的计数器是 16bit 的。

我想我们已经知道答案了,TIM2 的计数器是 32bit 的,但是我们配置的 DMA 是 halfword 长度,这在 AHB 总线上解析数据时产生了非预期的结果。在调试界面我们也能看到,当问题发生时,TIM2 的 CCR1 竟然比 ARR 的值要大,或者出现异常值,所以出现异常波形。
在这里插入图片描述
根本原因在于,AHB 外设的寻址是不支持 byte/half-word 写传输的,总线会强制将数据转化为 32bit 传送到总线上,这就是为什么我们看到 CCR1 的高位和低位的值是相同的。

当我们将 TIM2 的 DMA 外设端修改为 word 长度,并将内存数组定义为 32bit,再次实验,可以发现 PWM 的波形就是正常的了:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、问题小结

对于 32 位计数器的 Timer,我们在使用 DMA 时,需要将 DMA 的长度配置为 32bit。因为 F103 上没有 32bit 计数器的 Timer,所以客户在 F103 上并没有出现类似的问题,归根结底,我们要学会类似查找问题的方法。

文档中所用到的工具及版本
STM32CubeIDE v1.8.0
STM32CubeMX v6.61
本文档参考ST官方的《LAT1259》文档。


原文地址:https://blog.csdn.net/u014319604/article/details/136761913

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!