最近在看广州创龙给的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(;;)
{
}
}