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

文章讨论了在STM32F4中,使用TIM2和DMA生成PWM波形时遇到的问题,发现32位计数器与halfwordDMA配置导致的不匹配。解决办法是调整DMA长度为32bit以适应TIM2的计数器。
摘要由CSDN通过智能技术生成

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》文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值