GPIO例程中,
else if (C6678_EVM==gDSP_board_type)
{
//combine all GPIO interrupts to INTC event 2
gpCGEM_regs->EVTMASK[2]= ~((1<<(CSL_GEM_GPINTN- 64))|
(1<<(CSL_GEM_GPINT8-64))|
(1<<(CSL_GEM_GPINT9-64))|
(1<<(CSL_GEM_GPINT10-64))|
(1<<(CSL_GEM_GPINT11-64))|
(1<<(CSL_GEM_GPINT12-64))|
(1<<(CSL_GEM_GPINT13-64))|
(1<<(CSL_GEM_GPINT14-64))|
(1<<(CSL_GEM_GPINT15-64)));
}
是不是表示只要把GPIO8到GPIO15设置为输入,任何一个IO有电平变化,就会产生中断,其它GPIO0到GPIO7即使设置为输入也不会产生中断。如果我只想GPIO15产生中断,该陈如下
else if (C6678_EVM==gDSP_board_type)
{
//combine all GPIO interrupts to INTC event 2
gpCGEM_regs->EVTMASK[2]= ~((1<<(CSL_GEM_GPINTN- 64))|
(1<<(CSL_GEM_GPINT15-64)));
}
即可。谢谢
Nancy Wang:
EVTMASK是事件组合器。只要任意一个gpio电平发生变化都会触发中断,可以不改。
GPINTN是指GPIO0~GPIO7。
https://e2echina.ti.com/question_answer/dsp_arm/c6000_multicore/f/53/t/182056
user4802057:
回复 Nancy Wang:
那如果不修改的话,任何一个GPIO有电平变化,就会进入一次GPIO的中断服务函数里面,这样的话,GPIO总是有中断,我是想只有一个GPIO输入产生中断。另外顺便问一下,GPIO中断服务函数里
/*read interrupt flag*/eventFlag= gpCGEM_regs->MEVTFLAG[2];
/*clear interrupt flag*/gpCGEM_regs->EVTCLR[2]= eventFlag;
//shift the interrupt register to match the GPIO data registerprintf("GPIO interrupt event flag on CorePac INTC = 0x%x\n",((eventFlag&(~(1<<(CSL_GEM_GPINTN-64))))>>(10))|((eventFlag>>(CSL_GEM_GPINTN-64))<<DNUM));
如果全部GPIO都会产生中断,怎么来区分是哪个GPIO产生的中断呢?
Nancy Wang:
回复 user4802057:
只想有一个GPIO产生中断就配置对应的GPIO的寄存器位。 请问有没有下载过PSDK,CSL中有很多封装好的函数可以直接调用。另外GPIO0~7是与相应的core对应,即corepac0 对应 GPINT0, corepac1 对应 GPINT1.CPIO8~15中断事件则可以路由到所有core。 www.ti.com/…/PROCESSOR-SDK-C667X