打印
[STM32F4]

发现个F407的大BUG,输入捕获,一个脉冲居然会触发两次中断

[复制链接]
3213|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
看到现在F4的例程里都没有timer输入捕获的程序,就从F103的例程里移植了个
现在已经可以捕获到输入脉冲的上升沿,但问题是每个上生沿都会触发两次中断。
看似是上升沿抖动造成的,但是我已经加了滤波,而且查看,中断里面读取的标志位值不一样的,说明两个不是同一个中断。
两个临近的中断,第一次标志位的值是0x1D,第二次标志位值是0x1C

TIM2的中断服务函数,在中断里使IO口反转,DISCOVERY板子IO口的灯可以直接看到效果
粘贴代码会乱码,我就截图吧

TIM2配置代码

实验结果,每个上升沿中断后都会接着一个未知中断。
而且两个中断执行的时间间隔跟第一个中断函数代码长度有关,推断应该是同时发生的。


上传完整工程。 F407_timer.rar (1.18 MB)

沙发
gaoyang9992006| | 2013-12-7 20:50 | 只看该作者
设备不错啊,都用示波器了

使用特权

评论回复
板凳
gaoyang9992006| | 2013-12-7 20:51 | 只看该作者
进入中断前先清理所有标志位,进入后立马清所有标志位,然后暂停所有中断,执行完重启中断。

使用特权

评论回复
地板
quzhanguang|  楼主 | 2013-12-7 21:08 | 只看该作者
gaoyang9992006 发表于 2013-12-7 20:51
进入中断前先清理所有标志位,进入后立马清所有标志位,然后暂停所有中断,执行完重启中断。 ...

我想知道,为啥会产生两个中断,不是怎么去补救。。。

使用特权

评论回复
5
huzi2099| | 2013-12-7 21:24 | 只看该作者
你修改一下滤波值ICFilter再试试.

使用特权

评论回复
6
quzhanguang|  楼主 | 2013-12-7 21:39 | 只看该作者
huzi2099 发表于 2013-12-7 21:24
你修改一下滤波值ICFilter再试试.

:sleepy:改过了,而且硬件也有滤波,再者说,进入中断服务函数时候的标志位寄存器值不同,是不同的触发源触发的。

使用特权

评论回复
7
max_v| | 2013-12-7 23:47 | 只看该作者
定时器确实有些八个

使用特权

评论回复
8
elife| | 2013-12-8 11:05 | 只看该作者
是不是中断函数中清除中断标志的处理引发了一个其他中断.

使用特权

评论回复
9
戈卫东| | 2013-12-8 15:08 | 只看该作者
我看不见得是MCU的BUG...

使用特权

评论回复
10
huzi2099| | 2013-12-8 15:17 | 只看该作者
用库函数不会有问题

使用特权

评论回复
11
kseeker| | 2013-12-8 17:05 | 只看该作者
既然你知道是两个不同的中断,而且连中断标志都获取了,在你认定是MCU的bug前,至少应该先查手册确定一下0x1D和0x1C分别是什么意思。

使用特权

评论回复
12
jjjkkk00| | 2013-12-10 15:46 | 只看该作者
本帖最后由 jjjkkk00 于 2013-12-10 15:58 编辑

看了下,有两个问题询问你一下!

//.........你的程序代码 //定时器2中断服务程序         
void TIM2_IRQHandler(void)
{                     
        tsr=TIM2->SR;        //读取标志位
                if(tsr&0X01)//判断发生溢出中断
                {            
                                 PD13=~PD13;//黄灯闪
                }
                else if(tsr&0x02)//判断发生上升沿捕获
                {        
                                 PD14=~PD14;//红灯闪  示波器上通道CH1
                }        
                else
                {                 //判断其他中断
                                PD15=~PD15;        //蓝灯闪        示波器上通道CH2
                }
                        
                delayxx(3);//停留在中断函数内一小段时间——————————————————————问题1:这边在中断函数中嵌入延时,会不会对的你程序功能产生影响!!!
                TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); ——————————————问题2:此处只是清除了两个中断标记,那么对于其他中断标记,一旦发生了,你怎么去清除!!!
}
==========================================================
另外,附件中void TIM2_Cap_Init(u16 arr,u16 psc)函数内的中断失能函数调用的参数是否与你的目的一致?
//.....引用你的代码
TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC2|TIM_IT_CC2|TIM_IT_CC2|TIM_IT_COM|TIM_IT_Trigger|TIM_IT_Break,DISABLE);// 允许溢出(更新)中断
==========================================================
上面的都是无关痛痒废话。
建议你仿真看一下,定时器使能了哪些中断标记?






使用特权

评论回复
13
ZUI135| | 2013-12-11 19:20 | 只看该作者
毫无疑问,程序问题,和cpu无关,用过FPGA的就知道,硬件不会出这种问题。。。。。。。。。。

使用特权

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

本版积分规则

20

主题

280

帖子

1

粉丝