/****************************************************
* Function Name : WS2812_WriteRGB
* Description : ledμÆ′ø¿ØÖÆ3ìDò
* Input :
* Output : None
* Return : None
******************************************************/
void WS2812_WriteRGB(u16 Addr, u8 Num, u8 R8, u8 G8, u8 B8)
{
u16 i = 0,itemp = 0;
for (itemp=0;itemp<(Num);itemp++)
{
u32 RGB24 = (R8<<8)+(G8<<16)+(B8<<0);
for(i=0;i<(24);i++)
{
if(((RGB24<<i)&0x800000))
{
LED_BYTE_Buffer[Addr*24*Num+itemp*24+i] = TIMING_ONE;
}
else
{
LED_BYTE_Buffer[Addr*24*Num+itemp*24+i] = TIMING_ZERO;
}
}
}
DMA_SetCurrDataCounter(DMA1_Channel2, WS2812_Buffer_Size); // »ñè¡μ±Ç°ê£óàêy¾Yá¿′óD¡load number of bytes to be transferred
DMA_Cmd(DMA1_Channel2, ENABLE); //ê1Äü DMA ′«êäí¨μà enable DMA channel 6
TIM_Cmd(TIM2, ENABLE); // enable Timer 3
while(!DMA_GetFlagStatus(DMA1_FLAG_TC2)) ; // 2éÑˉ DMA í¨μà 2 ′«êäêÇ·ñíê3éwait until transfer complete
TIM_Cmd(TIM2, DISABLE); // disable Timer 3
DMA_Cmd(DMA1_Channel2, DISABLE); // disable DMA channel 6
DMA_ClearFlag(DMA1_FLAG_TC2);
}
|