直接上代码
#define PIXEL_NUM 156
#define NUM (24*PIXEL_NUM + 300) // Reset 280us / 1.25us = 224
#define WS1 37
#define WS0 18
__attribute__((aligned(4))) uint32_t PwmBuf[NUM];
uint32_t WS281x_Color(uint8_t red, uint8_t green, uint8_t blue) { return red << 16 | green << 8 | blue; }
uint32_t Wheel(uint8_t WheelPos)
{
WheelPos = 255 - WheelPos;
if (WheelPos < 85)
{
return WS281x_Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170)
{
WheelPos -= 85;
return WS281x_Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return WS281x_Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void WS281x_SetPixelColor(uint16_t n, uint32_t GRBColor)
{
uint8_t i;
if (n < PIXEL_NUM)
{
for (i = 0; i < 24; ++i)
PwmBuf[24 * n + i] = (((GRBColor << i) & 0X800000) ? WS1 : WS0);
}
}
void ws281x_rainbowCycle(uint8_t wait)
{
uint16_t i, j;
//for(j=0; j<256*5; j++)
{ // 5 cycles of all colors on wheel
// for(i=0; i< PIXEL_NUM; i++) {
//
// WS281x_SetPixelColor(i,Wheel(((i * 256 / PIXEL_NUM) + j) & 255));
// }
//DelayMs(1);
}
}
void WS2812B_Init(void)
{
GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP_5mA);
GPIOPinRemap(ENABLE, RB_PIN_TMR2);
PRINT("TMR2 DMA PWM\n");
TMR2_PWMCycleCfg(75); // 周期 1.25us
TMR2_DMACfg(ENABLE, (uint16_t)(uint32_t)&PwmBuf[0], (uint16_t)(uint32_t)&PwmBuf[NUM], Mode_LOOP);
TMR2_PWMInit(High_Level, PWM_Times_1);
/* 开启计数溢出中断,计满1000个周期进入中断 */
TMR2_ClearITFlag(TMR1_2_IT_DMA_END);
PFIC_EnableIRQ(TMR2_IRQn);
TMR2_ITCfg(ENABLE, TMR1_2_IT_DMA_END);
TMR2_PWMEnable();
TMR2_Enable();
}