一 背景
前段时间发现在驱动WS2812B灯条的时候会有突然显示其他颜色的情况,后来排查发现是时序被其他任务打断了,在控制时序的时候需要做原子性访问来保证时序的正确性。
二 WS2812B数据手册
2.1 逻辑0和逻辑1
2.2 发送时序
绿色数据先发,高位在前
三 写数据
3.1 精准ns和us级别延时的实现
一个__NOP()的时间是一个时钟周期,如果主频设置的是64MHz,那么一个时钟周期就是1/64000000 = 15.625ns,这里只需要实现一个330ns延时,2个330ns就是660ns了。
void delay_330ns(void)
{
volatile uint8_t cnt = 21;
while(cnt--)
{
__NOP();
}
}
void delay_660ns(void)
{
volatile uint8_t cnt = 21*2;
while(cnt--)
{
__NOP();
}
}
void ws2812b_write_data(uint8_t data){
for(uint8_t i=0;i< 8;i++)
{
if(data & 0x80)//高位先发
{
GPIOA- >BSRR = GPIO_PIN_8;
delay_660ns();
GPIOA- >BRR = GPIO_PIN_8;
delay_660ns();
}
else
{
GPIOA- >BSRR = GPIO_PIN_8;
delay_330ns();
GPIOA- >BRR = GPIO_PIN_8;
delay_660ns();
}
data< <=1;
}
}
#define CONFIG_LED_COUNT 12
void updata_light(uint8_t green,uint8_t red,uint8_t blue)
{
rt_base_t level = rt_hw_interrupt_disable();//关闭中断
for(int i=0;i< CONFIG_LED_COUNT;i++)
{
WS2812_Send(green); //发送当前需要亮的灯的颜色
WS2812_Send(red);
WS2812_Send(blue);
}
rt_hw_interrupt_enable(level);//开启中断
rt_hw_us_delay(300);//复位显示
}
四 总结
当灯的数量比较多的时候,就不能用这种延时方式了,长时间的关闭中断可能会引起一些中断无法及时响应造成数据丢失,在发现问题的时候或者调试新算法的时候,需要基于数据来分析问题,有了数据自然就会有答案了。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
驱动器
+关注
关注
52文章
8150浏览量
145947 -
led灯
+关注
关注
22文章
1592浏览量
107824 -
GPIO
+关注
关注
16文章
1196浏览量
51898 -
串口中断
+关注
关注
0文章
64浏览量
13855 -
WS2812B
+关注
关注
1文章
38浏览量
2148
发布评论请先 登录
相关推荐
使用ESP8266驱动WS2812B型RGB LED智能灯制作分享
这个智能灯方案很不错,只用了一个无线WIFI esp8266芯片,驱动ws2812b型RGB LED,效果很赞,在群里看到的,特分享下,若是侵犯了版权,联系我删除就行了
发表于 07-16 04:35
怎样使用PWM+DMA的方式去驱动WS2812B呢
PWM+DMA 驱动 WS2812一、项目要求(主要目的)使用 PWM+DMA 的方式驱动 WS2812B, 并每隔 800ms 随机显示不
发表于 02-22 06:42
用ws2812b led灯条做远程区域面板控制器的教程
描述WS2812B 远程区域面板控制器我用ws2812b led灯条做了一个面板,你可以把覆盆子前面的动画放到面板上使用此板,您可以控制面板并将其放置在任何有 wifi 的地方PCB代
发表于 07-29 07:16
使用WS2812b Led灯条的diy光剑光剑控制器
描述使用 WS2812b Led 灯条的 diy 光剑光剑控制器,包括用于声音的微型 SD 插槽、用于运动跟踪的 6 轴传感器和用于光剑声音的扬声器。通过板载 USB 端口和 Arduino IDE 进行编程。
发表于 08-25 07:40
【LuckFox Pico Plus开发板免费试用】05_使用SPI驱动WS2812B
使用SPI驱动WS2812B 前面把开发环境全部搭好,工具也都准备好了,这次就来做点小demo,正好手上有一个WS2812B的小灯条,上面有
发表于 10-29 19:15
Arduino WS2812B LED灯带设计方案
Arduino WS2812B LED灯带可单独控制每个LED的亮度和颜色,提供了一种简单而酷炫的LED效果体验。
发表于 04-24 08:36
•1.2w次阅读
迷你乒乓球含Arduino Nano WS2812B LED灯条
电子发烧友网站提供《迷你乒乓球含Arduino Nano WS2812B LED灯条.zip》资料免费下载
发表于 11-02 11:00
•0次下载
适用于Azure Sphere的WS2812B LED灯带驱动器
电子发烧友网站提供《适用于Azure Sphere的WS2812B LED灯带驱动器.zip》资料免费下载
发表于 12-06 14:42
•0次下载
评论