前言
事情的起因是最近我在使用F103编写WS2812彩灯的时序时遇到了一些小问题。具体来说,我发现WS2812的'1'
码的低电平部分的时序无法达到要求的220ns~380ns,而只能到大约580ns左右。因此,我开始对引脚的反转速度进行了一些测试。下面数据仅是我通过逻辑分析仪检测,如有偏差或错误的地方欢迎指出。
环境
- STM32C8T6系统板,主频72MHz
- 空载,代指只有反转引脚函数运行的环境
- 下述提到的HAL库代码,都是基于STM32CubeMX生成的
- '0’码,'1’码,我对WS2812时序电平的称呼,每个码都是有不同时长的高低电平组成的
检测
-
标准库,上电默认的主频,空载
高电平:200ns 低电平:380ns 周期:580ns
-
HAL库,72MHz,空载
高电平:375ns 低电平:292ns 周期:667ns
-
HAL库,72MHz,函数中
高电平:375ns 低电平:542ns 周期:917ns
-
总结
通过上述测试截图以及我实际测试可以看出的是,引脚电平反转在空载的时候才能刚好满足220ns~380ns这个延时段,看似可以满足WS2812时序,但是别忘了发送时序的过程中,还有经历高低位的定位及电平判断之类的,无疑会延长上一个电平的时间,导致时序不是很标准,明显存在在误差,从我发的最后一张图就能看出来。
我对WS2812的时序的函数上优化判断位,和减少不必要函数跳转等等上,却始终到不到标准时序要求,要么是’1’码标准了,程序时序对于’0’码来说就超时了,要么就相反。
-
我的WS2812程序实际测到的时序
'1’码:(低电平部分未满足,取值应当为220ns~380ns,过长了)
'0’码:(满足)