借WS2812 PWM DMA驱动调试浅谈STM32调试思路

借WS2812 PWM DMA驱动调试浅谈STM32调试思路

​ 接触STM32差不多有4年了,在学校参加比赛时也需要进行各种调试工作,团队的配合也需要个人具有领域内快速定位与解决BUG的能力,前些日子整理了下一年前写的WS2812 DMA+PWM驱动笔记,觉得其中的调试颇具代表性,借此谈一谈STM32的调试思想

前置文章:
[STM32F427库函数配置DMA+PWM驱动WS2812关键代码]
[STM32F405多路PWM DMA控制千颗WS2812/SK6812配置过程全解析]
[STM32F405 多路DMA+PWM方式控制2000+WS2812灯优化buffer占用flash空间不足问题]

1、调试思想

​ 基于原因-结果链;推测-验证的逻辑来进行调试,对于初始化而言,寄存器值是原因,初始化成功是结果。当出现了问题需要调试,就从以上逻辑进行分析。

​ 下面基于WS2812分情况举例说明[下面所有例子都基于硬件(灯珠、接线、供电)正常]:
硬件部分可能的一些问题见最后

①WS2812所有灯珠不亮

​ 这是结果,那么反推下可能是由什么原因产生的?

​ 推测可能原因(1):没有输出波形/波形无效(例如周期时序不对等等) 验证方法1:用示波器验证是否有波形/波形是否符合规格书;验证方法2:见注1

​ 推测可能原因(2):输出码全为零码 验证方法1:用示波器验证是否有波形;验证方法2:见注1

注1:没有示波器条件下。可以将WS2812信号输入线用杜邦线接触几下3.3v/5v,一般该过程存在随机抖动,WS2812会识别到抖动信号,会随机亮某种颜色。在完成上述步骤后,将信号线插回初始化设定控制WS2812的那个引脚,若该引脚有有效波形,会刷新之前随机抖动的颜色–>即验证推测(2),若未刷新,即未输出波形/不是有效波形–>即验证推测(1)。

确定了上述问题原因,那么其实还有问题的原因的原因,即,为什么无波形?这里不详尽列出,详见第二节调试技巧,下同。

②一条总线上所有WS2812灯珠闪绿色

​ 推测可能原因(1):板载其他外设造成的串扰(臂如驱动LED瞬时电流波动影响到PWM输出波形) 验证方法:将板载其他外设关闭后测试。注2

​ 推测可能原因(2):不同厂商的灯珠混装使用了,经测试部分厂商之间的WS2812整形信号可能不一定完美兼容,混装在交界处会一定概率异常。 验证方法:换块板子试试或者使用同一个厂商的WS2812灯珠焊接的灯板进行测试

​ 推测可能原因(3):零码的高电平时间不恰当,被错误的识别为一码; 验证方法:降低零码高电平时间/增加一码高电平时间

注2:可能原因1这个现象观察自在使用淘宝购买的STM32F103C8T6最小系统板驱动WS2812,当led闪烁周期正好为WS2812刷新周期整数倍时,LED闪烁时WS2812会闪下绿色,关闭LED或与WS2812刷新周期错开后现象消失。

③靠近总线信号输入的第一个灯珠闪绿

​ 推测原因:零码的高电平时间不够小,导致第一帧第一位零码被错误的识别为一码 注3; 验证方法:降低零码高电平时间/增加一码高电平时间

​ **注3:**查阅WS2812数据手册可知,一次数据刷新,传输的第一位是Green位,因此若零码的高电平时间不够小,可能会第一帧数据识别出问题(可能具体原因有关第一帧的响应),出现第一个灯珠闪绿的情况。

硬件部分可能的问题:1、GND有浮动电压 2、单片机低位输出不够低。使用示波器测量,必要时可以在信号线与GND见并联电阻

2、STM32驱动WS2812中的调试流程、技巧

调试技巧(待完善)

就像量一个物体尺寸首先需要一把稳定可靠的尺子一样,对问题的分析首先也要基于某部分稳定的前提,而后控制变量,逐步缩小问题范围。否则分析会毫无章绪,例如如果WS2812硬件出了问题(线没接好等等),调试时却在找程序的问题,这不管怎么调都不会正常的,下面基于这个思想给出我自己的一般调试流程(以下步骤均正常后进行下一步骤)

1、若自己打样PCB焊接,使用同一个厂商购买的灯珠焊接,如果是买的已焊接好的模块,一般没有这个问题

2、接好电源、信号线,用万用表测试单片机io口至第一颗WS2812 DIN引脚是否相通。上电测量WS2812 VSS VDD引脚间电压是否正常

image-20201122161522103

3、根据datasheet时序波形,计算时钟分频,适当的ARR以及一码对应的CCR/零码对应的CCR值。先单独初始化TIM PWM不开DMA单独对CCR赋值一码,此时将WS2812信号线接触下PWM输出引脚后离开灯珠应当全部最大亮度输出。若符合上述现象则说明PWM初始化正常,一码时序正常,硬件及连线正常。

4、上述正常前提下编写DMA初始化

[相关文章:STM32F4 DMA+PWM驱动WS2812]

注意数据传输宽度、半字、字、封装时序、最后一位应为RESET码等。写完后先将DMAbuffer所有位设置为一码CCR值,并在程序中定时使能DMA发送(发送数量[DMA->NDTR]设置适当的大一点但总时间不要超过定时周期,以便接下来观察),接入WS2812,正常情况下应该会刷新白光,若出问题,请看5

5.上述初始化写完后若遇到故障,分情况讨论:

​ ①若不论如何灯都不亮:先查看TIM的CCR寄存器是否正常,正常情况下该项应为一码CCR值-RESET码-一码CCR值循环往复。一般该项不正常,继续查看DMA->NDTR寄存器是否正常,该值应当每过一个定时周期就从4中设定值向下递减,若没有递减一直是设定值,说明DMA传输请求未被触发,可能原因是初始化DMA更新源设置错误

[相关文章 STM32F405调试DMA+PWM驱动WS2812配置调试过程记录]

​ ②若信号线接入PWM引脚时WS2812不刷新白光,离开后刷新白光:一般原因是没有在一次DMA PWM信号传输最后加入RESET码

​ ③若第一位灯珠出现异常颜色:可能是第一码传输时,TIM的CNT未清零导致第一帧异常,详情见上述相关文章中 DMA发送部分TIM->EGR寄存器相关操作

未完待续

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值