先清除SRCPND后清除EINTPEND也没有见到第二次中断
一个key,外部中断都正常了,最后之余在课后还有《浅谈S3C2440的中断寄存器及中断过程》上都看到:
2.4 中断的清除
a.如果是不带子中断的内部中断,只需清除SRCPND,注意清除需位置1。
b 如果是带子中断的内部中断,需清除SRCPND和SUBSRCPND,注意先清除SUBSRCPND,再清除SRCPND。因为,如果你先清除SRCPND的话,然后在清除SUBSRCPND的过程中,SRCPND会以为又有中断发生,又会置1。也就是说一次中断会响应两次。所以必须先掐断源头。
c 如果是外部中断,对于EINT8-23需要清除EINTPEND和SRCPND(同样注意顺序)。对于EINT0-EINT3只需清除SRCPND。
正常的代码是这样的:
static void __irq key_handler(void) { /*判断是否是按键K2产生的中断*/ if(rINTPND==BIT_EINT8_23) { if(rEINTPEND&(1<<11)) { rEINTPEND |= 1<< 11; beep_run(); } ClearPending(BIT_EINT8_23); } }
我改过之后:
static void __irq key_handler(void) { /*判断是否是按键K2产生的中断*/ // if(rINTPND==BIT_EINT8_23) // { ClearPending(BIT_EINT8_23); //if(rEINTPEND&(1<<11)) //{ //delay(1000); rEINTPEND |= 1<< 11; beep_run(); //} // } }
我在按键时也没有感觉到有第二次中断的出现,设置的低电平触发,应该我松手之后就一直中断状态,而我却没有遇到。我很想见识见识,我隐隐约约感觉到是我的测试方法不对?我还加了延时,还是不行,诸位有什么好的方法吗?我不想尽信书呀?
用led显示寄存器的值