首先请各位看看AVR的外部中断处理过程:
AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作必须由用户通过软件来完成。
使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执行。
C 代码例程
_SEI(); /* 置位全局中断使能标志*/
_SLEEP(); /* 进入休眠模式,等待中断发生*/
/* 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式*/
另外STM8L我个人测试到的外部中断处理过程是:
退出中断后如果当前该中断又被挂起,则MCU直接进入中断服务程序,而不会执行任何主程序。
C代码例程,使用库
enableInterrupts();
halt();
/* 如果在执行中断使能指令时有中断被挂起,则MCU将直接进入中断而不是休眠*/
这样会产生2个问题:
1.如果中断是下降沿的,则这个中断发生在中断使能和休眠这两条指令之间时,该中断会被忽略。如果该中断是一个按键的话,则按键按下去了,去没有发生唤醒。(请不要告诉我这种几率很小可忽略,但事实上我发生过,且按研发人员来讲这是BUG)。
2.如果中断是低电平的,则按键短按可以,不会出错,但如果此键兼做长按功能的话,或者有个外部触发信号为低电平有效且唤醒后一直是低电平的话,比如接一个拨码开关,则会发生中断一直被挂起且频繁进入中断而不执行主程序的问题,最终导致看门狗复位。注,中断请求标志在持续低电平时是清不掉的,另外如果在中断程序中关闭中断功能的话,则会发生MCU永远死睡而无法启动。
请问各位有什么办法解决此问题,或者绕过都可以我测试AVR在低电平中断无此问题,因为“使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执行。”
|