|
- #include "LIGHT/Light.h"
- #include "DELAY/Delay.h"
- #include "TIMx/TIMx.h"
- u16 RGB_buffer[69] = {0};
- /**
- * 功能:初始燈光
- * 參數(shù):
- * brightness:初始化亮度 10-100
- * colortemp:初始化色溫 0-100
- * red:RGB紅色比例 0-255
- * green:RGB綠色比例 0-255
- * blue:RGB藍色比例 0-255
- * 返回值:None
- */
- void initLight(u8 brightness,u8 colortemp,u8 red,u8 green,u8 blue)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁止JTAG保留SWD
- GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //設置JTAG為定時器2部分映射,只使用SWD模式
- /*設置冷光燈*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
- 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_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- /*設置RGB*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- setLight(brightness,colortemp);
- setRGB(red,green,blue);
- }
- /**
- * 功能:設置燈光亮度和色溫
- * 參數(shù):
- * brightness:亮度 10-100
- * colortemp:色溫 0-100
- * 返回值:None
- */
- void setLight(u8 brightness,u8 colortemp)
- {
- /**
- * 無論是亮度還是色溫,最終都體現(xiàn)在LED的亮度上
- * LED最終的亮度計算公式為:滿占空比(重裝載值) * 亮度百分比 * 色溫百分比
- * 并且要保證冷光和暖光的色溫比值之和為100%
- * */
- TIM_SetCompare1(TIM2,getPeriod(TIM2)*brightness/100*colortemp/100); //設置冷光 對應PA15 TIM2_CH1
- TIM_SetCompare2(TIM2,getPeriod(TIM2)*brightness/100*(100-colortemp)/100); //設置暖光 對應PB3 TIM2_CH2
- }
- /**
- * 功能:設置RGB顏色
- * 參數(shù):
- * red:RGB紅色比例 0-255
- * green:RGB綠色比例 0-255
- * blue:RGB藍色比例 0-255
- * 返回值:None
- */
- void setRGB(u8 red,u8 green,u8 blue)
- {
- u8 i = 0;
-
- u32 rgb_value = green<<16 | red<<8 | blue;
-
- while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);
- DMA_ClearFlag(DMA1_FLAG_TC1);
-
- DMA_Cmd(DMA1_Channel1, DISABLE);
- DMA_SetCurrDataCounter(DMA1_Channel1,sizeof(RGB_buffer));
- for(i=0;i<24;++i)
- {
- if((rgb_value<<i)&0x800000) //高位先發(fā),此時高位為1時
- {
- RGB_buffer[i+45] = 61; //68%占空比
- }else
- {
- RGB_buffer[i+45] = 28; //32%占空比
- }
- }
- DMA_Cmd(DMA1_Channel1, ENABLE);
- }
復制代碼
|
|