初级会员 
  
	- 积分
 - 74
 
        - 金钱
 - 74 
 
       - 注册时间
 - 2017-8-15
 
      - 在线时间
 - 12 小时
 
 
 
 | 
 
做了一辆小车,想在进中断后满足一定条件把中断关掉,结果无论是用寄存器还是库函数,程序都很容易跑飞,求大神指导!!! 
 
 
 
/** 
  * @brief  前面的灰度 
  * @param  None 
  * @retval None 
  */ 
void HD2_IRQHandler(void) 
{        
  if(EXTI_GetITStatus(HD2_INT_EXTI_LINE)!=RESET) 
  { 
    SysTick_Delay_ms(85); 
    if(EXTI_GetITStatus(HD2_INT_EXTI_LINE)!=RESET) 
    {  
    EXTI_ClearITPendingBit(HD2_INT_EXTI_LINE);  
    a = 1;        //进中断标志位 
    TIM_SetCounter(TIM6,0); 
    TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);    // 开启计数器中断 
     
    if(hit == 1)         //检测到人,撞到边 
    { 
      LED9_ON; 
      hit = 0;         //清掉检测到人的位 
      speedset(110,90,90,110); 
      Back; 
      SysTick_Delay_ms(800); 
      hit = 0;         //清掉检测到人的位 
      filter();        //重新测值,否则继续直行 
      for(i=0;i<13;i++) 
      { 
       value[i]= GetVolt(ADC_ConvertedValueLocal[i]); 
      } 
      LED9_OFF; 
    } 
    else                //没检测到人 
    { 
     if(b == 1)      //前后都检测到 
     { 
//      speedset(50,40,40,50); 
      Left;   
      filter();        //重新测值,否则继续直行 
      for(i=0;i<13;i++) 
      { 
       value[i]= GetVolt(ADC_ConvertedValueLocal[i]); 
      } 
//      EXTI->IMR = 0;               //取消外部中断    【【 加上会卡死 】】  
//            EXTI_DeInit(); 
      flag2 = 1; 
      flag3 = 1; 
     } 
     else            //最平常的情况,一边检测到 
     { 
      Back; 
     } 
    }  
      } 
  } 
} 
 
 
/** 
  * @brief  后面的灰度 
  * @param  None 
  * @retval None 
  */ 
void HD1_IRQHandler(void) 
{   
  if(EXTI_GetITStatus(HD1_INT_EXTI_LINE)!=RESET) 
  { 
    SysTick_Delay_ms(85); 
    if(EXTI_GetITStatus(HD1_INT_EXTI_LINE)!=RESET) 
    {  
    EXTI_ClearITPendingBit(HD1_INT_EXTI_LINE);   //清除中断标志位  
   b = 1;            //进中断标志位 
   TIM_SetCounter(TIM6,0); 
   TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);    // 开启计数器中断 
    
    
   if(hit == 1)      //检测到人,撞到边     
   { 
     LED9_ON; 
    hit = 0;         //清掉检测到人的位 
    speedset(110,90,90,110); 
    Straight; 
    SysTick_Delay_ms(800); 
    hit = 0;         //清掉检测到人的位 
    filter();        //重新测值,否则继续直行 
    for(i=0;i<13;i++) 
    { 
     value[i]= GetVolt(ADC_ConvertedValueLocal[i]); 
     } 
      LED9_OFF; 
   } 
   else      //没检测到人 
   { 
    if(a == 1)      //前后都检测到 
    { 
//     speedset(50,40,40,50); 
     Right; 
     filter();        //重新测值,否则继续直行 
     for(i=0;i<13;i++) 
     { 
      value[i]= GetVolt(ADC_ConvertedValueLocal[i]); 
     } 
//     EXTI->IMR = 0;               //取消外部中断    【【 加上会卡死 】】  
//        EXTI_DeInit(); 
     flag2 = 1; 
     flag3 = 1;  
    } 
    else            //最平常的情况,一边检测到 
        { 
     Straight; 
    } 
      
   }   
     } 
  }  
} 
 
 
/** 
  * @brief  TIM6定时器中断   
  * @param  None 
  * @retval None 
  */ 
void  BASIC_TIM_IRQHandler (void)      
{   
  LED10_ON; 
   SysTick_Delay_ms(100); 
  a = 0; 
  b = 0;  
  LED10_OFF; 
 TIM_ITConfig(BASIC_TIM,TIM_IT_Update,DISABLE);         // 关闭计数器中断  
 TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);    //清除中断标志位 
} 
 
 |   
 
 
 
 |