設置:
進入睡眠代碼,設置外部中斷喚醒
/*兩個按鍵和底座輸入設置為外部中斷*/ /* 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的中斷即可