国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32C0開發(fā)(1)----SPI 驅(qū)動WS2812燈珠

這篇具有很好參考價值的文章主要介紹了STM32C0開發(fā)(1)----SPI 驅(qū)動WS2812燈珠。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

概述

本文介紹了如何使用STM32微控制器,結(jié)合STM32CubeMX配置工具和SPI通訊接口,來驅(qū)動和控制WS2812 LED燈帶。這是一個集硬件連接、軟件配置和編程開發(fā)于一體的綜合性項目,目標(biāo)是實現(xiàn)對LED燈帶顏色和亮度的精確控制。

最近在弄ST的課程,需要樣片的可以加群申請:615061293 。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

視頻教學(xué)

https://www.bilibili.com/video/BV1X94y157W8/

STM32C0開發(fā)(1)----SPI 驅(qū)動WS2812燈珠

樣品申請

https://www.wjx.top/vm/OhcKxJk.aspx#

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

源碼下載

https://download.csdn.net/download/qq_24312945/88489586

芯片級聯(lián)方法

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

芯片在上電復(fù)位以后,接收DIN端打來的數(shù)據(jù),接收夠24bit后,DO端口開始轉(zhuǎn)發(fā)數(shù)據(jù),供下一個芯片提供輸入數(shù)據(jù)。在轉(zhuǎn)發(fā)之前,DO口一直拉低。此時燈珠將不接收新的數(shù)據(jù),內(nèi)置RGB芯片根據(jù)接收到的24bit數(shù)據(jù)后產(chǎn)生的不同占空比信號,展現(xiàn)不同亮度。如果DIN端輸入信號為RESET信號,芯片將接收到的數(shù)據(jù)送顯示,芯片將在該信號結(jié)束后重新接收新的數(shù)據(jù),在接收完開始的24bit數(shù)據(jù)后,通過DO口轉(zhuǎn)發(fā)數(shù)據(jù),燈珠在沒有接收到RESET碼前,RGB亮度保持不變,當(dāng)接收到80us以上低電平RESET碼后,燈珠內(nèi)部RGB芯片將根據(jù)剛才接收到的24bit數(shù)據(jù)后產(chǎn)生的不同占空比信號,展現(xiàn)不同亮度。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

數(shù)據(jù)傳輸

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi
24bit數(shù)據(jù)結(jié)構(gòu):

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

時序

時序波形圖如下所示。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi
spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

SPI配置

將SPI的配置速度設(shè)為6M,數(shù)據(jù)寬度設(shè)為8位。
CPHA配置為第二邊沿采樣;在第一個跳變沿時,MOSI在空閑狀態(tài)保持高電平,而在第二個跳變沿,它會保持上一次傳輸?shù)淖罱K電平。由于發(fā)送數(shù)據(jù)的最后一位總是低電平,這樣配置可以避免WS2812誤判。CPOL設(shè)置為高,確保SCK在空閑時保持高電平狀態(tài)。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

系統(tǒng)采用單總線協(xié)議,通過總線上高低電平的時長來區(qū)分邏輯0和1。WS2811工作在800kHz頻率下,將SPI設(shè)置為6.4MHz—即其工作頻率的8倍—可以確保每個字節(jié)(8位)正好對應(yīng)一個邏輯位。在這種設(shè)置下,‘11111000’(0xF8)代表邏輯1,‘11000000’(0xC0)代表邏輯0。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

邏輯0下發(fā)送的數(shù)據(jù)為11000000’(0xC0)。
邏輯0下高電平位320ns。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

邏輯0下低電平位1.01us。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

邏輯1下發(fā)送的數(shù)據(jù)為‘11111000’(0xF8)。
邏輯1下高電平位830ns。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi
邏輯1下低電平位500ns。
spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

這種精確的時序配置和電平控制對于確保WS2812燈帶的正確驅(qū)動至關(guān)重要,可以通過上述配置來優(yōu)化SPI接口的性能,確保與WS2812的高效通信。

CPHA配置

CPHA配置為第二邊沿采樣下數(shù)據(jù)傳輸結(jié)束如下所示。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi
CPHA配置為第二邊沿采樣下數(shù)據(jù)傳輸結(jié)束如下所示。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

由于RESET Code為低電平,且要大于80us,所以數(shù)據(jù)傳輸完畢必須為低電平。

spi ws2812驅(qū)動程序詳解,stm32cube,單片機(jī),STM32CUBEMX,stm32c0,ws2812,rgb555,spi

代碼

在main.c中添加頭文件。

/* USER CODE BEGIN Includes */
#include "ws2812.h"
#include <string.h>
/* USER CODE END Includes */

在main.c中添加函數(shù)申明和移位操作。

/* USER CODE BEGIN 0 */
extern tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT];

void move_Front()
{
	uint8_t i;
	uint8_t temp[3];
	temp[0] = gWs2812bDat[0].R;
	temp[1] = gWs2812bDat[0].G;
	temp[2] = gWs2812bDat[0].B;	
	for (i = 0; i < WS2812B_AMOUNT-1; i++)
	{
		gWs2812bDat[i].R = gWs2812bDat[i+1].R;
		gWs2812bDat[i].G = gWs2812bDat[i+1].G;
		gWs2812bDat[i].B = gWs2812bDat[i+1].B;
	}
		gWs2812bDat[7].R = temp[0];
		gWs2812bDat[7].G = temp[1];
		gWs2812bDat[7].B = temp[2];
}


/* USER CODE END 0 */

添加初始化顯示。

  /* USER CODE BEGIN 2 */
	WS2812B_Task();
	HAL_Delay(1000);
  /* USER CODE END 2 */

添加流水燈。文章來源地址http://www.zghlxwxcb.cn/news/detail-761182.html

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	WS2812B_Task();	
	move_Front();
	HAL_Delay(100);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

ws2812.c

#include "ws2812.h"
#include "spi.h"

//燈條顯存SPI數(shù)據(jù)緩存
uint8_t gWs2812bDat_SPI[WS2812B_AMOUNT * 24] = {0};	
//燈條顯存
tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT] = {

//R    G      B
0XFF, 0X00, 0X00,	//0
0X00, 0XFF, 0X00,	//1
0X00, 0X00, 0XFF,	//2
0X00, 0XFF, 0XFF,	//3
0XFF, 0X00, 0XFF,	//4
0XFF, 0XFF, 0X00,	//5
0XFF, 0XFF, 0XFF,	//6
0X00, 0X00, 0X00,	//7
};
		
void WS2812b_Set(uint16_t Ws2b812b_NUM, uint8_t r,uint8_t g,uint8_t b)
{
	uint8_t *pR = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24 + 8];
	uint8_t *pG = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24];
	uint8_t *pB = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24 + 16];
	
	for(uint8_t i = 0; i <  8; i++) {
		if(g & 0x80) {
			*pG = CODE_1;
		}           
		else {           
			*pG = CODE_0;
		}           
		if(r & 0x80) {           
			*pR = CODE_1;
		}           
		else {           
			*pR = CODE_0;
		}           
		if(b & 0x80) {           
			*pB = CODE_1;
		}           
		else {           
			*pB = CODE_0;
		}
		r <<= 1;
		g <<= 1;
		b <<= 1;
		pR++;
		pG++;
		pB++;
	}
}
void WS2812B_Task(void)
{
	uint8_t dat = 0;
	
	//將gWs2812bDat數(shù)據(jù)解析成SPI數(shù)據(jù)
	for(uint8_t iLED = 0; iLED < WS2812B_AMOUNT; iLED++)
	{
		WS2812b_Set(iLED, gWs2812bDat[iLED].R, gWs2812bDat[iLED].G, gWs2812bDat[iLED].B);
	}
	//總線輸出數(shù)據(jù)
	HAL_SPI_Transmit(&hspi1, gWs2812bDat_SPI, sizeof(gWs2812bDat_SPI),0XFFFF);
	//使總線輸出低電平
	HAL_SPI_Transmit(&hspi1, &dat, 1,0XFFFF);
	//幀信號:一個大于50us的低電平
	HAL_Delay(1);	
}

ws2812.h

#ifndef __WS2812_H__
#define __WS2812_H__

#include <stdint.h>

//            編碼 0 : 11000000
#define CODE_0		0xC0
//            編碼 1 : 11111000
#define CODE_1		0xF8
/*ws2812b燈珠數(shù)量*/
#define WS2812B_AMOUNT		8

typedef struct
{
	uint8_t R;
	uint8_t G;
	uint8_t B;
} tWs2812bCache_TypeDef;

extern tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT];

void WS2812b_Set(uint16_t Ws2b812b_NUM, uint8_t r,uint8_t g,uint8_t b);
void WS2812B_Task(void);

#endif

到了這里,關(guān)于STM32C0開發(fā)(1)----SPI 驅(qū)動WS2812燈珠的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • LL庫實現(xiàn)SPI MDA發(fā)送方式驅(qū)動WS2812

    LL庫實現(xiàn)SPI MDA發(fā)送方式驅(qū)動WS2812

    1,首先打卡STM32CubeMX,配置一下工程,這里使用的芯片是STM32F030F4P6。 ? 時鐘 SPI外設(shè) ?SPI DMA 下載接口,這個不配置待會下程序后第二次就不好下載調(diào)試了。 ?工程配置,沒啥說的 ?選擇生成所有文件 ?將驅(qū)動都改為LL庫 然后直接點擊?General Code 2,初始化dma: ?這里卡了一會

    2024年02月12日
    瀏覽(17)
  • (STM32筆記5)ws2812驅(qū)動開發(fā)

    (STM32筆記5)ws2812驅(qū)動開發(fā)

    ws2812 需要開發(fā)的外設(shè):ws2812 開發(fā)環(huán)境:MDK 開發(fā)板:stm32最小系統(tǒng)板 杜邦線無數(shù) 一、原理闡述 (一) 這個ws2812有很多種,一個小燈、燈帶,矩形像素屏等等。 這些都是DIN連接輸入,DOUT連接輸出,另外兩個引腳是GNE和VCC ? (二) 數(shù)據(jù)傳輸原理: 第1個WS2812B燈珠接收到了第1個

    2024年01月19日
    瀏覽(23)
  • 【STM32】BLDC驅(qū)動&控制開發(fā)筆記 | 07_SPI通信測試 - STM32F407用SPI配置DRV8323驅(qū)動芯片

    【STM32】BLDC驅(qū)動&控制開發(fā)筆記 | 07_SPI通信測試 - STM32F407用SPI配置DRV8323驅(qū)動芯片

    最近在埋頭搞STM32 + 無刷直流電機(jī)控制,想實現(xiàn)用自己的STM32F407VGT6芯片板子,外加一塊驅(qū)動板(目前選用到TI的DRV8302或者DRV8323驅(qū)動芯片),搞定電機(jī)驅(qū)動,最后實現(xiàn)比較好的控制效果。如果不是同一塊芯片的同學(xué)也不用急著走,大體上都是可借鑒噠~ 本文主要實現(xiàn)使用SPI通信

    2024年02月08日
    瀏覽(35)
  • STM32驅(qū)動全彩LED燈模塊WS2812

    STM32驅(qū)動全彩LED燈模塊WS2812

    WS2812全彩LED燈模塊系列,可以進(jìn)行級聯(lián)實現(xiàn)燈帶的效果,MCU端通過一個管腳可以控制所有級聯(lián)的LED燈的不同發(fā)光顏色顯示。 WS2811(未集成LED)的級聯(lián)電路如下所示: WS2812(集成LED)的級聯(lián)電路如下所示: STM32是3.3V供電芯片,輸出Push-Pull模式只有3.3V,WS2812采用5V供電,輸入Vi

    2024年01月17日
    瀏覽(21)
  • STM32+PWM+DMA驅(qū)動WS2812彩燈模塊(附源碼)

    STM32+PWM+DMA驅(qū)動WS2812彩燈模塊(附源碼)

    WS2812是一顆數(shù)字LED燈珠,采用單總線通訊,每顆燈珠支持24bit的顏色控制,也即RGB888,信號線通過DIN輸入,經(jīng)過一顆燈珠之后,信號線上前24bit數(shù)據(jù)會被該燈珠鎖存,之后將剩下的數(shù)據(jù)信號整形之后通過DOUT輸出 C1為VDD的濾波電容,一般大小為100NF。 WS2812.c pwm.c DMA.c main.c 需要源

    2024年02月15日
    瀏覽(23)
  • STM32H5開發(fā)(6)----SPI驅(qū)動TFT-LCD屏

    STM32H5開發(fā)(6)----SPI驅(qū)動TFT-LCD屏

    在嵌入式領(lǐng)域,TFT-LCD屏是最常用的顯示解決方案之一,因為它們提供了豐富的顏色和高分辨率的圖像顯示能力。STM32H5作為ST的高性能微控制器系列,具備了強(qiáng)大的處理能力和多種通信接口,非常適合于驅(qū)動TFT-LCD顯示屏,該液晶屏st7796或者ILI9488驅(qū)動芯片,這兩個屏幕都是兼容

    2024年02月05日
    瀏覽(30)
  • 電子模塊|外控集成 LED 光源 WS2812模塊---硬件介紹和stm32驅(qū)動

    電子模塊|外控集成 LED 光源 WS2812模塊---硬件介紹和stm32驅(qū)動

    WS2812是一個集控制電路與發(fā)光電路于一體的智能外控LED光源。其外型與一個5050LED燈珠相同,每個元件即為一個像素點。像素點內(nèi)部包含了智能數(shù)字接口數(shù)據(jù)鎖存信號整形放大驅(qū)動電路,還包含有高精度的內(nèi)部振蕩器和12V高壓可編程定電流控制部分,有效保證了像素點光的顏色

    2024年02月10日
    瀏覽(24)
  • STM32+PWM+DMA驅(qū)動WS2812彩燈模塊(評論點贊給源代碼)

    STM32+PWM+DMA驅(qū)動WS2812彩燈模塊(評論點贊給源代碼)

    WS2812是一顆數(shù)字LED燈珠,采用單總線通訊,每顆燈珠支持24bit的顏色控制,也即RGB888,信號線通過DIN輸入,經(jīng)過一顆燈珠之后,信號線上前24bit數(shù)據(jù)會被該燈珠鎖存,之后將剩下的數(shù)據(jù)信號整形之后通過DOUT輸出 C1為VDD的濾波電容,一般大小為100NF。 WS2812.c pwm.c DMA.c main.c 需要源

    2024年04月23日
    瀏覽(55)
  • STM32G0 定時器PWM DMA輸出驅(qū)動WS2812配置 LL庫

    STM32G0 定時器PWM DMA輸出驅(qū)動WS2812配置 LL庫

    優(yōu)點:不消耗CPU資源 缺點:占用內(nèi)存較大 定時器配置 定時器通道:TIM3 CH2 分頻:0 重裝值:79,芯片主頻64Mhz,因此PWM輸出頻率:64Mhz/79 ≈ 800Khz,滿足芯片要求。 auto-reload preload 要關(guān)閉 output compare preload 要打開 DMA配置 外設(shè)一定要選擇TIM3_UP,不要選TIM_CHx 方向是內(nèi)存到外設(shè),

    2024年02月10日
    瀏覽(118)
  • STM32 HAL庫 PWM+DMA 驅(qū)動WS2812B彩燈(STM32F030F4P6)

    STM32 HAL庫 PWM+DMA 驅(qū)動WS2812B彩燈(STM32F030F4P6)

    博主使用STM32驅(qū)動WS2812B主要參考了這位佬的文章,因為需求問題,采用了Cortex-M0的stm32f030f4p6(16k的flash,4k的sram)來驅(qū)動,原文中寫的是stm32f103c8t6,個人認(rèn)為其實區(qū)別并不是很大,需要修改部分參數(shù)即可移植(cv戰(zhàn)士申請出戰(zhàn))。 上圖是我的一圈燈,一共8個,第一個LED的數(shù)

    2024年02月06日
    瀏覽(48)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包