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

TMS320C6678: GPIO中断的设置

Part Number:TMS320C6678

需求使用FPGA触发C6678的GPIO中断,中断频率为1KHz,使用GPIO pin14。从网上扒了一段代码稍作修改,发现能够触发中断,但总是中断200次后DSP就挂了,代码如下。对机制不了解,不知道是什么原因,还请各路大佬指教,或求一个靠谱的C6678 GPIO中断的例程,十分感谢!

#include "ti/csl/csl_chip.h"
#include "ti/csl/csl_chipAux.h"
#include "ti/csl/src/intc/csl_intc.h"
#include "ti/csl/csl_gpio.h"
#include "ti/csl/csl_gpioAux.h"
#include <stdio.h>

CSL_IntcContext intcContext;
CSL_IntcEventHandlerRecord EventHandler[30];
CSL_IntcObj intcObj;
CSL_IntcHandle hTest;
CSL_IntcGlobalEnableState state;
CSL_IntcEventHandlerRecord EventRecord;
CSL_IntcParam vectId;
CSL_GpioHandle hGpio;

volatile int a = 0;

interrupt void intIsr()
{
a = 1;
return ;
}

void main(void)
{
//GpioInit(); //GPIO Initialization
int pinNum;
int bankNum;

/************************************************
*************** INTC Configuration *************
************************************************/

printf ("Debug: GEM-INTC Configuration…\n");

/* INTC module initialization */
intcContext.eventhandlerRecord = EventHandler;
intcContext.numEvtEntries = 10;
if (CSL_intcInit(&intcContext) != CSL_SOK)
{
printf("Error: GEM-INTC initialization failed\n");
return;
}

/* Enable NMIs */
if (CSL_intcGlobalNmiEnable() != CSL_SOK)
{
printf("Error: GEM-INTC global NMI enable failed\n");
return;
}

/* Enable global interrupts */
if (CSL_intcGlobalEnable(&state) != CSL_SOK)
{
printf ("Error: GEM-INTC global enable failed\n");
return;
}

/* Open the INTC Module for Vector ID: 4 and Event ID: 88 (GPIO_n in C6678)*/
vectId = CSL_INTC_VECTID_4; hTest = CSL_intcOpen (&intcObj, 88, &vectId , NULL);
if (hTest == NULL)
{
printf("Error: GEM-INTC Open failed\n");
return;
}

/* Register an call-back handler which is invoked when the event occurs. */
EventRecord.handler = &intIsr;
EventRecord.arg = 0;
if (CSL_intcPlugEventHandler(hTest,&EventRecord) != CSL_SOK)
{
printf("Error: GEM-INTC Plug event handler failed\n");
return;
}

/* Enabling the events. */
if (CSL_intcHwControl(hTest,CSL_INTC_CMD_EVTENABLE, NULL) != CSL_SOK)
{
printf("Error: GEM-INTC CSL_INTC_CMD_EVTENABLE command failed\n");
return;
}

printf ("Debug: GEM-INTC Configuration Completed\n");

// 1. Init Flag
a = 0;
printf("a = %d\n",a);

// 2. Trigger GPIO_14 in Core0
pinNum = 14;
bankNum = 0;

// Open the CSL GPIO Module 0
hGpio = CSL_GPIO_open (0);

// Set GPIO pin number as an input pin
CSL_GPIO_setPinDirInput (hGpio, pinNum);

// Set interrupt detection on GPIO pin to rising edge
CSL_GPIO_setRisingEdgeDetect (hGpio, pinNum);

// Enable GPIO per bank interrupt for bank zero
CSL_GPIO_bankInterruptEnable (hGpio, bankNum);

// 3. Wait for entering into ISR
while(a!=1){}

printf("a = %d\n",a);
printf("GPIO interrupt occurs\n");

while(1){}
return 0;
}

Nancy Wang:

请参考RTOS SDK中的GPIO例程:

www.ti.com.cn/…/PROCESSOR-SDK-RTOS-C667X

software-dl.ti.com/…/index_device_drv.html

,

Li Guangchen:

感谢您的回复!但我们目前还处在裸核开发阶段,没有使用RTOS。/(ㄒoㄒ)/~~

,

Nancy Wang:

裸机例程可参考local FAE写的例程。

https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_DSP_faq-keystone1

中断部分的内容可以参考第六章节的内容看一下:

www.ti.com/…/sprugh7.pdf

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C6678: GPIO中断的设置
分享到: 更多 (0)