今天看到一位同學在群里面的留言,要我寫一個長串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
+關注
關注
3文章
582瀏覽量
106211 -
GPIO
+關注
關注
16文章
1332瀏覽量
56403 -
SPI通信
+關注
關注
0文章
41瀏覽量
11998 -
WS2812
+關注
關注
0文章
35瀏覽量
7173 -
stm32cubemx
+關注
關注
5文章
290瀏覽量
17458
發布評論請先 登錄
相關推薦
熱點推薦
【瑞薩RA6E2地奇星開發板試用】點亮 WS2812 全彩點陣屏
通過單總線方式控制,只需一個 IO 口,就可以點亮數千個燈珠。
這里使用 RA6E2 點亮 WS2812
發表于 12-27 03:28
如何用ATtiny85控制WS2812燈珠
文章目錄前言一、硬件1.引入庫二、軟件1.引入庫總結前言之前就答應過大家要把ATtiny85芯片玩出更多花樣。用ATtiny85控制WS2812燈珠,我們可以玩出花來,甚至做成點陣屏幕都可以。這一
發表于 12-10 07:12
Arduino控制WS2812燈帶的方法
形與一個5050LED燈珠相同,每個元件即為一個像素點。像素點內部包含了智能數字接口數據鎖存信號整形放大電路,還包括有高精度的內部振蕩器和可編程電流控制部分,有效保證了像素點的顏色高度一致。1)FastLED庫FastLED 是一款功能強大、簡單易用的控制
發表于 01-12 08:08
【BPI-Pico-RP2040 開發板】+WS2812彩燈效果制作
MAXIMUM_NUM_NEOPIXELS 7”時,使用7個燈珠的WS2812燈帶,則其顯示效果如圖9至圖11所示。圖9點亮綠色LED圖1
發表于 03-22 12:48
如何進行WS2812的面板燈制作詳細資料合集免費下載
本文檔的主要內容詳細介紹的是如何進行WS2812的面板燈制作詳細資料合集免費下載包括了:DMX512轉WS2812 面板燈程序,STC8系列單片機技術參考手冊,
發表于 05-29 17:36
?167次下載
STM32F103C8T6+PWM+DMA驅動 WS2812燈帶
#STM32+PWM+DMA驅動 WS2812燈帶#文章目錄1.理論:2代碼:理論:使用STM32F103C8T6驅動WS2812燈帶,每個燈
發表于 12-27 19:29
?226次下載
論如何使用WS2812以及類似燈珠
? ?WS2812 LED燈珠,這是一種非常流行的可尋址RGB LED。每個WS2812 LED內部集成了控制電路,因此可以通過一個數據輸入線來單獨控制每一個LED的顏色和亮度。這種特
多個WS2812燈珠的點亮實驗
評論