搜索
bottom↓
回复: 41

STM8 GPIO外部中断的没有中断标志位.----是硬伤,直接想骂它的设计人员

[复制链接]

出0入0汤圆

发表于 2011-3-4 11:36:50 | 显示全部楼层 |阅读模式
首先,端口的八个GPIO共用一个中断向量.
每个GPIO能够独立配置上升下降作为中断触发条件.
但是这个功能实际上没有太大用处,因为STM8的GPIO中断居然只有中断使能位,没有中断标志位!

举例说明:
想要在A1,A2口上实现两个必须上升沿触发中断的按钮或者外设,需要共用EXT_A的中断向量.
假设有一时间发生了EXT_A中断,进入了中断服务函数.现在没有中断标志位,直接导致要用很复杂的算法才能判断到底是哪个口上发生的中断.

出0入0汤圆

发表于 2011-3-4 11:39:44 | 显示全部楼层
用两个口啊,这个设计感觉就是为布线方便

出0入0汤圆

发表于 2011-3-4 11:43:44 | 显示全部楼层
很复杂的算法.......愿听其详,啥子算法撒

出0入0汤圆

发表于 2011-3-4 11:45:24 | 显示全部楼层
呵呵 还两个口。。。搬凳子听听

出0入0汤圆

 楼主| 发表于 2011-3-4 12:13:52 | 显示全部楼层
回复【1楼】lloovve  
-----------------------------------------------------------------------
在开发bootloader的过程中,文档推荐不要使用中断系统.
要实现一个下跳沿或者上升沿的检测,如果有中断标志位就很方便;如果没有就只能先等一个电平,然后再等下一个电平.
如果这个电平持续时间长还好,要是持续时间短到只有1us,就凭stm8 16M条件下的处理能力,基本上检测不出来.

出0入0汤圆

 楼主| 发表于 2011-3-4 12:15:21 | 显示全部楼层
回复【2楼】bj-stm8  珍惜生命 远离天_朝
-----------------------------------------------------------------------

复杂的算法我也没有想好,先在这发发牢骚.
也希望其他人能够给我指条明路.

出0入0汤圆

发表于 2011-3-4 12:31:48 | 显示全部楼层
如果边缘比较平缓的话就悲剧了,我试过下降沿触发,因为变化平缓,进入中断程序里读端口居然读到还是高电平,总的来说这种没中断标志指示那就自己用的时候多留心吧

出0入0汤圆

发表于 2011-3-4 12:33:59 | 显示全部楼层
回复【5楼】sqmm  
回复【2楼】bj-stm8  珍惜生命 远离天_朝
-----------------------------------------------------------------------
复杂的算法我也没有想好,先在这发发牢骚.
也希望其他人能够给我指条明路.
-----------------------------------------------------------------------
复杂的算法?  进中断 读一下 端口的状态就行,还需要什么复杂的算法?

出0入0汤圆

 楼主| 发表于 2011-3-4 13:33:33 | 显示全部楼层
回复【7楼】hongh  
-----------------------------------------------------------------------

我要检测多路us级的脉冲,可是stm8 进个中断就花掉50us.
现在看来,用GPIO检测一个信号出来都困难,更不用说同时检测多个了.
试试定时器的捕获功能能不能管用.

出0入0汤圆

发表于 2011-3-4 14:13:06 | 显示全部楼层
回复【8楼】sqmm
-----------------------------------------------------------------------

定时器的捕捉挺好的 测脉宽

出0入0汤圆

发表于 2011-3-30 21:51:15 | 显示全部楼层
请问sqmm,你说的开发bootloader不推荐使用中断是从哪里看到的呢?有相关文档吗?你说的bootloader是不是指自己写的引导程序?

出0入0汤圆

 楼主| 发表于 2011-3-31 16:59:45 | 显示全部楼层
回复【10楼】superwilkes  
-----------------------------------------------------------------------

AVR的Aplication Note里面依稀记得这么说过.它觉得需要改变中断向量表,会增加复杂度,影响稳定性.
而且从我接触的AVR和STM8来看,里面关于Bootloader的示例,没有一个用中断的.

出0入0汤圆

发表于 2011-3-31 20:34:13 | 显示全部楼层
回复【11楼】sqmm
-----------------------------------------------------------------------

AVR的Bootloader我个人觉得还是开中断的方便,毕竟他有两个中断向量表,Bootloader占一个,APP用一个,互不影响这样程序上也可以做得很灵活,至于STM8的话,如果Bootloader用中断向量表的话,那么在应用APP前就要把中断向量表要刷一次,这个动作存在风险,所以在STM8的Bootloader还是不开中断的好

出0入0汤圆

发表于 2011-7-8 13:26:21 | 显示全部楼层
正在纠结这问题

出0入0汤圆

发表于 2011-7-8 13:59:30 | 显示全部楼层
回复【8楼】sqmm  

我要检测多路us级的脉冲
-----------------------------------------------------------------------

就不要用STM8S了,慢

出0入0汤圆

发表于 2011-7-8 14:32:28 | 显示全部楼层
检测多路us级的脉冲?  STM8S ?

夸张了吧

出0入0汤圆

发表于 2011-7-8 15:45:55 | 显示全部楼层
回复【楼主位】sqmm
-----------------------------------------------------------------------

因为STM8的GPIO中断居然只有中断使能位,

CR2  C2[7:0]控制寄存器位

                     相应的位通过软件置1或置0,用来在输入或输出模式下选择不同的功能。在输入模式下,由
                     CR2相应的位使能中断。如果该引脚无中断功能,则对该引脚无影响。

                     在输出模式下,置位将提高IO速度。此功能适用O3和O4输出类型。(参见引脚描述表)

                     在 输入模式时(DDR=0):
             位7:0
                     0: 禁止外部中断

                     1: 使能外部中断

不论引脚是输入还是输出模式,都可以通过该寄存器读入引脚状态值。该寄存器为只读寄存
                  器。

看这两个地方你可以试试...
没有中断使能? CR2有中断使能
不能共用?    你可以在中断中判断。。。

出0入0汤圆

发表于 2011-8-21 11:04:56 | 显示全部楼层
回复【5楼】sqmm  
回复【2楼】bj-stm8  珍惜生命 远离天_朝
-----------------------------------------------------------------------
复杂的算法我也没有想好,先在这发发牢骚.
也希望其他人能够给我指条明路.
-----------------------------------------------------------------------

发发牢骚。。。。

出0入0汤圆

发表于 2012-6-30 13:57:50 | 显示全部楼层
sqmm 发表于 2011-3-4 13:33
回复【7楼】hongh  
-----------------------------------------------------------------------

怎么会花这么多时间,是你代码的问题吧。我就没发现需要那么长时间。

出0入0汤圆

发表于 2012-6-30 16:53:12 | 显示全部楼层
楼主...你从STM8的名字上就能看出来这不是什么高级玩意...
你要求他能代替Intel i7这是你的不对...

出0入57汤圆

发表于 2012-6-30 18:56:23 | 显示全部楼层
楼主是不是要做旋转编码器输入?

出0入0汤圆

发表于 2012-7-1 08:51:27 | 显示全部楼层
这是STM8很失败的设计,其他的外设功能整得那么复杂,寄存器那叫多啊,看着就蛋疼,偏偏这个重要的功能漏了。

出0入0汤圆

发表于 2012-7-1 08:57:17 | 显示全部楼层
hexenzhou 发表于 2012-7-1 08:51
这是STM8很失败的设计,其他的外设功能整得那么复杂,寄存器那叫多啊,看着就蛋疼,偏偏这个重要的功能漏了 ...


用了不少厂家的MCU,除了51的寄存器简单外,其他的都比较复杂

出25入12汤圆

发表于 2012-7-1 09:20:42 | 显示全部楼层
正常 我感觉这是st的传统,时不时暗处给你一下子,让你蛋疼

出0入0汤圆

发表于 2012-7-1 09:31:31 | 显示全部楼层
现在没有中断标志位,直接导致要用很复杂的算法才能判断到底是哪个口上发生的中断.


EXTI, unlike other interrupts, does not have its own status register / flag, as you indicated.

However, you can easily use a static variable to remember the previous state of the port and to determine which pins trigger the interrupt.

something like:

  1.   static unsigned char sPORTA=0; //porta shadow register
  2.   

  3.   tmp = PORTA ^ sPORTA; //which pins have changed -> pins that have changed will be 1
  4.   //alternatively to detect a falling edge
  5.   //tmp = (PORTA ^ sPORTA) & sPORTA; //which pins have a falling edge
  6.   sPORTA = PORTA;  //save portA's current reading
  7.   ...

复制代码
you can further AND tmp with Px_CR2 register to just read the ones that you have activated for EXTI.

Unusual but not too complicated

出0入0汤圆

发表于 2012-9-28 19:13:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-4-23 22:42:19 | 显示全部楼层
高手高手高高手

出0入0汤圆

发表于 2013-6-11 00:24:03 | 显示全部楼层
这个讨论挺有价值的。

出0入0汤圆

发表于 2013-6-11 08:36:29 | 显示全部楼层
路过学习。
  

出0入0汤圆

发表于 2013-6-11 13:54:12 | 显示全部楼层
chenerbox2 发表于 2012-7-1 09:20
正常 我感觉这是st的传统,时不时暗处给你一下子,让你蛋疼

这个总节的很好!深有体会呀。

出0入0汤圆

发表于 2013-7-9 22:54:38 | 显示全部楼层
请问进入中断服务程序怎么出来啊?

出0入0汤圆

发表于 2013-7-9 22:55:21 | 显示全部楼层
hongh 发表于 2011-3-4 12:33
回复【5楼】sqmm  
回复【2楼】bj-stm8  珍惜生命 远离天_朝
------------------------------------------- ...

请问进入中断服务程序怎么出来啊?

出0入0汤圆

发表于 2013-7-9 22:56:57 | 显示全部楼层
不要以为设计人员都是傻瓜,是有你说的问题,但是很简单就可以解决了

出0入0汤圆

发表于 2013-7-23 12:00:38 | 显示全部楼层
恩 。刚好用到

出0入0汤圆

发表于 2013-9-13 18:38:20 | 显示全部楼层
way2888 发表于 2011-3-4 12:31
如果边缘比较平缓的话就悲剧了,我试过下降沿触发,因为变化平缓,进入中断程序里读端口居然读到还是高电平 ...

贫僧 也是 施主你 怎么解决的

出0入0汤圆

发表于 2014-3-24 16:56:16 | 显示全部楼层
楼主不要骂了,他们已经知道错了。
有问题的是STM8S,在STM8L中已经改正了这个问题,具有了中断标志。

出0入0汤圆

发表于 2014-4-2 20:37:14 | 显示全部楼层
这样行否?
-------------------------
F0 = P_IR_RX_temp;                                //Save Last sample status
P_IR_RX_temp = P_IR_RX;                        //Read current status
if(F0 && !P_IR_RX_temp)                                //Last 采样为 1,and 当前采样为 0, 得到下降沿
{...}

出0入0汤圆

发表于 2014-4-2 21:29:20 | 显示全部楼层
用定时器输入捕获中断可以代替部分外部中断, 配合 A, B, C, D, E...TLI外部中断,
基本上无压力, STM8L还有LINE中断方式

出0入4汤圆

发表于 2014-5-19 14:44:11 | 显示全部楼层
最悲催的是开了外部中断,在中断里是无法查询IDR的状态,即使你在中断里将io口中断关掉设置成上拉输入,比如不能再下降沿中断里等待信号变成高电平,只能又变成上升沿中断,在一些时序要求高的解码程序里,就又得出栈压栈,高速传输很容易出问题

出0入0汤圆

发表于 2018-5-2 14:21:50 | 显示全部楼层
确实感觉STM8不好用。要设置选项字,还有不能在Keil上编写。整的IAR和STVP真心不如Keil好用。以前冲着价格便宜勉强接受,现在是价格还高了。一颗STM8S003都要三四块钱了。一点优势都没有,还是支持国产吧,能让“国芯”要强大起来出份力,不像中兴一样被美国制裁来个休克状态,好可怕。

出0入0汤圆

发表于 2018-5-2 14:38:25 | 显示全部楼层
LZ再仔细研究研究吧~等确认研究透了再发牢骚~~

出0入0汤圆

发表于 2018-5-3 18:08:33 | 显示全部楼层
millwood0 发表于 2012-7-1 09:31
EXTI, unlike other interrupts, does not have its own status register / flag, as you indicated.

Ho ...

赞一下你,终于有明白人了,是这样的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 19:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表