在做一个项目,因为脑残没有把RGB接到硬件定时器引脚上,所以,只能软件模拟咯。
首先中断配置什么的就不详细说了
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* 设置TIM2CLK 为 72MHZ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 , ENABLE);
/* 自动重装载寄存器周期的值(计数值) */
TIM_TimeBaseStructure.TIM_Period=200;
/* 累计 TIM_Period个频率后产生一个更新或者中断 */
/* 时钟预分频数为72 */
TIM_TimeBaseStructure.TIM_Prescaler= 71;
/* 对外部时钟进行采样的时钟分频,这里没有用到 */
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM5, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 , DISABLE); /*先关闭等待使用*/
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 , ENABLE); //开启使用
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
上中断代码
void TIM5_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM5 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM5 , TIM_FLAG_Update);
}
static u16 pwm_tmpR = 0,pwm_tmpG=0,pwm_tmpB=0;
static u32 pwn_counterR=0,pwn_counterG=0,pwn_counterB=0;
static char RGBmode = 0;
switch(RGBmode) //切换模式
{
case 0: //红灯亮 绿灯逐渐亮
pwn_counterR=0x2fff;
pwn_counterG++;
if(pwn_counterG>0x2fff)
{
RGBmode++;
}
break;
case 1://绿灯亮 红灯逐渐灭
pwn_counterG=0x2fff;
pwn_counterR--;
if(pwn_counterR==0)
{
RGBmode++;
}
break;
case 2://绿灯亮 蓝灯逐渐亮
pwn_counterG=0x2fff;
pwn_counterB++;
if(pwn_counterB>0x2fff)
{
RGBmode++;
}
break;
case 3://蓝灯亮 绿灯逐渐灭
pwn_counterB=0x2fff;
pwn_counterG--;
if(pwn_counterG==0)
{
RGBmode++;
}
break;
case 4:
pwn_counterB=0x2fff;
pwn_counterR++;
if(pwn_counterR>0x2fff)
{
RGBmode++;
}
break;
case 5:
pwn_counterR=0x2fff;
pwn_counterB--;
if(pwn_counterB==0)
{
// RGBmode++;
RGBmode=0;
}
break;
default :
pwn_counterG=0;
pwn_counterR=0;
pwn_counterB=0;
RGBmode=0;
break;
}
pwm_tmpR+=10;
pwm_tmpG+=10;
pwm_tmpB+=10;
pwm_tmpR&=0xff;
pwm_tmpG&=0xff;
pwm_tmpB&=0xff;
if(pwm_tmpR < pwn_counterR>>5) //红灯占空比pwn_counterR
{
change_LED_value(LED_R,1);
}
else
{
change_LED_value(LED_R,0);
}
if(pwm_tmpG < pwn_counterG>>5)
{
change_LED_value(LED_G,1);
}
else
{
change_LED_value(LED_G,0);
}
if(pwm_tmpB < pwn_counterB>>5)
{
change_LED_value(LED_B,1);
}
else
{
change_LED_value(LED_B,0);
}
}
说明
change_LED_value(LED_B,0); //蓝灯灭
change_LED_value(LED_B,1); //蓝灯亮