WS2812B 驱动程序

这篇具有很好参考价值的文章主要介绍了WS2812B 驱动程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关键词:WS2812 ,STM32G030F6

说 明:本代码用于驱动 16 个RGB LED(WS2812 )模块,可以按16个预定颜色的流水显示,

使用RT-Thread RTOS 基于STM32G030F6 最小系统板的 ws2812 驱动工程。

        WS2812是一个集控制电路与发光电路于一体的外控LED光源,外形一般为5050封装,每个LED灯珠为一个像素点,支持RGB无极调色,同时每颗灯珠内部集成有数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,整个 LED 模组只需要3条线即可驱动,VCC,GND,DATA, LED 模组上的所有LED都串在一条数据线上,所以只需要使用1条IO即可驱动。

驱动效果,彩色渐变循环显示

WS2812B 驱动程序

1.开发板图片

WS2812B 驱动程序

2.开发板与WS2812B 连接图

16位 WS2812 5050 RGB LED 智能全彩RGB灯环开发板

WS2812B 驱动程序

3.附带工程的编译器 RT-Thread Studio

WS2812B 驱动程序

4.驱动代码

/*
 * Copyright (c) 2006-2020, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * IO 直接数据输出模式控制 ws2812B
 * 说明:本代码用于驱动 16 个RGB LED模块,可以按16个预定颜色的流水显示
 */

#include "user_cfg.h"
#define RGBLED_GPIOX             GPIOA         /* LED驱动IO */
#define RGBLED_PIN               GPIO_PIN_3    /* LED驱动IO */
#define LED_NUM                  16            /* LED数量 */
//#define RGBLED     GET_PIN(A, 3)

/* STM32F103 系列 IO 输出控制,采用直接寄存器操作方法,这样可以做到IO的控制速度最大化 */

/*方式1:(72M主频)BSRR 只写寄存器:既能控制管脚为高电平,也能控制管脚为低电平。对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作*/
//#define LED1(X) X? (GPIOB->BSRR |= (0X00000001<<7)):(GPIOB->BSRR |= (0X00000001<<23))  /* 控制 PB7 输出1 或者 0  ,最小脉宽 250ns*/

/*方式2:(72M主频)ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。管脚对应位写1 gpio 管脚为高电平,写 0 为低电平*/
//#define LED1(X) X? (GPIOB->ODR |= (0X01<<7)):(GPIOB->ODR &=~ (0X01<<7))         /* 控制 PB7 输出1 或者 0 ,最小脉宽 250ns */
//#define LED1(X) X? (GPIOA->ODR |= (0X0001<<12)):(GPIOA->ODR &=~ (0X0001<<12))   /* 控制 PA12 输出1 或者 0 ,最小脉宽 250ns */

/* 方式2.1:(72M主频)以下是在方式2的基础上,直接用移位和取反的结果,省去了移位和取反的操作时间,示波器测量对比,IO的翻转时间和方式2没有明显变化 */
//#define RGBLED_1  GPIOA->ODR |= 0X08  /*  控制 PB3 输出1 或者 0 ,最小脉宽 243.6ns */
//#define RGBLED_0  GPIOA->ODR &= 0XF7

#define RGBLED_1  HAL_GPIO_WritePin(RGBLED_GPIOX,RGBLED_PIN, 1)
#define RGBLED_0  HAL_GPIO_WritePin(RGBLED_GPIOX,RGBLED_PIN, 0)

//#define RGBLED_1   LED1(1)
//#define RGBLED_0   LED1(0)


/*方式3:(72M主频)使用RT Thread 的 IO 控制函数,控制IO翻转的时间*/
//#define RGBLED_1   rt_pin_write(RGBLED, 1)  /* 最小脉宽 3.1us */
//#define RGBLED_0   rt_pin_write(RGBLED, 0)


/* 定义LED要显示的16个颜色 */
char count = 0;  /* 计数变量,用于旋转跑马灯计数用 */
char color_rgb[16][3] = {{255,182,193},\
                         {255, 20,147},\
                         {255,  0,255},\
                         {  0,  0,255},\
                         { 30,144,255},\
                         {  0,255,255},\
                         {  0,250,154},\
                         { 50,205,50 },\
                         {255,255,0  },\
                         {255,165,0  },\
                         {255,140,0  },\
                         {255, 69,0  },\
                         {250,128,114},\
                         {255,  0,0  },\
                         {128,  0,0  },\
                         {255,255,255},\
                                        };


void RGB_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOA_CLK_ENABLE();


    /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(RGBLED_GPIOX,RGBLED_PIN, GPIO_PIN_RESET);

    /*Configure GPIO pin : PB0 */
    GPIO_InitStruct.Pin = RGBLED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(RGBLED_GPIOX, &GPIO_InitStruct);

}


/* 复位   80us低电平 */
void RGB_LEDReset()
{
    RGBLED_0;
    rt_hw_us_delay(80);
}


/* RGB写一个字节 */
void RGB_WriteByte(char dat)
{
  char i;
    for(i= 0;i<8;i++)
    {
        dat <<= i;
      if(dat & 0x80) // 判断最高位
        {
          RGBLED_1;
          RGBLED_1;
          RGBLED_0;
        }
        else
        {
          RGBLED_1;
          RGBLED_0;
          RGBLED_0;
        }
    }

}

/* 输出LED数据 */
void RGB_ColorSet(char red,char green,char blue)
{
    RGB_WriteByte(green);
    RGB_WriteByte(red);
    RGB_WriteByte(blue);
}


/* 设置 并输出 LED 数据*/
void RGB_RandomColor(uint8_t i)
{
     char red,green,blue;
     uint8_t j = 0;

     j = count + i;
     if (j >= LED_NUM)
     {
        j = j - (LED_NUM - 1);
     }

     red   = color_rgb[j][0];
     green = color_rgb[j][1];
     blue  = color_rgb[j][2];

     RGB_ColorSet(red,green,blue); /*输出LED数据*/

}
/* 关闭 i 个 LED */
void RGB_RandomColor_off(void)
{
     char red,green,blue;

     red = 0;
     green = 0;
     blue = 0;

     RGB_ColorSet(red,green,blue);

}

/* 点亮 i 个 LED */
void RGB_RandomColor4(uint8_t i)
{
    for (uint8_t var = 0; var < i; ++var)
    {
        if (i)
        {
            RGB_RandomColor(var);
        }
        else
        {
            RGB_RandomColor_off();
        }

    }

    RGB_LEDReset();
    if (count < LED_NUM -1)
    {
        ++count;
    }
    else
    {
        count = 0;
    }
}


/* 线程 rgbled_test 的入口函数 */

static void rgbled_entry(void *param)
{
    RGB_Init();
    RGBLED_0;

    while (1)
    {
       RGB_RandomColor4(LED_NUM);
       rt_thread_mdelay(1000);
    }
}

/*线程创建函数*/
int rgbled_test(void)
{
    rt_thread_t tid1;                                    /*创建线程控制块指针来接收线程创建函数的返回值,目的是通过返回值判断线程是否创建ok*/

    /* 创建线程 1,名称是 rgbled_test,入口是 rgbled_entry*/

    tid1 = rt_thread_create("rgbled_test",              /*线程名称,系统打印线程时会显示这个线程的名字*/
                            rgbled_entry,               /*线程入口函数,入口函数函数名*/
                            RT_NULL,                    /*入口参数*/
                            500,                        /*设置内存堆栈大小*/
                            9,                          /*设置优先级*/
                            500);                       /*时间片参数,时间片是在有多个相同优先级线程时,这个线程每次被执行多少个时间片*/


    /* 如果获得线程控制块,启动这个线程 */
    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);
    return RT_EOK;
}
//INIT_APP_EXPORT(rgbled_test);

5.测试工程链接点击下载

测试工程文章来源地址https://www.toymoban.com/news/detail-515634.html

到了这里,关于WS2812B 驱动程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WS2812B灯带

     开发WS2812B灯带笔记 目录 什么是WS2812B灯 WS2812B灯带连接原理图 WS2812B灯带的数据和数据传输是啥样的? 补充:什么是RGB? 那么WS2812B灯的24bit数据如何构造? WS2812B灯的逻辑“1”和逻辑“0” 代码部分 实现ns级别延时 WS2812B是一种智能控制LED光源,将控制电路和RGB芯片集成在

    2024年02月07日
    浏览(47)
  • GPIO模拟时序控制外设1——WS2812B

    上一篇文章中介绍了整个板子的最基本功能模块——使用GPIO的通用输入输出实现简单的按键输入以及推挽输出控制的功能。本文深入一步,在只使用GPIO的输入输出功能的基础上,通过查看对应模块的芯片手册,模拟其对应的通信时序来驱动对应的模块。 首先来个网红模块—

    2024年02月12日
    浏览(47)
  • 【流光溢彩】物联网入门 - ESP8266 + WS2812B 制作流光溢彩灯带

    ESP8266 模块 x1 WS2812B 灯带(60/米,根据显示器四周长度买即可) x1 杜邦线 若干 DC 电源 x1 1. ESP8266 串口驱动 一般购买详情页都会有写,没有就找商家要一个。 一般是 CH340 或者 CP2102,我买的是 CP2102 2. WLED 固件 固件开源地址:https://github.com/Aircoookie/WLED/releases 下载 ESP8266.bin 结

    2024年02月09日
    浏览(40)
  • 抖音关键词搜索小程序排名怎么做

    抖音搜索小程序排名怎么做 1 分钟教你制作一个抖音小程序。 抖音小程序就是我的视频,左下方这个蓝色的链接,点进去就是抖音小程序。 如果你有了这个小程序,发布视频的时候可以挂载这个小程序,直播的时候也可以挂载这个小程序进行带货。   制作小程序一共

    2024年02月13日
    浏览(66)
  • WS2812B彩灯 STM32HAL库开发:PWM+DMA(stm32f103c8t6)

    目录 一、摘要 二、WS2812B介绍 三、CUBEMX配置 四、程序介绍(KEIL编译器) 五、数据手册         1、本文使用示例单片机型号为 stm32f103c8t6 ,RGB型号为 WS2812B ;          2、主要实现功能是实现用 PWM+DMA 使RGB_LED亮起不同颜色的灯光;         3、目的:简单调通该型号

    2024年02月03日
    浏览(49)
  • 原生小程序如何使用pdf.js实现查看pdf,以及关键词检索高亮

    前往 pdf.js 的 官网 下载库文件,下哪个版本都可以,后者适用于旧版浏览器,所以我下载的是后者 下载完成后,因为微信小程序打包的限制,我将库文件放到项目的后台系统了,在h5端处理会比在小程序端处理方便,最后就用web-view标签嵌入到小程序即可; 2.1、目录结构 2

    2024年02月01日
    浏览(54)
  • 关键词组合工具-自动关键词挖掘组成关键词软件免费

    组合工具,今天给大家分享一款免费的挖掘工具。自动挖掘流量,过滤无效。自动组成,组成标题。以及自动采集文章。详细参考图片 不少的网站能在相关的搜索引擎呈现的话,组合工具普通都会被这个搜索引擎所收录,不然也

    2023年04月08日
    浏览(68)
  • GPT关键词挖掘,自动关键词文章生成

    随着互联网的发展,内容营销已成为企业营销策略中不可或缺的一环。有效的文章生成可以帮助企业吸引更多的潜在客户,提高品牌曝光度和转化率,从而实现营销目标。 文章生成是指根据特定的和主题,使用软件工具自动生成相关的文章内容。与传统的

    2024年02月01日
    浏览(60)
  • 实现同时查找多个关键词——KeywordCrafter - 关键词匠心

    具体功能:同时查找多个,高亮加粗显示,并显示出现次数。 🧐碎碎念:最近在写文案的时候,总是要避免出现一个敏感词汇,利用 (command+F) or (Ctr+F) 查找,只能一个一个单词去查,很麻烦。🤷‍♂️ 所以我写了一个简单的网页,在文本框输入一整篇文章,在

    2024年02月13日
    浏览(74)
  • 长尾关键词挖掘软件-免费的百度搜索关键词挖掘

    嗨,大家好!今天,我想和大家聊一聊长尾挖掘工具。作为一个在网络世界里摸爬滚打多年的人,我对这个话题有着一些个人的感悟和见解,希望能与大家分享。 首先,让我坦白一点,长尾挖掘工具对于我来说真是救命稻草。在我刚开始做网站优化和内容创作的

    2024年02月09日
    浏览(96)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包