打印
[STM8]

stm8L外部中断中断问题

[复制链接]
10157|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
高建明|  楼主 | 2012-2-17 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先请各位看看AVR的外部中断处理过程:
        
        AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作必须由用户通过软件来完成。
        使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执行。

        C 代码例程
        _SEI(); /* 置位全局中断使能标志*/
        _SLEEP(); /* 进入休眠模式,等待中断发生*/
        /* 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式*/

另外STM8L我个人测试到的外部中断处理过程是:
        退出中断后如果当前该中断又被挂起,则MCU直接进入中断服务程序,而不会执行任何主程序。
        
       C代码例程,使用库
       enableInterrupts();
        halt();
       /* 如果在执行中断使能指令时有中断被挂起,则MCU将直接进入中断而不是休眠*/

这样会产生2个问题:
       1.如果中断是下降沿的,则这个中断发生在中断使能和休眠这两条指令之间时,该中断会被忽略。如果该中断是一个按键的话,则按键按下去了,去没有发生唤醒。(请不要告诉我这种几率很小可忽略,但事实上我发生过,且按研发人员来讲这是BUG)。
       2.如果中断是低电平的,则按键短按可以,不会出错,但如果此键兼做长按功能的话,或者有个外部触发信号为低电平有效且唤醒后一直是低电平的话,比如接一个拨码开关,则会发生中断一直被挂起且频繁进入中断而不执行主程序的问题,最终导致看门狗复位。注,中断请求标志在持续低电平时是清不掉的,另外如果在中断程序中关闭中断功能的话,则会发生MCU永远死睡而无法启动。

请问各位有什么办法解决此问题,或者绕过都可以我测试AVR在低电平中断无此问题,因为“
使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执行。






沙发
香水城| | 2012-2-17 17:19 | 只看该作者
对于你的2个问题,我有些疑问:

按照第一个问题的描述:“如果中断是下降沿的,则这个中断发生在中断使能和休眠这两条指令之间时,该中断会被忽略。”,为什么会被忽略?应该不会发生这种情况。

再结合第2个问题的描述:“如果中断是低电平的,则按键短按可以,不会出错”,同样是中断,为什么低电平中断就能响应,而下降沿中断就不能响应?

你这些假设是怎么来的?

使用特权

评论回复
板凳
高建明|  楼主 | 2012-2-17 17:29 | 只看该作者
第一个问题:因为中断程序中会清除中断请求位,否则会频繁进入中断程序。
第二个问题:下降沿可以响应,但是下降沿有存在忽略的危险,如上第一个问题。而低电平是不存在被忽略的问题,因为低电平总是可以保持一段时间。

使用特权

评论回复
地板
香水城| | 2012-2-17 17:31 | 只看该作者
第一个问题:因为中断程序中会清除中断请求位,否则会频繁进入中断程序。
第二个问题:下降沿可以响应,但是下降沿有存在忽略的危险,如上第一个问题。而低电平是不存在被忽略的问题,因为低电平总是可以保持一段时 ...
高建明 发表于 2012-2-17 17:29


如果是被忽略了,意味着还没有进入中断服务程序,怎么会清除中断请求位呢?
如果没有清除中断请求位,怎么又会被忽略呢?

这有点像悖论, :lol

使用特权

评论回复
5
高建明|  楼主 | 2012-2-17 18:10 | 只看该作者
第一个问题:忽略的意思是没有起到唤醒作用,抱歉表诉不清,实际已经进入中断,但是而后马上又休眠了。

使用特权

评论回复
6
香水城| | 2012-2-17 18:27 | 只看该作者
第一个问题:忽略的意思是没有起到唤醒作用,抱歉表诉不清,实际已经进入中断,但是而后马上又休眠了。
高建明 发表于 2012-2-17 18:10


你是否希望一个在系统还未进入休眠的时候到来的"唤醒事件",能够延迟动作,在未来某个时刻去唤醒休眠的系统?

使用特权

评论回复
7
高建明|  楼主 | 2012-2-17 18:39 | 只看该作者
YES,正是此意,但是未来的某个时刻必须是Halt执行之后不长的时间内

使用特权

评论回复
8
高建明|  楼主 | 2012-2-17 18:40 | 只看该作者
所以说低电平是一定可以被持续检测到的,而边沿错过了就没有了,不会再次发生

使用特权

评论回复
9
高建明|  楼主 | 2012-2-17 18:41 | 只看该作者
此问题如何解决?

使用特权

评论回复
10
香水城| | 2012-2-17 19:16 | 只看该作者
你的问题来源于在HALT之前使用了enableInterrupts(),即 RIM指令,请看我在另一个帖子中的回答,不要同时使用RIM和HALT: https://bbs.21ic.com/icview-308187-1-1.html

使用特权

评论回复
11
香水城| | 2012-2-17 19:17 | 只看该作者
YES,正是此意,但是未来的某个时刻必须是Halt执行之后不长的时间内
高建明 发表于 2012-2-17 18:39


这是不可能的,这有悖于计算机的理论基础。

使用特权

评论回复
12
香水城| | 2012-2-17 19:25 | 只看该作者
请LZ说明你希望实现什么功能,不要总是怀疑芯片有BUG。

如果你想帮助ST完善产品,只是想挑BUG,我非常欢迎,我们可以慢慢探讨。

使用特权

评论回复
13
高建明|  楼主 | 2012-2-17 20:11 | 只看该作者
我的功能是,使用同一个按键实现唤醒和长按功能,并且尽量避免在休眠指令执行之前产生中断。其中一个方法是在休眠之前判断一下按键电平,但是这样还是存在问题,因为你无法预知按键会不会在判断语句和休眠指令之间按下。

使用特权

评论回复
14
香水城| | 2012-2-18 11:44 | 只看该作者
请看我在10楼的回答:只要把LZ位的那个enableInterrupts()去掉,只保留halt()即可。

使用特权

评论回复
15
高建明|  楼主 | 2012-2-20 10:55 | 只看该作者
香版,问题解决了,果然是你说的那个问题,今天调试验证了。多谢帮忙

使用特权

评论回复
16
香水城| | 2012-2-20 12:05 | 只看该作者
香版,问题解决了,果然是你说的那个问题,今天调试验证了。多谢帮忙
高建明 发表于 2012-2-20 10:55


谢谢你的回复。

这至少说明在这一点上,STM8的设计还是很严谨的,:lol

使用特权

评论回复
17
高建明|  楼主 | 2012-2-20 12:09 | 只看该作者
姿势太灵活了,有时候受不了:lol

使用特权

评论回复
18
xwj| | 2012-2-20 12:43 | 只看该作者
姿势太灵活了,有时候受不了:lol
高建明 发表于 2012-2-20 12:09


LS嘛意思?

使用特权

评论回复
19
chaogu| | 2012-2-20 12:44 | 只看该作者
楼主的意思是HALT相当于开启总中断了,唤醒后还维持吗?还需要开启总中断吗

使用特权

评论回复
20
today_lucky| | 2012-2-22 10:38 | 只看该作者
MARK!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

203

帖子

0

粉丝