0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

多个WS2812灯珠的点亮实验

冬至子 来源:O老师讲32 作者:O老师 2023-10-24 14:51 次阅读

今天看到一位同学在群里面的留言,要我写一个长串WS2812点亮的程序,因为时间不多,于是简单地写了一个,该程序使用DMA+SPI2来发送数据,使用的是环芯智能科技的开发板(淘宝店铺:环芯智能实验室),灯珠是淘宝买的,一共12颗。下面分享一下:

一、STM32CubeMX的设置

这里的设置主要是SPI模块的设置,我们采用SPI模块来发送颜色数据。其设置如下:

1.设置SPI的通信参数,如图1所示

图片

图1 SPI2的参数设置

2.SPI2的DMA的设置,如图2所示

图片

图2 SPI2的DMA的设置

关于这些设置,我们在SPI接口和DMA中都已经给出了详细的解释,所以这里就不再啰嗦了。

二、主函数的内容

int main(void)
{
  /* USER CODE BEGIN 1 */
      uint32_t col[12] = {0xff,0x00ff00,0xff0000,0xffffff,0xfff, 0xfff0,0xfff000,0xffffff,0xff0000,0xf00,0x0f0,0xfff0};
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config(); 
  /* USER CODE BEGIN SysInit */ 
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SPI2_Init();
  /* USER CODE BEGIN 2 */
      WS2812_ShowMany_GRB(col, sizeof(col));
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

主函数中实际上只有两条语句是自己实现,其他都由CubeMX生成。一条是定义12个灯珠的颜色数组,一个是调用显示多个灯珠的函数。

三、WS2812模块的内容

首先来看ws2812.c的内容,如下所示

#include "ws2812.h"        
#define LED_NUM     12u          //灯的数量
#define RESET_WORD  350u         //复位长度
#define SPI_DATALEN (RESET_WORD + 24u*LED_NUM) 
extern SPI_HandleTypeDef hspi2;
uint8_t buf[SPI_DATALEN] = {0};
/******************************************************/
void WS2812_ShowMany_GRB(uint32_t grb[], uint8_t num)
{
      uint16_t i = 0, j = 0;
      for(i = 0; i < num; i++ )
      {
            for(j = 0; j < 24u; j ++)
            {
                  if(grb[i] & (1< < (23u -j)))
                        buf[RESET_WORD + i*24u+j] = CODE_1;
                  else
                        buf[RESET_WORD + i*24u+j] = CODE_0;
            }           
      }     
      HAL_SPI_Transmit_DMA(&hspi2, buf, sizeof(buf));
}
/******************************************************/

在ws2812.c中,我们实现一个转换颜色数据并通过DMA发到到目标灯串的函数。

ws2812.h的内容如下:

#ifndef _WS2812_H
#define _WS2812_H
#include "main.h"
#define CODE_1 0XFC
#define CODE_0 0XC0       
void WS2812_ShowMany_GRB(uint32_t grb[], uint8_t num);
#endif

四、实验结果

最终的结果如图3所示。

图片

图3 实验结果

五、电路连接

整个电路连接图如图4所示。

图片

图4 电路连接图

3根线中,一根是5V,一根是地,还有一根是PB15(SPI2的MOSI接口)。

反复测试了几次,效果还不错。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99027
  • GPIO
    +关注

    关注

    16

    文章

    1135

    浏览量

    50578
  • SPI通信
    +关注

    关注

    0

    文章

    33

    浏览量

    11264
  • WS2812
    +关注

    关注

    0

    文章

    30

    浏览量

    5722
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14448
收藏 人收藏

    评论

    相关推荐

    stm32F767 控制WS2812的问题

    使用stm32F767 PWM+DMA控制108个WS2812, 第一个颜色有时不正常,其它
    发表于 08-19 17:43

    WS2812实时时钟程序

    文件名大小更新时间WS2812实时时钟程序\APP\24Cxx\24cxx.c54102019-04-05WS2812实时时钟程序\APP\24Cxx
    发表于 07-13 07:33

    WS2812B RGB全彩LED

    WS2812B RGB全彩LED,只需通过一根信号线控制多个显示,本教程使用X-CTR100控制器驱动
    发表于 08-06 08:15

    【FireBeetle Board ESP32-E IoT 开发板试用体验】WS2812彩色灯带显示效果

    ?后经测试,证明该是基于WS2812的显示器件。由图1的原理图可知,其控制引脚为IO5。图1WS2812连接关系对于这个器件我们该如何来使用它呢?为了在ArduinoIDE的环境下
    发表于 08-28 23:41

    如何用ATtiny85控制WS2812

    文章目录前言一、硬件1.引入库二、软件1.引入库总结前言之前就答应过大家要把ATtiny85芯片玩出更多花样。用ATtiny85控制WS2812,我们可以玩出花来,甚至做成点阵屏幕都可以。这一
    发表于 12-10 07:12

    用STM32控制WS2812 RGB带的代码分享

    用STM32控制WS2812 RGB带的代码分享
    发表于 12-15 07:09

    Arduino控制WS2812带的方法

    形与一个5050LED相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大电路,还包括有高精度的内部振荡器和可编程电流控制部分,有效保证了像素点的颜色高度一致。1)FastLED库FastLED 是一款功能强大、简单易用的控制
    发表于 01-12 08:08

    为什么用树莓派驱动WS2812会不亮呢

    为什么用树莓派驱动WS2812会不亮呢?是什么原因?如何解决?
    发表于 01-18 06:11

    WS2812硬件电路设计资料分享

    WS2812硬件电路设计小菜鸡的第一篇的CSDN文章,冲冲冲!!!设计目标:1.RGB可实现多种效,可通过按键切换;2.RGB亮度可调节;3.选用蓝牙或者wifi模块,通过手机远
    发表于 02-11 08:00

    STM32F103C8T6+PWM+DMA驱动WS2812带的方法

    #STM32+PWM+DMA驱动 WS2812带#文章目录1.理论:2代码:理论:使用STM32F103C8T6驱动WS2812带,每个
    发表于 02-22 06:59

    自制60位WS2812

    描述60位WS2812环超小60位WS2812环可作为超小时钟采用2020环圈只有36mm不到目前市60位环半径78毫米的双面铺铜上层
    发表于 09-01 07:11

    【BPI-Pico-RP2040 开发板】+WS2812彩灯效果制作

    MAXIMUM_NUM_NEOPIXELS 7”时,使用7个WS2812带,则其显示效果如图9至图11所示。图9点亮绿色LED图1
    发表于 03-22 12:48

    STM32使用LL库PWM的DMA模式驱动ws2812

    STM32使用LL库PWM的DMA模式驱动ws2812一、WS2812简介二、CUBEMX初始化代码配置一、WS2812简介给个链接吧,ws2812时序简介
    发表于 11-30 10:21 63次下载
    STM32使用LL库PWM的DMA模式驱动<b class='flag-5'>ws2812</b>

    超小60位WS2812灯环

    电子发烧友网站提供《超小60位WS2812灯环.zip》资料免费下载
    发表于 08-12 09:58 20次下载
    超小60位<b class='flag-5'>WS2812</b>灯环

    最简WS2812类似RGB灯条驱动方法

    最简WS2812类似RGB灯条驱动方法
    的头像 发表于 06-19 17:51 2454次阅读
    最简<b class='flag-5'>WS2812</b>类似RGB灯条驱动方法