stm8s 中断重复进入

设置:

进入睡眠代码,设置外部中断唤醒

    /*两个按键和底座输入设置为外部中断*/
    /* PD4 PD6 PA2使能外部中断 */
    PD_DDR_DDR4 = 0;
    PD_CR1_C14 = 1;
    PD_CR2_C24 = 1;
    
    PD_DDR_DDR6 = 0;
    PD_CR1_C16 = 1;
    PD_CR2_C26 = 1;
    
    PA_DDR_DDR2 = 0;
    PA_CR1_C12 = 1;
    PA_CR2_C22 = 1;

    EXTI_CR1 = 0x00;  //所有端口 低电平和下降沿都中断(00是下降沿触发  01 上升沿 10 下降沿 11 上升沿和下降沿)

    asm("halt"); /* 进入停机模式 */

中断函数

#pragma vector = EXTI3_vector
__interrupt void EXTI_PORTD_IRQHandler(void)
{
  asm("sim");//关中断
  
  machine_sleep_init = 0;
}

#pragma vector = EXTI0_vector
__interrupt void EXTI_PORTA_IRQHandler(void)
{
  asm("sim");//关中断

  machine_sleep_init = 0;
}

现象:

偶尔会一直进入中断,在中断中出不来,导致程序无法运行

解决:

    PA_DDR_DDR2 = 0;//关闭中断
    PA_CR1_C12 = 1;
    PA_CR2_C22 = 0;

    EXTI_CR1 = 0x00;  //所有端口 低电平和下降沿都中断(00是下降沿触发  01 上升沿 10 下降沿 11 上升沿和下降沿)

    /*两个按键和底座输入设置为外部中断*/
    /* PD4 PD6 PA2使能外部中断 */
    PD_DDR_DDR4 = 0;
    PD_CR1_C14 = 1;
    PD_CR2_C24 = 1;
    
    PD_DDR_DDR6 = 0;
    PD_CR1_C16 = 1;
    PD_CR2_C26 = 1;
    
    PA_DDR_DDR2 = 0;
    PA_CR1_C12 = 1;
    PA_CR2_C22 = 1;
    
    asm("halt"); /* 进入停机模式 */
#pragma vector = EXTI3_vector
__interrupt void EXTI_PORTD_IRQHandler(void)
{
  asm("sim");//关中断
  
  PD_DDR = 0;//设置为上拉输入
  PD_CR1  = 1;
  PD_CR2  = 0;
  
  machine_sleep_init = 0;
}

#pragma vector = EXTI0_vector
__interrupt void EXTI_PORTA_IRQHandler(void)
{
  asm("sim");//关中断
  
  PA_DDR = 0;//设置为上拉输入
  PA_CR1  = 1;
  PA_CR2  = 0;
  
  machine_sleep_init = 0;
}

总结:

  stm8s中断没有标志位可以清除,在设置中断的时候顺序:

扫描二维码关注公众号,回复: 9858684 查看本文章

  1.关总中断

  2.关闭IO中断

  3.设置中断触发条件

  4.开启IO中断

  5.开总中断

  在中断服务函数中,先关闭总中断,再关闭IO的中断即可

猜你喜欢

转载自www.cnblogs.com/-yjx-/p/12502512.html