借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引脚间电压是否正常
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寄存器相关操作
未完待续