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中斷沒有標志位可以清除,在設置中斷的時候順序:

  1.關總中斷

  2.關閉IO中斷

  3.設置中斷觸發條件

  4.開啟IO中斷

  5.開總中斷

  在中斷服務函數中,先關閉總中斷,再關閉IO的中斷即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM