标题:
stm32单片机控制ws2812b灯带的灯数 程序问题
[打印本页]
作者:
6377377
时间:
2023-3-13 20:29
标题:
stm32单片机控制ws2812b灯带的灯数 程序问题
从哔哩哔哩上找了一个代码,修改了代码灯的数量以及其它的变量,但还是出错了,请教一下这该怎么改
原作者代码
#include "stm32f10x.h"
#include "timer.h"
#include "DMA1.h"
#include "time.h"
#include "WS2812B.h"
#define WS2812B_LED_QUANTITY 60
uint32_t WS2812B_Buf[WS2812B_LED_QUANTITY]; //0xGGRRBB ws2812b每个灯颜色共60个元素数组、、定义一个以灯珠数的大数组用于存放每个灯的grb值
uint16_t WS2812B_Bit[24*WS2812B_LED_QUANTITY+1];/62812b每一位比较值数组共24*60个元 素、、定义一个数组用于存放每个灯的每个位的值
uint8_t WS2812B_Flag;
void WS2812B_IRQHandler(void);
void WS2812B_Init(void)
{
DMA1_SetIRQHandler(WS2812B_IRQHandler);
DMA1_Init((uint32_t)(&WS2812B_Bit));
// TIM2_Init();
TIM2_Int_Init(90-1,0);
}
void WS2812B_ClearBuf(void)
{
uint8_t i;
for(i=0;i<WS2812B_LED_QUANTITY;i++)
{
WS2812B_Buf[i]=0x000000;
}
}
void WS2812B_SetBuf(uint32_t Color)
{
uint8_t i;
for(i=0;i<WS2812B_LED_QUANTITY;i++)
{
WS2812B_Buf[i]=Color;
}
}
void WS2812B_UpdateBuf(void)
{
uint8_t i,j;
for(j=0;j<WS2812B_LED_QUANTITY;j++)
{
for(i=0;i<24;i++)
{
if(WS2812B_Buf[j]&(0x800000>>i)){WS2812B_Bit[j*24+i+1]=60;}
else{WS2812B_Bit[j*24+i+1]=30;}
}
}
DMA1_Init((uint32_t)(&WS2812B_Bit));//new
DMA1_Start(24*WS2812B_LED_QUANTITY+1);
TIM2_Cmd(ENABLE);
while(WS2812B_Flag==0);
WS2812B_Flag=0;
}
void WS2812B_IRQHandler(void)
{
TIM2_SetCompare1(0);//设置tim2 ccr寄存器为0
TIM2_Cmd(DISABLE);//关闭tim2
WS2812B_Flag=1;
}
修改后的代码
#include "stm32f10x.h"
#include "timer.h"
#include "DMA1.h"
#include "time.h"
#include "WS2812B.h"
#define WS2812B_LED_QUANTITY 300
uint32_t WS2812B_Buf[WS2812B_LED_QUANTITY]; //0xGGRRBB ws2812b每个灯颜色共300个元素数组、、定义一个以灯珠数的大数组用于存放每个灯的grb值
uint16_t WS2812B_Bit[24*WS2812B_LED_QUANTITY+1];/62812b每一位比较值数组共24*300个元 素、、定义一个数组用于存放每个灯的每个位的值
uint8_t WS2812B_Flag;
void WS2812B_IRQHandler(void);
void WS2812B_Init(void)
{
DMA1_SetIRQHandler(WS2812B_IRQHandler);
DMA1_Init((uint32_t)(&WS2812B_Bit));
// TIM2_Init();
TIM2_Int_Init(90-1,0);
}
void WS2812B_ClearBuf(void)
{
uint16_t i;
for(i=0;i<WS2812B_LED_QUANTITY;i++)
{
WS2812B_Buf[i]=0x000000;
}
}
void WS2812B_SetBuf(uint32_t Color)
{
uint16_t i;
for(i=0;i<WS2812B_LED_QUANTITY;i++)
{
WS2812B_Buf[i]=Color;
}
}
void WS2812B_UpdateBuf(void)
{
uint16_t i,j;
for(j=0;j<WS2812B_LED_QUANTITY;j++)
{
for(i=0;i<24;i++)
{
if(WS2812B_Buf[j]&(0x800000>>i)){WS2812B_Bit[j*24+i+1]=60;}
else{WS2812B_Bit[j*24+i+1]=30;}
}
}
DMA1_Init((uint32_t)(&WS2812B_Bit));//new
DMA1_Start(24*WS2812B_LED_QUANTITY+1);
TIM2_Cmd(ENABLE);
while(WS2812B_Flag==0);
WS2812B_Flag=0;
}
void WS2812B_IRQHandler(void)
{
TIM2_SetCompare1(0);//设置tim2 ccr寄存器为0
TIM2_Cmd(DISABLE);//关闭tim2
WS2812B_Flag=1;
}
复制代码
作者:
Mu_yan
时间:
2023-10-23 14:54
可能是超出内存了
作者:
powerdruy
时间:
2023-10-26 18:09
DMA的buffer长度跟要发数据的长度匹配上了吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1