打印

请教香版主,外部中断丢失,不知道是不是芯片的bug

[复制链接]
6130|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llisong|  楼主 | 2011-10-31 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用stm32有三年多了,最近做个项目,接收IRIG时钟编码,我是用两个外部中断,一个上升沿一个下降沿,发现解析时间偶尔会跳变,折腾两天最后发现外部中断有丢失,我实在上升沿中断时对一个变量计数,在下降沿中断时对一个变量计数,同时在10ms中断时对一个变量计数,信号周期10ms,几分钟后,发现三个变量数值出现了偏差,定时中断变量最大说明中断丢失了,同时两个外部中断所计数值也不等差十几个。项目要交差了,发现这个问题,解决不了项目就的重新选型,郁闷,各位大侠有个如此遭遇么,希望交流一下,希望这不是st的bug
沙发
香水城| | 2011-10-31 10:39 | 只看该作者
没听说芯片有这样的Bug。

使用特权

评论回复
板凳
llisong|  楼主 | 2011-10-31 12:08 | 只看该作者
谢谢香版主的关注,这个问题我也是第一次遇到,连续换了几块板子都没用,我现在用的是ZET6,换个板vbt6问题依然存在,我的信号是差分信号变换成的3.3VTTL,信号应该是没问题大约6000个中断丢一个

使用特权

评论回复
地板
llisong|  楼主 | 2011-10-31 12:11 | 只看该作者
原理图

SCHEMATIC1 _ 02 CPU.pdf

78.43 KB

使用特权

评论回复
5
香水城| | 2011-10-31 18:05 | 只看该作者
可以用示波器看看,在你认为丢失中断的时刻,发生了什么事情。

使用特权

评论回复
6
hsbjb| | 2011-10-31 18:27 | 只看该作者
应该不是芯片的BUG

使用特权

评论回复
7
llisong|  楼主 | 2011-11-2 10:43 | 只看该作者
这两天的测试结果发现芯片主频越快丢中断的次数就越少,相反降低主频丢中断的频率越高

使用特权

评论回复
8
lost1421| | 2011-11-2 10:57 | 只看该作者
为什么中断要同时接到两个IO口上呢?

使用特权

评论回复
9
llisong|  楼主 | 2011-11-2 11:09 | 只看该作者
一个侧上升沿一个侧下降沿,我刚侧过,只用一个口中断也丢失

使用特权

评论回复
10
llisong|  楼主 | 2011-11-2 13:11 | 只看该作者
不明白了,是我的问题不够严重,还是有别的原因,这两天我把所有的意法的参考库都下载都看了,试着修改代码,希望能够出现奇迹,可是都以失望而告终,我用的芯片是z版本的,芯片购买渠道没问题,难道意法公司不想说点什么吗,我们原来用AVR程序测试两个周,都没有出现问题,这次想在主打产品,用点高级的处理器,不想碰到这样的问题,看来芯片选型不能观看广告???????????

使用特权

评论回复
11
llisong|  楼主 | 2011-11-2 13:12 | 只看该作者
不明白了,是我的问题不够严重,还是有别的原因,这两天我把所有的意法的参考库都下载都看了,试着修改代码,希望能够出现奇迹,可是都以失望而告终,我用的芯片是z版本的,芯片购买渠道没问题,难道意法公司不想说点什么吗,我们原来用AVR程序测试两个周,都没有出现问题,这次想在主打产品,用点高级的处理器,不想碰到这样的问题,看来芯片选型不能观看广告???????????

使用特权

评论回复
12
IJK| | 2011-11-2 13:35 | 只看该作者
比较快的方法是:做1个最简单的例子,确保问题可以复现,给出适当的注释并把例子贴出来。不管是ST的人还是其它人,才容易弄清楚问题是不是真的存在

使用特权

评论回复
13
IJK| | 2011-11-2 13:41 | 只看该作者
我觉得,这种应用情况应该n多用STM32的人 都可能碰到过,简单的问题(IO口对输入信号进行计数)应该不会存在,  复杂的组合问题比较难说

使用特权

评论回复
14
llisong|  楼主 | 2011-11-2 13:51 | 只看该作者
void init_exti()    //外部中断
{
    EXTI_DeInit();
    AFIO->EXTICR[0] = 0x2222;  //PC0 W5100 , PC1 下降沿 , pc2 上升沿 ,pc3  读写信号
    EXTI->IMR = 7;
    EXTI->EMR = 0;
    EXTI->FTSR = 3;       //W5100 下降沿,pc1下降沿
    EXTI->RTSR = 0x0c;       //pc2,  pc3 上升沿
}
GPIOC->CRL = 0x44444444;  //中断管脚加了5.1K上拉电阻
GPIOC->CRH = 0x44442444;
有一个1ms加1的变量,在PC2上升沿中断程序,将改变另清零,而在PC1下降沿测该变量的数值,测量脉冲宽度,我的脉冲宽度,只有2ms、5ms、8ms三种可能,我在主程序监控该变量,是否大于14,来判断是否信号出现异常,被测信号调制频率100hz,是个标准元,大约十几秒钟就会出现时间变量大于14

使用特权

评论回复
15
llisong|  楼主 | 2011-11-2 13:54 | 只看该作者
void EXTI1_IRQHandler(void) //下降沿
{
    EXTI->PR |= 2;
  PulWidDeal(b_code.ms_levcnt);
}
void EXTI2_IRQHandler(void)        //上升沿
{
        EXTI->PR |= 4;
        b_code.ms_levcnt=0;
        if(b_code.next_ppscom == 1)
        {
               
                TIM1->CNT = 1;
                time_stemp.stemp_sec = b_code.stemp_sec_shadow;
                b_code.next_ppscom = 0;
                b_code.next_100mscom = 0;
                //GPIOA->ODR |= 0x8;
               
        }
}
在主程序中
if(b_code.ms_levcnt>14)                //B码异常
        {
            b_code.next_ppscom = 0;    //判断信号异常
                b_code.err = 1;
            GPIOA->ODR|= 8;
            return;
        }

使用特权

评论回复
16
lost1421| | 2011-11-2 14:03 | 只看该作者
从现象上看应该是楼主的代码的问题:
“这两天的测试结果发现芯片主频越快丢中断的次数就越少,相反降低主频丢中断的频率越高”

频率快,丢失的中断少,而频率慢,丢失的中断就多。说明CPU运行的快时,就能处理中断,速度慢,中断程序里的代码占用太多时间,前一个中断还没处理结束,新的中断就来了,系统就丢弃了,导致中断丢失。

使用特权

评论回复
17
llisong|  楼主 | 2011-11-2 14:11 | 只看该作者
这是不会的,我的中断程序很简单,主频36M,PulWidDeal(b_code.ms_levcnt);
函数花费时间10uS之内,测试阶段不可能加太多负载,主程序基本就是空的

使用特权

评论回复
18
lost1421| | 2011-11-2 14:19 | 只看该作者
楼主你在进入中断程序时将一个GPIO口置高,退出时置低,使用示波器同时监控该引脚和中断信号,查看什么时候有中断,但是中断无处理。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
llisong + 1
19
香水城| | 2011-11-2 16:32 | 只看该作者
不明白了,是我的问题不够严重,还是有别的原因,这两天我把所有的意法的参考库都下载都看了,试着修改代码,希望能够出现奇迹,可是都以失望而告终,我用的芯片是z版本的,芯片购买渠道没问题,难道意法公司不想说点什么吗,我们原来用AVR程序测试两个周,都没有出现问题,这次想在主打产品,用点高级的处理器,不想碰到这样的问题,看来芯片选型不能观看广告???????????llisong 发表于 2011-11-2 13:12


LZ希望意法公司说点什么?

使用特权

评论回复
20
IJK| | 2011-11-2 17:16 | 只看该作者
楼主你在进入中断程序时将一个GPIO口置高,退出时置低,使用示波器同时监控该引脚和中断信号,查看什么时候有中断,但是中断无处理。
lost1421 发表于 2011-11-2 14:19


十分赞同。这是1个用数字示波器查这个问题的简单、且非常有效的方法。

如果LZ有数字示波器,完全应该这么查问题,否则实在是舍近求远。

使用特权

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

本版积分规则

9

主题

37

帖子

1

粉丝