最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

11-多個WS2812燈珠的點亮

2023-03-06 11:05 作者:O老師講32  | 我要投稿

今天看到一位同學在群里面的留言,要我寫一個長串WS2812點亮的程序,因為時間不多,于是簡單地寫了一個,該程序使用DMA+SPI2來發(fā)送數據,使用的是環(huán)芯智能科技的開發(fā)板(淘寶店鋪:環(huán)芯智能實驗室),燈珠是淘寶買的,一共12顆。下面分享一下:

一、STM32CubeMX的設置

這里的設置主要是SPI模塊的設置,我們采用SPI模塊來發(fā)送顏色數據。其設置如下:

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 */

}

?

主函數中實際上只有兩條語句是自己實現(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所示。

圖3 實驗結果

五、電路連接

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

圖4 電路連接圖

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

?

反復測試了幾次,貌似正確。

更多信息可以關注公眾號:?? O老師講32?

或者直接掃碼添加


11-多個WS2812燈珠的點亮的評論 (共 條)

分享到微博請遵守國家法律
泊头市| 大新县| 东兴市| 垦利县| 安图县| 敦煌市| 新邵县| 陈巴尔虎旗| 沛县| 津南区| 浏阳市| 高邮市| 彩票| 蒙山县| 吴桥县| 隆德县| 万载县| 旅游| 杭锦旗| 宁化县| 土默特右旗| 永安市| 汶川县| 蒲江县| 景宁| 龙泉市| 遂平县| 鞍山市| 商水县| 如皋市| 平山县| 商河县| 连平县| 哈巴河县| 长顺县| 信宜市| 安塞县| 定安县| 邵阳县| 乌拉特中旗| 兴安盟|