WS2812B使用备忘

在淘宝卖的ws2812b rgb灯虽然都是同一名称,但是各家的数据格式都有有微小的不同,参考各家数据手册会发现高低电平的时间有许多不同。

如在淘宝“南方光电”买的ws2812b数据手册如下:
WS2812B使用备忘_第1张图片
再如“糊糊蝶照明”RGB灯条的数据手册:
WS2812B使用备忘_第2张图片
网上还有其他版本的数据手册,时间也不一样,有兴趣可以搜一搜。
以上时间差距会让颜色不准,在使用的时候要注意。
除了手册差异(数据差异)导致的问题,还有不同写法io反转速度差异引起的时间不准。
如:
1.用库函数

 GPIO_SetBits(GPIOB,GPIO_Pin_5);
 GPIO_ResetBits(GPIOB,GPIO_Pin_5);

这样写的反转频率大约为2.7MHz,周期361ns

2.用寄存器GPIOx_ODR

GPIOB->ODR |= GPIO_Pin_5;
 GPIOB->ODR &=~ GPIO_Pin_5;

这样写的反转频率小于18MHz,周期大于55.55ns

3、用寄存器 GPIOB->BRR和GPIOB->BSRR

GPIOB->BRR = GPIO_Pin_5;
GPIOB->BSRR = GPIO_Pin_5;

这样写的反转频率大约为18MHz,周期55.55ns

由于我们需要0.3us的延时,所以直接排除库函数,而用寄存器BRR和BSRR应该是最好的选择。
在stm32f103 72MHz主频下,一个__nop();为1/72M=13.9ns。

所以,对于RGB灯条,
T0H=T1L=55.5ns+1813.9ns;
T0L=T1H=55.5ns+61
13.9ns;

你可能感兴趣的:(WS2812B,stm32,STM32F103)