打印

再论STM32之重大缺陷:无电平中断!!!!!!!!!!!

[复制链接]
6047|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mybao|  楼主 | 2013-5-2 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电平中断,

以前有人在这里讨论过这个问题,版主认准的结论是电平中断用处不大,可以用边沿中断替换。

我现在举个例子,说明电平中断的重要性(其实我觉得,前辈们发明电平中断是有意义的,并不是可有可无的东西):

读取一个外设的数据(通过SPI),实际是一个FIFO,而且是电平中断方式。

如果这个FIFO深度是6,FIFO有数据就触发电平中断,直到读完了,电平中断才会失效,但是软件并不知道此时FIFO中有几个数据可读,当然,可以读取寄存器获得这个数,但是这个数是易变的,而且,读取这个值要耗费时间。

实际上这样的外设很多,请问此种情况,STM32怎么处理?
沙发
desertsailor| | 2013-5-2 11:13 | 只看该作者
用边沿触发的话,中断程序里每读一次数据后再检测一下这个引脚的电平不就行了么?低电平就继续读,直至高电平。用电平触发导致频繁进中断也不太好吧?

使用特权

评论回复
板凳
mybao|  楼主 | 2013-5-2 11:45 | 只看该作者
2楼的哥哥,是这样的,回读电平信号是个办法,但是,回读该信号,需要加延时,不加延时,回读的电平信号不可靠,加了延时,当然效率就降低了。不考虑效率,那办法就太多了。

使用特权

评论回复
地板
desertsailor| | 2013-5-2 14:53 | 只看该作者
你以为频繁出入中断效率高吗?你把延时的时间调试为出入中断出栈入栈所耽误的时间,所谓的效率不就一样吗?甚至你还可以提高效率。

使用特权

评论回复
5
mybao|  楼主 | 2013-5-2 15:33 | 只看该作者
本帖最后由 mybao 于 2013-5-2 15:40 编辑

有一定道理,但是,还是不可靠,这个延时可能比中断保存现场长,也可能短。

保存现场实际也很短,加上跳转,也就20多个时钟周期吧。 这么短的时间内,等待设备IRQ信号变化,再读取稳定值,可靠不还得另外说。

毕竟STM32是一个平台,设备反应速度快还行,要是慢的话怎么办?

使用特权

评论回复
6
cjhk| | 2013-5-2 18:51 | 只看该作者
个人觉得应该还是楼主的代码问题   STM的芯片  应该不会有这些bug的   

使用特权

评论回复
7
cjhk| | 2013-5-2 18:51 | 只看该作者
如果有   一般看来就是你的代码问题  这个基本不用怀疑  呵呵   

使用特权

评论回复
8
john_lee| | 2013-5-2 19:32 | 只看该作者
楼上,楼主并没有说这是 stm32 的 bug,而是“缺陷”,可以理解为大多数 MCU 具有的功能,而 stm32 不具有。
碰巧楼主需要这些功能。

使用特权

评论回复
9
weiss_hwq| | 2013-5-3 08:17 | 只看该作者
啥的水平还没有去到,啥是路过的

使用特权

评论回复
10
清风致影| | 2013-5-3 08:53 | 只看该作者
的确是 不能说是缺陷 只能说你需要的“功能”stm没有而已
电平中断个人觉得效率不高

使用特权

评论回复
11
罗菜鸟| | 2013-5-3 09:36 | 只看该作者
你是在做CC1100超过64BYTE的帧吧?电平中断反而会搞死MCU!通常做法是在SPI读之前判断电平就行了。
下降沿中断来了就读一个BYTE,如果电平为低继续循环,为高退出。

使用特权

评论回复
12
罗菜鸟| | 2013-5-3 09:40 | 只看该作者
mybao 发表于 2013-5-2 11:45
2楼的哥哥,是这样的,回读电平信号是个办法,但是,回读该信号,需要加延时,不加延时,回读的电平信号不 ...

谁告诉你回读电平不加延时不稳定的?芯片与芯片之间连接不是按键,几乎没有毛刺的。

使用特权

评论回复
13
gbchang| | 2013-5-3 13:30 | 只看该作者

楼上说的没错,又不是按键。

本帖最后由 gbchang 于 2013-5-3 13:40 编辑
mybao 发表于 2013-5-2 11:45
2楼的哥哥,是这样的,回读电平信号是个办法,但是,回读该信号,需要加延时,不加延时,回读的电平信号不 ...

如果你**认为有抖动,需要加延时,那么,电平中断也会遇到那个抖动,同样问题,如何处理,是不是同样的头疼呢?

使用特权

评论回复
14
gkb986| | 2013-5-5 11:03 | 只看该作者
要用同步时序,不用异步。

使用特权

评论回复
15
mybao|  楼主 | 2013-5-5 16:23 | 只看该作者
菜鸟同学,不是毛刺的问题,是反应速度的问题,不加延时,可能人家动作还没做完,你就读了,这个延时必须要考虑的。

使用特权

评论回复
16
mybao|  楼主 | 2013-5-5 16:25 | 只看该作者
14楼的,没整明白你的意思

使用特权

评论回复
17
MOn51| | 2013-5-5 17:55 | 只看该作者
你用边沿中断进入中断后,再去判断电平是否翻转就行了。无需再再设计一个电平中断了。

使用特权

评论回复
18
qq65411253| | 2013-5-5 18:37 | 只看该作者
电平中断用得很少,基本上可以用边沿中断代替,而且边沿中断效率高。但在某些特别的应用下电平中断也很有用。比如低功耗应用时需要一个电平信号唤醒,如果在休眠前或休眠的同时就出现了信号,那么休眠后是无法唤醒的。因为此时无法产生边沿中断。只能在休眠前检测,然后立刻休眠。万一在检测和休眠之间出现了边沿,那就永远休眠下去了。

使用特权

评论回复
19
smartmcu| | 2013-5-5 19:24 | 只看该作者
    按加里贝克的说法,这是社会资本存量(51遗留下来的)导致的争论。
    作为一个51老狗,我大概记得,当时的cpu很慢,设备们之间打交道都是:干不干?不干?干不干?不干?干不干?干!
    都很执拗,阻塞到你干为止。所以电平触发是有其历史根源的。
    现代cpu很快了,各设备间一般都遵循低耦合的思路:干?干!或者:不干?不干!
    所以,边沿触发,扔过去一个信号就行,干不干随你。很简洁,相互很尊重,很信任。

应该是这样的吧。

使用特权

评论回复
20
mybao|  楼主 | 2013-5-5 20:48 | 只看该作者
版主肯定明白我的意思,不多解释了,坐等版主

使用特权

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

本版积分规则

85

主题

759

帖子

3

粉丝