原理
/* 按键 对应的IO寄存器 对应的中断引脚*/
/* K1 GPG0 EINT8 */
/* K2 GPG3 EINT11 */
/* K3 GPG5 EINT13 */
/* K4 GPG6 EINT14 */
/* K5 GPG7 EINT15 */
/* K6 GPG11 EINT19 */
void key_init()
{
rGPGCON &= ~(0x3 << 0); //设置GPGO—EINT[8] //中断来源
rGPGCON |= (0x2 << 0); //设置GPGO—EINT[8]
rEXTINT1 &= ~(0xf << 0); //触发方式为低电平有效
rEINTPEND |= (1 << 8); //清中断
rEINTMASK &= ~(1 << 8); //允许外部中断 //手动解除屏蔽
pISR_EINT8_23 = (U32)Key_handler; //中断服务程序 //低电平触发、中断信号来了 //此时已自动挂起PEND
EnableIrq(BIT_EINT8_23); //允许中断(INTMSK) //手动解除屏蔽
}
static void __irq key_handler()
{
if (rINTPND == BIT_EINT8_23) //INTPND同时只能有一位为1 //判断在众多等待的中断里,是不是自己被执行了
ClearPending(BIT_EINT8_23); //清SRCPND、INTPND #define BIT_EINT8_23 (0x1 << 5)
if (rEINTPEND & (1 << 8)) //清外部中断EINTPEND
{ rEINTPEND |= 1 << 8; //以上为清除所有PEND, 手动解除挂起状态,否则CPU一直认为此中断还在挂起,没被执行
led_run();
}
............
}