今天看到一位同學(xué)在群里面的留言,要我寫(xiě)一個(gè)長(zhǎng)串WS2812點(diǎn)亮的程序,因?yàn)闀r(shí)間不多,于是簡(jiǎn)單地寫(xiě)了一個(gè),該程序使用DMA+SPI2來(lái)發(fā)送數(shù)據(jù),使用的是環(huán)芯智能科技的開(kāi)發(fā)板(淘寶店鋪:環(huán)芯智能實(shí)驗(yàn)室),燈珠是淘寶買(mǎi)的,一共12顆。下面分享一下:
一、STM32CubeMX的設(shè)置
這里的設(shè)置主要是SPI模塊的設(shè)置,我們采用SPI模塊來(lái)發(fā)送顏色數(shù)據(jù)。其設(shè)置如下:
1.設(shè)置SPI的通信參數(shù),如圖1所示
圖1 SPI2的參數(shù)設(shè)置
2.SPI2的DMA的設(shè)置,如圖2所示
圖2 SPI2的DMA的設(shè)置
關(guān)于這些設(shè)置,我們?cè)赟PI接口和DMA中都已經(jīng)給出了詳細(xì)的解釋?zhuān)赃@里就不再啰嗦了。
二、主函數(shù)的內(nèi)容
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 */
}
主函數(shù)中實(shí)際上只有兩條語(yǔ)句是自己實(shí)現(xiàn),其他都由CubeMX生成。一條是定義12個(gè)燈珠的顏色數(shù)組,一個(gè)是調(diào)用顯示多個(gè)燈珠的函數(shù)。
三、WS2812模塊的內(nèi)容
首先來(lái)看ws2812.c的內(nèi)容,如下所示
#include "ws2812.h"
#define LED_NUM 12u //燈的數(shù)量
#define RESET_WORD 350u //復(fù)位長(zhǎng)度
#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中,我們實(shí)現(xiàn)一個(gè)轉(zhuǎn)換顏色數(shù)據(jù)并通過(guò)DMA發(fā)到到目標(biāo)燈串的函數(shù)。
ws2812.h的內(nèi)容如下:
#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
四、實(shí)驗(yàn)結(jié)果
最終的結(jié)果如圖3所示。
圖3 實(shí)驗(yàn)結(jié)果
五、電路連接
整個(gè)電路連接圖如圖4所示。
圖4 電路連接圖
3根線中,一根是5V,一根是地,還有一根是PB15(SPI2的MOSI接口)。
反復(fù)測(cè)試了幾次,效果還不錯(cuò)。
-
dma
+關(guān)注
關(guān)注
3文章
576瀏覽量
103248 -
GPIO
+關(guān)注
關(guān)注
16文章
1280瀏覽量
54096 -
SPI通信
+關(guān)注
關(guān)注
0文章
36瀏覽量
11667 -
WS2812
+關(guān)注
關(guān)注
0文章
33瀏覽量
6716 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
286瀏覽量
16267
發(fā)布評(píng)論請(qǐng)先 登錄
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】點(diǎn)亮WS2812點(diǎn)陣屏
【RA4L1-SENSOR】點(diǎn)亮 WS2812 全彩點(diǎn)陣屏
stm32F767 控制WS2812燈珠的問(wèn)題
WS2812B RGB全彩LED燈珠
【FireBeetle Board ESP32-E IoT 開(kāi)發(fā)板試用體驗(yàn)】WS2812彩色燈帶顯示效果
如何用ATtiny85控制WS2812燈珠
Arduino控制WS2812燈帶的方法
為什么用樹(shù)莓派驅(qū)動(dòng)WS2812燈珠會(huì)不亮呢
【BPI-Pico-RP2040 開(kāi)發(fā)板】+WS2812彩燈效果制作
如何進(jìn)行WS2812的面板燈制作詳細(xì)資料合集免費(fèi)下載

STM32F103C8T6+PWM+DMA驅(qū)動(dòng) WS2812燈帶

超小60位WS2812燈環(huán)

迪文屏控制WS2812氛圍燈

論如何使用WS2812以及類(lèi)似燈珠

評(píng)論