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的中断即可