BSF_RL 发表于 2011-7-19 20:59:44

LPC1768 Cortex_M3 外部中断调试心得 触摸屏中断调试

先说说我遇到的现象吧:在调试触摸屏的时候我把触摸屏驱动芯片ADS7843的中断信号和LPC1768的EINT3接了起来,采用的时下降沿触发中断信号,想通过触摸屏幕时产生中断信号通知程序处理触摸屏事件,在调试的时候触摸一次产生了好几次中断信号,这时我分析可能是在触摸屏幕的时候ASD7843的信号有抖动,应该延时去抖,然而在中断里不适合添加延时函数,所以我就建立了一个任务和一个信号量,想通过中断服务程序发送触摸事件的信号量给任务,任务得到信号后,进行相关的处理,并且我的中断服务函数在发送信号量的同时把外部中断3关掉,而开启中断是当任务完成处理后才打开,我这样做无非是想即使在任务处理的过程产生抖动也不至于再次产生中断,我再次调试,还是没有达到我点一次中断一次的效果,而出来什么样的效果呢,就是点一次,中断两次,我就非常纳闷,我明明都延时了还把中断关了,而且中断标志也是清了的,为什么还会产生中断?我在调试时如果把断点设在中断函数的入口处,就不会出现点一次中断两次的现象,到底问题出在那个地方?我继续调试,发现了EINT3的pengding置1了,这时我联想到了CortexM3的咬尾中断(名称来自《ARM Cortex-M3 权威指南》)。我的分析是:在执行中断服务程序的过程中,由于抖动产生了第二次中断信号,这次中断信号被挂起,虽然我关掉中断,再打开,并且还清了中断标志,然而中断只要一打开,即使中断标志为空,因为挂起信号有效同样会执行中断服务程序。
解决办法:要想解决这个问题,最简单的就是在打开中断前,把其中断挂起信号清掉。
/**********中断服务程序***********/
void EINT3_IRQHandler(void)
{
        NVIC_DisableIRQ(EINT3_IRQn);
        LPC_SC->EXTINT&=1 << 3;
        rt_sem_release(sem);
}
/*************时事件处理函数*************/
        while(1)
        {
               rt_sem_take(sem, RT_WAITING_FOREVER);
                …………….                       
                LPC_SC->EXTINT&=1 << 3;
                NVIC_ClearPendingIRQ(EINT3_IRQn);
                NVIC_EnableIRQ(EINT3_IRQn);
        }
大家从程序上一眼就能看出我用的是RT_Thread吧!呵呵添加了NVIC_ClearPendingIRQ(EINT3_IRQn) 就没有出现点一次中断两次的现象了,^_^
希望我的小小体会对大家有用!

zenith1032 发表于 2011-7-30 09:23:06

灰常好,分析得仔细。

STM32_NXP 发表于 2011-8-1 08:04:47

正在学习LPC1768呢,谢谢分享

Achin 发表于 2011-8-12 01:53:23

st的中断常见写法是在中断里清除中断标志……你这个NVIC_ClearPendingIRQ不能在中断服务程序里写?

zhoushiyou 发表于 2011-8-15 14:19:13

不错。。很有用。。。

longfei98 发表于 2011-8-15 18:33:08

分析的很透彻

myqq110 发表于 2012-2-24 00:36:18

mark,顶

machangsong521 发表于 2014-4-8 22:40:51

有用的总结啊,好好学习一下了得
页: [1]
查看完整版本: LPC1768 Cortex_M3 外部中断调试心得 触摸屏中断调试