最近在看广州创龙给的GPIO_KEY_EDMA例程代码时,关于中断有个问题不太明白,请教下各位。创龙给的代码中,当GPIObank0P6下降沿触发中断后,在中断服务函数中会清除EVTFLAG2寄存器的EF65位,然后还会清除INTSTAT01寄存器GP0P6位。但是我把这两句注释掉之后,发现没有任何影响,程序不会不断地重复进入中断服务程序中,只有当我按下按键,在GP0P6产生下降沿触发时,程序才能进入中断服务子程序。我原来的理解是,中断服务程序中,如果不把中断标志位清除,程序一退出,又会立马进入中断服务程序。现在的结果和这不一样,是我理解有误吗?请各位大师给我指点下迷津。代码如下:
/****************************************************************************/ /* */ /* 中断服务函数 */ /* */ /****************************************************************************/ void USER0KEYIsr(void) { // 禁用 GPIO BANK 0 中断 GPIOBankIntDisable(SOC_GPIO_0_REGS, 0); // 清除 GPIO BANK 0 中断事件 // IntEventClear(SYS_INT_GPIO_B6INT); IntEventClear(SYS_INT_GPIO_B0INT); if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 7) == GPIO_INT_PEND) { // 清除中断状态 GPIOPinIntClear(SOC_GPIO_0_REGS, 7); // 核心板 LED unsigned int i; GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH); for(i=0x00FFFFFF;i>0;i--); // 延时 GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW); } // 使能 GPIO BANK 6 中断 GPIOBankIntEnable(SOC_GPIO_0_REGS, 0); // 释放之前分配的 EDMA3 通道 EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, chNum, trigMode, tccNum, evtQ); // EDMA3 初始化 EDMA3GpioInit(); } /****************************************************************************/ /* */ /* GPIO 管脚中断初始化 */ /* */ /****************************************************************************/ void GPIOBankPinInterruptInit(void) { // 底板按键中断 // 配置 USER0 KEY GPIO0[6] 为下降沿触发 GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_FALLEDGE); // 使能 GPIO BANK 中断 GPIOBankIntEnable(SOC_GPIO_0_REGS, 0); // USER0 KEY GPIO0 // 注册中断服务函数 IntRegister(C674X_MASK_INT6, USER0KEYIsr); // 映射中断到 DSP 可屏蔽中断 IntEventMap(C674X_MASK_INT6, SYS_INT_GPIO_B0INT); // 使能 DSP 可屏蔽中断 IntEnable(C674X_MASK_INT6); } /****************************************************************************/ /* */ /* 主函数 */ /* */ /****************************************************************************/ int main(void) { // 外设使能配置 PSCInit(); // 管脚复用配置 GPIOBankPinMuxSet(); // GPIO 管脚初始化 GPIOBankPinInit(); // DSP 中断初始化 InterruptInit(); // GPIO 管脚中断初始化 GPIOBankPinInterruptInit(); // EDMA3 初始化 EDMA3GpioInit(); // 主循环 for(;;) { } }