目前项目需要GPIO28做GPIO中断输入,但是无法产生中断。
大概流程是这样的
1、设置GPIO28为输出,上升沿触发,GPIO_BITEN = 0x3.
2、将GPIO28的sysint映射到hostInt 0
CpIntc_mapSysIntToHostInt(0, 12, 0);
CpIntc_enableSysInt(0, 12);
CpIntc_enableHostInt(0, 0);
CpIntc_dispatchPlug(12, &gpioIsr, 12, TRUE);
int eventId = CpIntc_getEventId(0);
Hwi_Params_init(¶ms);
params.eventId = eventId;
params.enableInt = 1;
params.arg = 0;
Hwi_create(5, &CpIntc_dispatch, ¶ms, NULL);
调试不同的GPIO(0——31)中断时发现GPIO中断状态寄存器只有低16能变为1,高16位始终为0.
流程就是这样,麻烦各位工程师帮忙看看哪里有问题?
项目最近几天就必须完成,所有比较急,麻烦给位了!
Andy Yin1:
GPIO0~15可以产生中断么,如果不可以的话应该是中断配置有问题,参考如下代码及在sysBios下进行中断配置的链接;如果可以那么需要注意需要设置BINTEN bit 1 为1以使能GPIO pins 31-16的中断即GPIO_BITEN = 0x2 ;
参考下面的代码,以及using sysBios example配置。
http://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices
cookie = Hwi_disable(); /* Transfer completion ISR */ CpIntc_dispatchPlug(sysInt, gpio_interrupt_handler, 0, TRUE); CpIntc_mapSysIntToHostInt(0, sysInt, hostInt); CpIntc_enableHostInt(0, hostInt); /* Enable the System Interrupt */ CpIntc_enableSysInt(0, sysInt); eventId = CpIntc_getEventId(hostInt); EventCombiner_dispatchPlug (eventId, CpIntc_dispatch, hostInt, TRUE); EventCombiner_enableEvent(eventId); vectId = eventId/32 + 7; Hwi_enableInterrupt(vectId); Hwi_enableIER(1u<<vectId); /* Restore interrupts */ Hwi_restore(cookie);
MaoQTian:
回复 Andy Yin1:
首先谢谢您的回答
GPIO0–15能产生中断,我将BINTEM 设置为0x03和0x02都试过,始终不能产生中断,并且查看GPIO的手册时,发现所有的寄存器都只有低16bit是有效的,其余bit都是保留位。不知道这是为什么?
目前我们改成使用GPIO5了。可以正常使用。