#技术资源#
这是个迟到的测评贴,原本想测试点其他东西,但在使用原来在WB415上的程序时,发现执行效果在F435与WB415不同,为了找到原因,我花费了大量的时间和精力进行分析和测试,结果掉坑里了,导致其他想测试的没有做。现在将我遇到的问题和分析过程和解决方案和大家分享一下。
下面我只列举了有效的对比测试内容,我还做了很多其他方式的测试,但都没效果就没列举出来。为了方便查看波形状态,所有验证都是以24个波形输出为标准。
WB415相关说明时钟不分频 使用查询方式 波形正确(24个周期,IO设置与PWM输出执行位置基本一致)
WB415使用中断方式 波形正确(24个周期,IO设置与PWM输出执行位置基本一致) =========================================================== 相同代码在F435上的问题 时钟2分频(WB415是144M,F435是288M,2分频使定时器时钟一致) 中断模式 波形与WB415存在差异,周期少1个(只输出了23个周期,实际应该24个才对)
时钟2分频(WB415是144M,F435是288M,2分频使定时器时钟一致) 查询模式 波形与WB415存在差异,PWM周期少1个(只输出了23个周期,实际应该24个才对)
时钟不分频 查询模式 周期值和占空比值扩大1倍(波形周期和占空比与2分频一致) 波形与WB415存在差异,PWM周期少一个(只输出了23个周期,实际应该24个才对)
时钟不分频 中断模式 周期值和占空比值扩大1倍(波形周期和占空比与2分频一致) 波形与WB415存在差异,PWM周期少一个(只输出了23个周期,实际应该24个才对)
在各种测试和折腾过程中,都没有找到问题点,于是联系原厂技术支持,经过原厂技术支持测试确实存在我反馈的问题。但将F435的主频改为144M(和WB415一致),此问题就恢复正常,得到的是与415一样的结果。技术支持给我的推测结果是DMA速度不同所导致的差异,所以如果435主频是415的一倍,那么其DMA也会快1倍。
给我的解决方案有2个,1 不开缓存输出。2将F435的主频改为144M使用。对于这样的回复我是存在不同意见的,我认为既然有这个功能,并且在其他芯片上能够实现,在F435这样高性能的芯片上也一定能够实现才对。与是我又开始了独自探索,也就有了帖子后续的内容。 另外还提醒我上述代码在启动PWM时是有个问题---启动DMA传输后的第一个周期是空跑的(占空比为0,WB415上也有这个问题),尽管和我要达到的效果没什么关系,但我为了最求完美,还是要把这个问题解掉。 我们先看一下现象,启动PWM和看到信号输出存在延时,调试时我原来就发现过这个问题,但当时从结果上看是没问题的,就没太关注这个点,以为输出本来就是有延时的,经原厂技术支持提醒,才发现这是个不影响结果的错误。 是什么原因出现上述问题呢,我们来看一下代码 DMA初始化话时,传输数量为0,为0时,即使通道使能,也不会传输数据 在开始PWM使能前,我先设置了占空比为0,然后配置DMA传输数量,开启通道,最后使能定时器,我原来以为配置完输出数量,使能通道后DMA就开始传输了,但实际不是的,DMA传输是由溢出标志触发的,需要计数器溢出或软件溢出才行,这就导致第一个周期是占空比为0的周期,产生溢出标志后才开始DMA传输的,这就是第一周期空跑的原因 于是我将代码修改为如下方式(配置完DMA传输数量,人为软件触发一次标志,启动DMA传输),就解决了这个问题 启动和输出已经基本同步了,第一周期空跑的问题没有了。 //////////////////////////////////////////////////////////////////////////////////////////////////////// 下面来看一下我是如何解在288M下解决输出少一个周期的问题。 为了理解上述现象的原因,需要来理解一下DMA传输完成中断和定时器溢出中断的逻辑关系入下图 在最后一次DMA传输时,是由倒数第二个溢出标志触发的,我们需要在最后一个周期结束时再关闭PWM,这时我们需要人为将溢出标志清除(在DMA完成中断内处理),等待最后一次溢出标志出现时再关闭PWM。 如果不清除溢出标志就会变成这样的时序,DMA完成中断后马上进入溢出中断,结果在最后一个周期还没输出时就将PWM关闭了,所以就少了一个周期 //////////////////////////////////////////////////////////////////////////////////////////////////////// 最后一个周期输出问题解决后,又出现新的问题。 配置为查询方式 人为触发DMA,执行效果是有问题的 执行效果为最后一个周期结束时会维持高电平
或者第一个周期开启前是高电平
解决方式如下 查询方式,人为触,DMA 关定时器前加适当延时就可以解决上述问题
为了验证最后一个周期是DMA传输的,我人为将最后个占空比数据改为20(在关闭定时器前加延时) pixelBuffer.All_Buffer[0][23]= 20;
从执行效果来看,最后一个周期占空比确实变小了,与程序设定一致,说明是DMA传输的最后一个周期
我又测试人为将最后个占空比数据改为20(在关闭定时器前不加延时)的波形状态 波形都是正常的,从这里可以得出,加不加延时是和占空比高电平时间有关系的
又在中断模式下测试相关问题 开启中断模式 ,人为将最后个占空比数据改为20,在定时器溢出中断内不加延时的波形状态 波形也是没问题的,效果和查询方式一致
开启中断模式 ,将最后个占空比数据不人为改变,在定时器溢出中断内不加延时的波形状态 执行效果又变成不对的了,得到的结论和查询方式一致,加不加延时是和占空比高电平时间有关系的
开启中断模式 ,将最后个占空比数据不人为改变,在定时器溢出中断内加延时的波形状态 波形正常,得到的结论和查询方式一致,加不加延时是和占空比高电平时间有关系的
导致上述现象的原因,我认为是和使能输出缓存 有关系。 经过我的测试得到关于使能输出缓存后的一些注意事项 因为是配置时,开启了输出缓存,时序就不是我上图标注的时序了,通过我的测试发现,波形时序和程序执行不是完全能对应上的
总结: 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)
AT32F435_437_Firmware_Library_V2.1.1 0208 clk.zip
(9.19 MB)
|