|
发表于 2017-10-18 14:10:20
|
显示全部楼层
没找到怎么上传文件,就把代码复制过来吧
typedef struct
{
u8 red;
u8 green;
u8 blue;
}_Pixel;
- /****************************************************************
- WS2811驱动函数
- 使用资源:SPI1,DMA1_Channel3,一定数量的RAM
- 使用方法:
- 主函数中先调用LED_SPI_LowLevel_Init()对SPI、DMA和GPIO进行初始化
- 先宏定义LED灯的总个数LED_ALL_Num,再给每个灯的 red,green,blue 三个变量赋值,然后LED_SPI_Update(),即可。
- *****************************************************************/
- #include "includes.h"
- #include "WS2811.h"
- #include "stm32f10x_spi.h"
- #include "stm32f10x_dma.h"
- _Pixel Pixel[LED_ALL_Num];
- #define Buffer_ALL_Num (LED_ALL_Num * 24 + 21)
- u8 PixelBuffer[Buffer_ALL_Num] = {0};
- u16 PixelPointer = 0;
- static void SPI_DMA_Init(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- DMA_DeInit(DMA1_Channel3);
- DMA_InitStructure.DMA_BufferSize = Buffer_ALL_Num;
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (SPI1->DR);
- DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)PixelBuffer;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
- DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- DMA_Init(DMA1_Channel3, &DMA_InitStructure); /* DMA1 CH3 = MEM -> DR */
- DMA_Cmd(DMA1_Channel3, ENABLE);
- }
- void LED_SPI_LowLevel_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- SPI_InitTypeDef SPI_InitStructure;
- SPI_DMA_Init();
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- SPI_I2S_DeInit(SPI1);
- SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
- SPI_InitStructure.SPI_CRCPolynomial = 7;
- SPI_Init(SPI1, &SPI_InitStructure);
- SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
- SPI_Cmd(SPI1, ENABLE);
- }
- static void WS2811_SPI_WriteByte(u16 Data)
- {
- PixelBuffer[PixelPointer] = Data;
- PixelPointer ++;
- }
- static void WS2811_SPI_SendBits(u8 Bits)
- {
- u8 Zero = 0xc0; //11000000
- u8 One = 0xfc; //11111100
- u16 i = 0;
- for(i = 0x80;i >= 0x01;i >>= 1)
- {
- WS2811_SPI_WriteByte((Bits & i)?One:Zero);
- }
- }
- static void WS2811_SPI_SendPixel(u16 Sensor_Num)
- {
- WS2811_SPI_SendBits(Pixel[Sensor_Num].red);
- WS2811_SPI_SendBits(Pixel[Sensor_Num].green);
- WS2811_SPI_SendBits(Pixel[Sensor_Num].blue);
- }
- void LED_SPI_Update(void)
- {
- u16 i;
- if(DMA_GetCurrDataCounter(DMA1_Channel3) == 0)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- WS2811_SPI_SendPixel(i);
- }
- for (i = 0; i < 20; i++)
- { /* (20+1) * 2.5 = 51.5 ~ 52.5us */
- WS2811_SPI_WriteByte(0x00);
- }
- PixelPointer = 0;
- DMA_Cmd(DMA1_Channel3, DISABLE);
- DMA_ClearFlag(DMA1_FLAG_TC3);
- SPI_DMA_Init();
- DMA_Cmd(DMA1_Channel3, ENABLE);
- }
- }
- //以下为用户程序
- void Pixel_Color_Init(void)
- {
- u8 i;
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- }
- void WS2811_Pixel_Light(u16 num,u8 Color)
- {
- u8 i;
- switch(Color)
- {
- case WS2811_Color_Red:
- for(i=0;i<num;i++)
- {
- Pixel[i].red = 0xff;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- for(i=num;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- break;
- case WS2811_Color_Orange:
- for(i=0;i<num;i++)
- {
- Pixel[i].red = 0xff;
- Pixel[i].green = 0x7f;
- Pixel[i].blue = 0x00;
- }
- for(i=num;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- break;
- case WS2811_Color_Yellow:
- for(i=0;i<num;i++)
- {
- Pixel[i].red = 0xff;
- Pixel[i].green = 0xff;
- Pixel[i].blue = 0x00;
- }
- for(i=num;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- break;
- case WS2811_Color_Green:
- for(i=0;i<num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].green = 0xff;
- Pixel[i].blue = 0x00;
- }
- for(i=num;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- break;
- case WS2811_Color_Qing:
- for(i=0;i<num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].green = 0xff;
- Pixel[i].blue = 0xff;
- }
- for(i=num;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- break;
- case WS2811_Color_Blue:
- for(i=0;i<num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].green = 0x00;
- Pixel[i].blue = 0xff;
- }
- for(i=num;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- break;
- case WS2811_Color_Zi:
- for(i=0;i<num;i++)
- {
- Pixel[i].red = 0x87;
- Pixel[i].green = 0x7f;
- Pixel[i].blue = 0x78;
- }
- for(i=num;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- break;
- case WS2811_Color_White:
- for(i=0;i<num;i++)
- {
- Pixel[i].red = 0xff;
- Pixel[i].green = 0xff;
- Pixel[i].blue = 0xff;
- }
- for(i=num;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- break;
- default:
-
- break;
- }
- LED_SPI_Update();
- }
- void WS2811_Pixel_Flash(void)
- {
- u8 i;
- Pixel_Color_Init();
- LED_SPI_Update();
- OS_Delay(1000);
- //for(j=0;j<WeightSensor_Num;j++)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0xff;
- Pixel[i].blue = 0x00;
- Pixel[i].green = 0x00;
- }
- }
- LED_SPI_Update();
- OS_Delay(1000);
- //for(j=0;j<WeightSensor_Num;j++)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0xff;
- Pixel[i].green = 0x7f;
- Pixel[i].blue = 0x00;
- }
- }
- LED_SPI_Update();
- OS_Delay(1000);
- //for(j=0;j<WeightSensor_Num;j++)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0xff;
- Pixel[i].green = 0xff;
- Pixel[i].blue = 0x00;
- }
- }
- LED_SPI_Update();
- OS_Delay(1000);
- //for(j=0;j<WeightSensor_Num;j++)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].green = 0xff;
- Pixel[i].blue = 0x00;
- }
- }
- LED_SPI_Update();
- OS_Delay(1000);
- //for(j=0;j<WeightSensor_Num;j++)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].green = 0xff;
- Pixel[i].blue = 0xff;
- }
- }
- LED_SPI_Update();
- OS_Delay(1000);
- //for(j=0;j<WeightSensor_Num;j++)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x00;
- Pixel[i].green = 0x00;
- Pixel[i].blue = 0xff;
- }
- }
- LED_SPI_Update();
- OS_Delay(1000);
- //for(j=0;j<WeightSensor_Num;j++)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0x87;
- Pixel[i].green = 0x7f;
- Pixel[i].blue = 0x78;
- }
- }
- LED_SPI_Update();
- OS_Delay(1000);
- //for(j=0;j<WeightSensor_Num;j++)
- {
- for(i=0;i<LED_ALL_Num;i++)
- {
- Pixel[i].red = 0xff;
- Pixel[i].green = 0xff;
- Pixel[i].blue = 0xff;
- }
- }
- }
- void WS2811_Pixel_Slow_Light(u8 Color_Flag)
- {
- u16 i,j;
-
- switch(Color_Flag)
- {
- case 0:
- for(i=0;i<LED_ALL_Light;i++)
- {
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = i;
- Pixel[j].blue = 0x00;
- Pixel[j].green = 0x00;
- }
- LED_SPI_Update();
- OS_Delay(15);
- }
- break;
- case 1:
- for(i=0;i<LED_ALL_Light;i++)
- {
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = 0x00;
- Pixel[j].blue = i;
- Pixel[j].green = 0x00;
- }
- LED_SPI_Update();
- OS_Delay(15);
- }
- break;
- case 2:
- for(i=0;i<LED_ALL_Light;i++)
- {
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = 0;
- Pixel[j].blue = 0x00;
- Pixel[j].green = i;
- }
- LED_SPI_Update();
- OS_Delay(15);
- }
- break;
- case 3:
- for(i=0;i<LED_ALL_Light;i++)
- {
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = i;
- Pixel[j].blue = i;
- Pixel[j].green = 0x00;
- }
- LED_SPI_Update();
- OS_Delay(15);
- }
- break;
- case 4:
- for(i=0;i<LED_ALL_Light;i++)
- {
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = i;
- Pixel[j].blue = 0x00;
- Pixel[j].green = i;
- }
- LED_SPI_Update();
- OS_Delay(15);
- }
- break;
- case 5:
- for(i=0;i<LED_ALL_Light;i++)
- {
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = 0;
- Pixel[j].blue = i;
- Pixel[j].green = i;
- }
- LED_SPI_Update();
- OS_Delay(15);
- }
- break;
- case 6:
- for(i=0;i<LED_ALL_Light;i++)
- {
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = i;
- Pixel[j].blue = i;
- Pixel[j].green = i;
- }
- LED_SPI_Update();
- OS_Delay(15);
- }
- break;
- case 7:
- for(i=0;i<LED_ALL_Light;i++)
- {
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = i;
- Pixel[j].blue = i;
- Pixel[j].green = i;
- }
- LED_SPI_Update();
- OS_Delay(15);
- }
- break;
- default:break;
- }
- }
- //点亮一卷灯带的50个灯珠
- //输入: Flag,决定颜色
- // Light,决定亮度
- void WS2811_Pixel_Color_Light(u8 Color_Flag,u8 Light)
- {
- u16 i,j;
-
- switch(Color_Flag)
- {
- case 0:
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = Light;
- Pixel[j].blue = 0x00;
- Pixel[j].green = 0x00;
- }
- LED_SPI_Update();
- break;
- case 1:
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = 0x00;
- Pixel[j].blue = Light;
- Pixel[j].green = 0x00;
- }
- LED_SPI_Update();
- break;
- case 2:
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = 0;
- Pixel[j].blue = 0x00;
- Pixel[j].green = Light;
- }
- LED_SPI_Update();
- break;
- case 3:
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = Light;
- Pixel[j].blue = Light;
- Pixel[j].green = 0x00;
- }
- LED_SPI_Update();
- break;
- case 4:
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = Light;
- Pixel[j].blue = 0x00;
- Pixel[j].green = Light;
- }
- LED_SPI_Update();
- break;
- case 5:
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = 0;
- Pixel[j].blue = Light;
- Pixel[j].green = Light;
- }
- LED_SPI_Update();
- break;
- case 6:
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = Light;
- Pixel[j].blue = Light;
- Pixel[j].green = Light;
- }
- LED_SPI_Update();
- break;
- case 7:
- for(j=0;j<LED_ALL_Num;j++)
- {
- Pixel[j].red = Light;
- Pixel[j].blue = Light;
- Pixel[j].green = Light;
- }
- LED_SPI_Update();
- break;
- default:break;
- }
- }
复制代码 |
|