12下一页
返回列表 发新帖我要提问本帖赏金 10.00元(功能说明)

[活动专区] 【AT-START-AT32F435测评】+因AT32F435高主频导致PWM+DMA异常的问题和解决方法

[复制链接]
 楼主| 6552918 发表于 2023-2-18 16:09 | 显示全部楼层 |阅读模式
#技术资源#
这是个迟到的测评贴,原本想测试点其他东西,但在使用原来在WB415上的程序时,发现执行效果在F435与WB415不同,为了找到原因,我花费了大量的时间和精力进行分析和测试,结果掉坑里了,导致其他想测试的没有做。现在将我遇到的问题和分析过程和解决方案和大家分享一下。
介绍一下问题背景,在F435上移植WS2812B的PWM+DMA驱动,此驱动我曾经在WB415上验证过没问题,可以看一下原来的帖子https://bbs.21ic.com/icview-3247228-1-1.html

下面我只列举了有效的对比测试内容,我还做了很多其他方式的测试,但都没效果就没列举出来。为了方便查看波形状态,所有验证都是以24个波形输出为标准。

WB415相关说明
时钟不分频
1.png
使用查询方式
2.png
3.png
波形正确(24个周期,IO设置与PWM输出执行位置基本一致)
4.png 5.png

WB415使用中断方式
6.png 7.png
波形正确(24个周期,IO设置与PWM输出执行位置基本一致)
8.png 9.png 10.png
===========================================================
相同代码在F435上的问题
时钟2分频(WB415是144M,F435是288M,2分频使定时器时钟一致) 中断模式
11.png 12.png
波形与WB415存在差异,周期少1个(只输出了23个周期,实际应该24个才对)
13.png

时钟2分频(WB415是144M,F435是288M,2分频使定时器时钟一致) 查询模式
14.png 15.png
波形与WB415存在差异,PWM周期少1个(只输出了23个周期,实际应该24个才对)
16.png

时钟不分频 查询模式 周期值和占空比值扩大1倍(波形周期和占空比与2分频一致)
17.png 18.png 19.png
波形与WB415存在差异,PWM周期少一个(只输出了23个周期,实际应该24个才对)
20.png

时钟不分频 中断模式 周期值和占空比值扩大1倍(波形周期和占空比与2分频一致)
21.png 22.png 23.png
波形与WB415存在差异,PWM周期少一个(只输出了23个周期,实际应该24个才对)
24.png


在各种测试和折腾过程中,都没有找到问题点,于是联系原厂技术支持,经过原厂技术支持测试确实存在我反馈的问题。但将F435的主频改为144M(和WB415一致),此问题就恢复正常,得到的是与415一样的结果。技术支持给我的推测结果是DMA速度不同所导致的差异,所以如果435主频是415的一倍,那么其DMA也会快1倍。
给我的解决方案有2个,1 不开缓存输出。2将F435的主频改为144M使用。对于这样的回复我是存在不同意见的,我认为既然有这个功能,并且在其他芯片上能够实现,在F435这样高性能的芯片上也一定能够实现才对。与是我又开始了独自探索,也就有了帖子后续的内容。
另外还提醒我上述代码在启动PWM时是有个问题---启动DMA传输后的第一个周期是空跑的(占空比为0,WB415上也有这个问题),尽管和我要达到的效果没什么关系,但我为了最求完美,还是要把这个问题解掉。
我们先看一下现象,启动PWM和看到信号输出存在延时,调试时我原来就发现过这个问题,但当时从结果上看是没问题的,就没太关注这个点,以为输出本来就是有延时的,经原厂技术支持提醒,才发现这是个不影响结果的错误。
25.png
是什么原因出现上述问题呢,我们来看一下代码
DMA初始化话时,传输数量为0,为0时,即使通道使能,也不会传输数据
26.png
在开始PWM使能前,我先设置了占空比为0,然后配置DMA传输数量,开启通道,最后使能定时器,我原来以为配置完输出数量,使能通道后DMA就开始传输了,但实际不是的,DMA传输是由溢出标志触发的,需要计数器溢出或软件溢出才行,这就导致第一个周期是占空比为0的周期,产生溢出标志后才开始DMA传输的,这就是第一周期空跑的原因
27.png
于是我将代码修改为如下方式(配置完DMA传输数量,人为软件触发一次标志,启动DMA传输),就解决了这个问题
28.png
启动和输出已经基本同步了,第一周期空跑的问题没有了。
29.png
////////////////////////////////////////////////////////////////////////////////////////////////////////
下面来看一下我是如何解在288M下解决输出少一个周期的问题。
为了理解上述现象的原因,需要来理解一下DMA传输完成中断和定时器溢出中断的逻辑关系入下图
30.png
在最后一次DMA传输时,是由倒数第二个溢出标志触发的,我们需要在最后一个周期结束时再关闭PWM,这时我们需要人为将溢出标志清除(在DMA完成中断内处理),等待最后一次溢出标志出现时再关闭PWM。
31.png
如果不清除溢出标志就会变成这样的时序,DMA完成中断后马上进入溢出中断,结果在最后一个周期还没输出时就将PWM关闭了,所以就少了一个周期
32.png
////////////////////////////////////////////////////////////////////////////////////////////////////////
最后一个周期输出问题解决后,又出现新的问题。
配置为查询方式 人为触发DMA,执行效果是有问题的
33.png
执行效果为最后一个周期结束时会维持高电平
34.png

或者第一个周期开启前是高电平

35.png
解决方式如下
查询方式,人为触,DMA 关定时器前加适当延时就可以解决上述问题
36.png 37.png 38.png

为了验证最后一个周期是DMA传输的,我人为将最后个占空比数据改为20(在关闭定时器前加延时)
pixelBuffer.All_Buffer[0][23]= 20;
39.png

从执行效果来看,最后一个周期占空比确实变小了,与程序设定一致,说明是DMA传输的最后一个周期
40.png

我又测试人为将最后个占空比数据改为20(在关闭定时器前不加延时)的波形状态
41.png
波形都是正常的,从这里可以得出,加不加延时是和占空比高电平时间有关系的

42.png 43.png
又在中断模式下测试相关问题
开启中断模式 ,人为将最后个占空比数据改为20,在定时器溢出中断内不加延时的波形状态
44.png 45.png 46.png
波形也是没问题的,效果和查询方式一致

47.png 48.png
开启中断模式 ,将最后个占空比数据不人为改变,在定时器溢出中断内不加延时的波形状态
49.png
执行效果又变成不对的了,得到的结论和查询方式一致,加不加延时是和占空比高电平时间有关系的

50.png
开启中断模式 ,将最后个占空比数据不人为改变在定时器溢出中断内加延时的波形状态
52.png 53.png
波形正常,得到的结论和查询方式一致,加不加延时是和占空比高电平时间有关系的

54.png 55.png
导致上述现象的原因,我认为是和使能输出缓存 有关系。
经过我的测试得到关于使能输出缓存后的一些注意事项
56.png
因为是配置时,开启了输出缓存,时序就不是我上图标注的时序了,通过我的测试发现,波形时序和程序执行不是完全能对应上的
57.png 58.png

总结:
1 DMA传输PWM占空比值每次都是由计数值溢出标志触发的,可以是计数值到达的溢出触发也可以是人为软件触发溢出事件
2 F435的DMA传输完成后要清除PWM溢出标志,再等待最后一个周期完成,再关闭PWM,否则会少一个周期(WB415因为主频低,没有这个问题)。
3 开启输出缓存后,输出波形和相关标志是异步的,不能通过波形倒推相关标志状态。
4 在288M下PWM关闭前的延时时长和占空比是有关系的,占空比越大,相应的延时也要加长,也就是关闭PWM输出时要避开高电平点。

这就是我的掉坑和脱坑的已经经验,希望对能用到这个外设组合的朋友有所帮助。

源码工程路径:
AT32F435_437_Firmware_Library_V2.1.10208 clk\
project\at_start_f435\examples\IAP\mOTA\app_v1\mdk_v5
wb415_mcu_demo_2.0.3 DMA+PWM0207\project\at_start_wb415\at_side\mdk_v5
wb415_mcu_demo_2.0.3 DMA+PWM 0207.zip (2.02 MB, 下载次数: 7) AT32F435_437_Firmware_Library_V2.1.1 0208 clk.zip (9.19 MB, 下载次数: 8)
51.png
<
goodjob 发表于 2023-2-22 09:12 | 显示全部楼层
在发送的数据组最后加一个空数据,然后DMA多发一个数据,就可以解决最后一位发不出的问题吧
 楼主| 6552918 发表于 2023-2-22 12:01 | 显示全部楼层
goodjob 发表于 2023-2-22 09:12
在发送的数据组最后加一个空数据,然后DMA多发一个数据,就可以解决最后一位发不出的问题吧 ...

这也是一种解决方式。我的方式是为了找到问题的原因,根据原因给出解决办法
abotomson 发表于 2023-3-2 10:08 | 显示全部楼层
是不是可以对信号进行降频呢              
 楼主| 6552918 发表于 2023-3-2 10:36 | 显示全部楼层
abotomson 发表于 2023-3-2 10:08
是不是可以对信号进行降频呢

不明白你说的降频是指哪?
1 对定时器时钟降频  不能解决问题
2 对内核时钟降频可以解决,但牺牲的MCU的性能。
mikewalpole 发表于 2023-3-2 10:56 | 显示全部楼层
这个是不是keil的优化问题              
 楼主| 6552918 发表于 2023-3-2 11:15 | 显示全部楼层
mikewalpole 发表于 2023-3-2 10:56
这个是不是keil的优化问题

不是,是PWM外设的问题
uiint 发表于 2023-3-2 11:31 | 显示全部楼层
这个还有这个问题的吗?              
 楼主| 6552918 发表于 2023-3-2 11:34 | 显示全部楼层
通过程序可以规避处理
cemaj 发表于 2023-3-2 16:32 | 显示全部楼层
不能设置AT32F435的太高的频率啊
 楼主| 6552918 发表于 2023-3-2 16:37 | 显示全部楼层
cemaj 发表于 2023-3-2 16:32
不能设置AT32F435的太高的频率啊

可以设置到288M,就是有些细节点需要注意和规避。
cepoly 发表于 2023-3-3 10:19 | 显示全部楼层
本帖最后由 cepoly 于 2023-3-3 10:34 编辑

楼主
 楼主| 6552918 发表于 2023-3-3 10:31 | 显示全部楼层
cepoly 发表于 2023-3-3 10:19
楼主,你代码驱动这样写繁锁,目测后续在做灯效果应用时是有问题(至少在高低温测试时就有问题了或者呼吸灯 ...

遇到了才是问题,没遇到就不是问题,仅供参考
cepoly 发表于 2023-3-3 10:34 | 显示全部楼层
本帖最后由 cepoly 于 2023-3-3 10:38 编辑

tpgf 发表于 2023-3-8 10:51 | 显示全部楼层
请教一下就是DMA速度和什么参数有关系呢
 楼主| 6552918 发表于 2023-3-8 11:01 | 显示全部楼层
tpgf 发表于 2023-3-8 10:51
请教一下就是DMA速度和什么参数有关系呢

内核时钟
paotangsan 发表于 2023-3-8 11:11 | 显示全部楼层
tpgf 发表于 2023-3-8 10:51
请教一下就是DMA速度和什么参数有关系呢

DMA传输速度的影响因素很多,例如:1、传输的距离;2、硬件的性能;3、传输协议
renzheshengui 发表于 2023-3-8 11:36 | 显示全部楼层
6552918 发表于 2023-2-22 12:01
这也是一种解决方式。我的方式是为了找到问题的原因,根据原因给出解决办法 ...

我理解了一下 是不是通俗的说产生了竞争现象呀
 楼主| 6552918 发表于 2023-3-8 11:43 | 显示全部楼层
renzheshengui 发表于 2023-3-8 11:36
我理解了一下 是不是通俗的说产生了竞争现象呀

因为是能了输出缓存,PWM内部机制没法理解,从现象看,输出是延时输出的,反馈状态是早于输出的,控制和输出是异步的。
xiaoqizi 发表于 2023-3-8 11:51 | 显示全部楼层
DMA初始化话时,传输数量为0。那么我们最好的时机在哪里更改这个传输数量呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:北京汇冠触摸技术有限公司/电子工程师
简介:电子工程师,嵌入式应用爱好者。

102

主题

1289

帖子

10

粉丝
快速回复 返回顶部 返回列表