[mw_shl_code=c,true]u8 IRQ_flag;
volatile u16 PWM_Val[11]={1500,1500,1500,1500,1500,1500,1500,1500,1500,1500,1500};
void TIM4_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM4, TIM_IT_Update ,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM4, ENABLE); //使能TIMx外设
}
//分时复用,8路PWM输出,周期为20ms
void TIM4_IRQHandler(void) //TIM4中断
{
static u8 IRQ_CNT=1;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源
LED0=!LED0;
switch(IRQ_CNT)
{
case 1:
{
PWM1=1;
TIM4_Int_Init(PWM_Val[3],71); //PWM1高电平时间
}break;
case 2:
{
PWM1=0;
TIM4_Int_Init(2500-PWM_Val[3],71);
}break;
case 3:
{
PWM2=1;
TIM4_Int_Init(PWM_Val[4],71); //PWM2高电平时间
}break;
case 4:
{
PWM2=0;
TIM4_Int_Init(2500-PWM_Val[4],71);
}break;
case 5:
{
PWM3=1;
TIM4_Int_Init(PWM_Val[5],71); //PWM3高电平时间
}break;
case 6:
{
PWM3=0;
TIM4_Int_Init(2500-PWM_Val[5],71);
}break;
case 7:
{
PWM4=1;
TIM4_Int_Init(PWM_Val[6],71); //PWM4高电平时间
}break;
case 8:
{
PWM4=0;
TIM4_Int_Init(2500-PWM_Val[6],71);
}break;
case 9:
{
PWM5=1;
TIM4_Int_Init(PWM_Val[7],71); //PWM5高电平时间
}break;
case 10:
{
PWM5=0;
TIM4_Int_Init(2500-PWM_Val[7],71);
}break;
case 11:
{
PWM6=1;
TIM4_Int_Init(PWM_Val[8],71); //PWM6高电平时间
}break;
case 12:
{
PWM6=0;
TIM4_Int_Init(2500-PWM_Val[8],71);
}break;
case 13:
{
PWM7=1;
TIM4_Int_Init(PWM_Val[9],71); //PWM7高电平时间
}break;
case 14:
{
PWM7=0;
TIM4_Int_Init(2500-PWM_Val[9],71);
}break;
case 15:
{
PWM8=1;
TIM4_Int_Init(PWM_Val[10],71); //PWM8高电平时间
}break;
case 16:
{
PWM8=0;
TIM4_Int_Init(2500-PWM_Val[10],71);
IRQ_CNT=0;
}break;
}
IRQ_CNT++;
}
}[/mw_shl_code]
|