11-多個WS2812燈珠的點亮
今天看到一位同學在群里面的留言,要我寫一個長串WS2812點亮的程序,因為時間不多,于是簡單地寫了一個,該程序使用DMA+SPI2來發(fā)送數據,使用的是環(huán)芯智能科技的開發(fā)板(淘寶店鋪:環(huán)芯智能實驗室),燈珠是淘寶買的,一共12顆。下面分享一下:
一、STM32CubeMX的設置
這里的設置主要是SPI模塊的設置,我們采用SPI模塊來發(fā)送顏色數據。其設置如下:
1.設置SPI的通信參數,如圖1所示

2.SPI2的DMA的設置,如圖2所示

關于這些設置,我們在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 */
}
?
主函數中實際上只有兩條語句是自己實現(xiàn),其他都由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中,我們實現(xiàn)一個轉換顏色數據并通過DMA發(fā)到到目標燈串的函數。
?
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所示。

五、電路連接
整個電路連接圖如圖4所示。

3根線中,一根是5V,一根是地,還有一根是PB15(SPI2的MOSI接口)。
?
反復測試了幾次,貌似正確。
更多信息可以關注公眾號:?? O老師講32?
或者直接掃碼添加
