关于外部中断与定时器中断的嵌套问题

2019-08-16 20:34发布

大家好,在下求助,我想做一个设计:设计中包含两个红外探头的判断过程需要放到中断中,大致需求是这样的 :先判断红外A是否触发,然后隔1s判断红外B是否触发,若果B触发,那么就Count++,其他情况均为错误,我自己写的代码不符合我的需求,大家看下帮忙分析下, 代码如下:
(是不是需要用两个外部中断来判断两个红外信号,然后再用定时器?)

望大家不吝赐教,多谢各位!!!

exti.C

void EXTIX_Config(void)
{
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        IR_Config();
        LED_Config();
        KEY_Init();
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //使能复用功能时钟


        //GPIOA.0          中断线以及中断初始化配置 上升沿触发 PA0  WK_UP
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
        EXTI_InitStructure.EXTI_Line=EXTI_Line0;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_Init(&EXTI_InitStructure);                //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //使能按键KEY0所在的外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);
}


void EXTI0_IRQHandler(void)
{       
       
                delay_ms(10);
                if(WK_UP == 1)
                {       
                        LED1 =0;
                        TIM_Cmd(TIM3, ENABLE);  //使能TIM3
                }       


        EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
}





timer.c

//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Config(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
       
        //定时器TIM3初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
               
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {               
                        delay_ms(10);
                        if(KEY0 == 0)
                        {
                                LED1 =1;
                                Count++;
                                printf("Count = %d",Count);
                        }
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
                        TIM_Cmd(TIM3,DISABLE);  //失能TIM3                       

                }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。