TI中文支持网
TI专业的中文技术问题搜集分享网站

GPIO中断程序无法返回主程序

你好,请教一下GPIO中断程序一直循环等待中断产生,无法返回主程序,怎么解决?可以正常进入中断响应处理函数。代码如下:

void main()
{
gpioInternalLoopbackDemo();/*一直在这里循环等待中断产生,无法返回主程序 */
while(1)
{
//在此加入EDMA传输的数据处理算法,中断响应函数处理完毕无法返回这里
}
}

//中断响应处理函数,开启EDMA数据传输

void HandleGPIO_INT (void *arg)
{
edma_interrupt_example();
intrCnt++;
return;
}

/*一直在这里循环等待中断产生,无法返回主程序 */

void gpioInternalLoopbackDemo (
void
)
{
int i=0,j=0;
CSL_Status intStat;
CSL_GpioPinConfig config;
CSL_GpioPinNum pinNum;
CSL_Status status;
CSL_GpioContext pContext;
CSL_GpioObj gpioObj;
CSL_GpioHwSetup hwSetup;
CSL_IntcGlobalEnableState state;
CSL_IntcParam vectId;
Uint32 loopIndex,evtClr=0;
/* Initialize INTC */
context.numEvtEntries = 1;
context.eventhandlerRecord = record;

intStat = CSL_intcInit(&context);
if (intStat != CSL_SOK) {
printf("INTR: Initialization error.\n");
demoFail++;
return;
}
/* Enable NMIs */
intStat = CSL_intcGlobalNmiEnable();
if (intStat != CSL_SOK) {
printf("INTR: Error while enabling NMI.\n");
demoFail++;
return;
}

/* Enable all interrupts */
intStat = CSL_intcGlobalEnable(&state);
if (intStat != CSL_SOK) {
printf("INTR: Error while enabling interrupt.\n");
demoFail++;
return;
}
/* Open interrupt module */
vectId = CSL_INTC_VECTID_12;

gpioIntcHandle = CSL_intcOpen(&gpioIntcObj, CSL_INTC_EVENTID_GPINT5,
&vectId, &intStat);
if ((gpioIntcHandle == NULL) || (intStat != CSL_SOK)) {
printf("INTR: Error opening the instance.\n");
demoFail++;
return;
}
/* Bind ISR to Interrupt */
isr_gpio.handler = (CSL_IntcEventHandler)&HandleGPIO_INT;
isr_gpio.arg = gpioIntcHandle;
CSL_intcPlugEventHandler(gpioIntcHandle, &isr_gpio);
/* Event Enable */
CSL_intcHwControl(gpioIntcHandle, CSL_INTC_CMD_EVTENABLE, NULL);
if (intStat != CSL_SOK) {
printf("INTR: Error in enabling event.\n");
demoFail++;
return;
} /* Initialize the GPIO CSL module */
status = CSL_gpioInit(&pContext);
if (status != CSL_SOK) {
printf("GPIO: Initialization error.\n");
demoFail++;
return;
}
/* Open the CSL module */
hGpio = CSL_gpioOpen(&gpioObj, CSL_GPIO, NULL, &status);
if ((hGpio == NULL) || (status != CSL_SOK)) {
printf("GPIO: Error opening the instance.\n");
demoFail++;
return;
}

intrCnt = 0;
/* Setup hardware parameters */
hwSetup.extendSetup = NULL;
/* Setup the General Purpose IO */
status = CSL_gpioHwSetup(hGpio, &hwSetup);
/* Configure pin 5 to generate an interrupt on Rising Edge, and
* configure it as an output, then set the data High (Low->High).
* Set Trigger: */
config.pinNum = CSL_GPIO_PIN5;
config.trigger = CSL_GPIO_TRIG_RISING_EDGE;
config.direction = CSL_GPIO_DIR_INPUT;
/* Enable the bank interrupt */
status = CSL_gpioHwControl(hGpio, CSL_GPIO_CMD_BANK_INT_ENABLE, NULL);
if (status != CSL_SOK) {
printf("GPIO: Command to enable bank interrupt… Failed.\n");
demoFail++;
}
/* configure the gpio pin 5 */
status = CSL_gpioHwControl(hGpio, CSL_GPIO_CMD_CONFIG_BIT, &config);
if (status != CSL_SOK) {
printf("GPIO: GPIO pin configuration error.\n");
demoFail++;
return;
} /* Set Data High: */
/*
pinNum = CSL_GPIO_PIN5;
status = CSL_gpioHwControl (hGpio, CSL_GPIO_CMD_SET_BIT, &pinNum);
if (status != CSL_SOK) {
printf("GPIO: Command to set bit… Failed.\n");
demoFail++;
return;
}
*/
/*一直在这里循环等待中断产生,无法返回主程序 */
while (1) {
if (intrCnt == 1)
break; }
status = CSL_gpioClose(hGpio);
if (status != CSL_SOK) {
printf("GPIO: Unable to Close the instance.[status = 0x%x].\n", status);
demoFail++;
return;
}
}

Shine:

请问用的是裸机程序吗?如果是裸机程序的话,中断子程序要用interrupt关键字定义。

//中断响应处理函数,开启EDMA数据传输

interrupt void HandleGPIO_INT (void *arg)
{
edma_interrupt_example();
intrCnt++;
return;
}

,

user5910726:

是裸机程序,没有操作系统。现在能够正常进入中断子程序。您的意思是如果不用关键字interrupt无法正常返回主程序?

,

Shine:

是的,裸机程序需要加interrupt关键字,不用可能回导致程序跑飞。

,

user5910726:

while (1) {if (intrCnt == 1)break; }
请教一下这段代码是什么意思?好像一直在读中断标志位?如果一直在这里循环的话等待中断触发的时候还能执行主程序代码吗?

,

Shine:

一直在等待intrCnt置1,没有置1的话,就在这里死循环了。

,

user5910726:

请教一下能实现高电平触发中断吗?现在是上升沿触发中断,一旦没有捕捉到上升沿就再也无法触发了,非常不稳定

,

Shine:

请问用的哪款芯片?C6455? 可以到相应的GPIO user guide里查看是否能设置成电平触发。

,

user5910726:

你好,如何提出新问题?

,

user5910726:

c6455 VLIB 编译VLIB_trackFeaturesLucasKanade_7x7工程时报错:unresolved symbol:_VLIB_malloc,common.ae64P,vlib.ae64P,vlib_cn.ae64P这几个库文件都加了,抱歉,不知道怎么提出新问题

,

Shine:

点击右上角的"发表新帖"即可。

赞(0)
未经允许不得转载:TI中文支持网 » GPIO中断程序无法返回主程序
分享到: 更多 (0)