資源簡介
該資源包含了連個文件,分別是.c和.h,可以實現stm32f103c8t6開發板控制24位WS2812 5050RGB燈圈,其中燈個數可隨意修改,在拿到文件后不能很好控制RGB燈時,需自行拿邏輯分析儀測出1,0碼所需的延時時間。

代碼片段和文件信息
#include?“led.h“
#include?“delay.h“//滴答時鐘系統延時相關頭文件,自行添加。因為下面函數中用到了Delay_us操作,不用系統滴答的話,可用自定義的延時函數HAL_Delay
??//不過延時數值要盡量大一些最好用邏輯分析儀測一下時長
/*
WS2812?5050RGBLED燈是一款可級聯無限個的,內置處理芯片的,由10時序控制的,色彩控制及呈現良好的燈
其10碼對時間的要求相對苛刻,在選型處理器時一定要注意,處理器的處理頻率是否達到所需控制量級,像一
般的51單片機是不能很好的控制這款燈的,但一般M系列內核的處理器都可以,當然集成51內核的還有很多處理
速度相對高一點的芯片,本人沒有做過相應測試,但看到10碼所需的納秒級別就知道處理器的處理速度不能太
小。
?*/
void??led_init(void)
{
GPIO_InitTypeDef?GPIO_InitStructure;
//PA0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB?ENABLE?);
GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin??=?GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_50MHz;
GPIO_Init(GPIOB?&GPIO_InitStructure);
WS2812?=?1;
}
?
#define?numLEDs?24???//燈的個數
unsigned?char?buf_R[numLEDs]?=?{0};//顏色緩沖
unsigned?char?buf_G[numLEDs]?=?{0};
unsigned?char?buf_B[numLEDs]?=?{0};
?
void?RGB_Set_Up();??//送0碼
void?RGB_Set_Down();?//送1碼
?
?
?
void?HAL_Delay(unsigned?int?t)
{
while(t--);
}
?
//1碼高電平850ns?低電平400ns?誤差正負150ns
void?RGB_Set_Up()
{
//這里要直接對寄存器進行操作,是因為WS2812?5050RGB燈對時間要求非常苛刻,對寄存器直接操作可以降低使用庫函數處理時耗損時間的影響
GPIOB->BSRR?=?0x01;
//經過邏輯分析儀調試的延時,這個很重要,不同的MPU其處理速度不同,需用邏輯分析儀獲得這個延時時長是否達到要求,下同。
HAL_Delay(4);
GPIOB->BRR??=?0x01;
HAL_Delay(1);
__nop;
}
?
//1碼高電平400ns?低電平850ns?誤差正負150ns
void?RGB_Set_Down()
{
GPIOB->BSRR?=?0x01;
??//經過邏輯分析儀調試的延時
HAL_Delay(1);
GPIOB->BRR??=?0x01;
HAL_Delay(2);
}
?
//發送24位數據
void?Send_2811_24bits(unsigned?char?G8unsigned?char?R8unsigned?char?B8)
{
??
??unsigned?int?n?=?0;
??//發送G8位
for(n=0;n<8;n++)
{
G8<<=n;
if(G8&0x80?==?0x80)
{
RGB_Set_Up();
}
else??
{
??RGB_Set_Down();
}
}
//發送R8位
for(n=0;n<8;n++)
{
R8<<=n;
if(R8&0x80?==?0x80)
{
RGB_Set_Up();
}
else??
{
RGB_Set_Down();
}
}
//發送B8位
??for(n=0;n<8;n++)
{
B8<<=n;
if(B8&0x80?==?0x80)
{
RGB_Set_Up();
}
else??
{
??RGB_Set_Down();
}
}
}
//復位碼
void?RGB_Rst()
{
WS2812?=?0;
Delay_us(50);
}
//把24位數據GRB碼轉RGB
void?Set_Colour(unsigned?char?runsigned?char?gunsigned?char?b)
{
??unsigned?char?i;
for(i=0;i ??{
??buf_R[i]?=?r;?//緩沖
??buf_G[i]?=?g;
??buf_B[i]?=?b;
}
for(i=0;i {
Send_2811_24bits(buf_G[i]buf_R[i]buf_B[i]);//????
}
}
//某一個點顯示的顏色
void?SetPointColour(unsigned?int?numunsigned?char?runsigned?char?gunsigned?char?b)
{
??unsigned?char?i;
for(i=0;i ??{
buf_R[num]?=?r;//??
??buf_G[num]?=?g;
??buf_B[num]?=?b;
}
for(i=0;i {
Send_2811_24bits(buf_G[i]buf_R[i]buf_B[i]);//????
}
}
?
//顏色交換24位不拆分發
void?SetPixelColor(unsigned?char?numunsigned?long?c)
{
??unsigned?char?i;
for(i=0;i ??{
buf_R[num]?=?(unsigned?char)(c>>16);
??buf_G[num]?=?(unsigned?char)(c>>8);
??buf_B[num]?=?(unsigned?char)(c);
}
for(i=0;i
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2019-01-09?11:28??WS2812_RGBLED\
?????文件????????6516??2019-01-09?12:03??WS2812_RGBLED\led.c
?????文件????????1226??2019-01-09?11:43??WS2812_RGBLED\led.h
- 上一篇:deap2.1軟件教程
- 下一篇:游戲編程中的尋路算法研究
評論
共有 條評論