C6657 GPIO中断

参考GPIO示例代码编写的一个外部中断的程序,通过FPGA定时向DSP发送外部中断信号(触发引脚为GPIO15),检测上升沿,下降沿触发中断函数。现在的问题是程序跑起来观测相关IFR寄存器值,对应位的值按照程序出现变化,现在的问题是始终不进中断函数。

一. GPIO中断初始化

void GPIO_Interrupts_Init(void)

{

    int tmp;

    gpCGEM_regs->INTMUX1=0; // Interrupt Mux Registers1 intsel4~7 unuse and mask it

    gpCGEM_regs->INTMUX2=0; // Interrupt Mux Registers2 intsel8~11 unuse and mask it

    gpCGEM_regs->EVTMASK[0]=    0xFFFFFFFF;

    gpCGEM_regs->EVTMASK[1]=    0xFFFFFFFF;

    gpCGEM_regs->EVTMASK[3]=    0xFFFFFFFF;

    //combine all GPIO interrupts to INTC event 2

    gpCGEM_regs->EVTMASK[2]= 0xFFFFFFFF;

    ~((1<<(CSL_GEM_GPINTN- 64))|

        //(1<<(CSL_GEM_GPINT14-64))|  //Gpio14 event num = 88

        (1<<(CSL_GEM_GPINT15-64))); // Gpio15 event num = 89

//没使用组合事件,使用直通事件

//map INTC event2 to INT14 and INT15 (Output of event combiner 2, //for events 64 through 95.int14=events88,int14=events89)

    tmp = gpCGEM_regs->INTMUX1;

    tmp &= 0xFFFFFF00;

    gpCGEM_regs->INTMUX1 = tmp|(CSL_GEM_GPINT15);// | (CSL_GEM_EVT2<<CSL_CGEM_INTMUX3_INTSEL14_SHIFT)

     /*Clear all DSP core events*/

    gpCGEM_regs->EVTCLR[0] = 0xFFFFFFFF;

    gpCGEM_regs->EVTCLR[1] = 0xFFFFFFFF;

    gpCGEM_regs->EVTCLR[2] = 0xFFFFFFFF;

    gpCGEM_regs->EVTCLR[3] = 0xFFFFFFFF;

    //clear DSP core interrupt flag

    ICR= IFR;

    //enable INT15

    IER = IER|(1<<15);

    /*Interrupt Service Table Pointer to begining of LL2 memory*/

    ISTP= 0x800000;

    //enable GIE

    TSR = TSR|1;

}

 

二. GPIO初始化,使用了直通事件

void GPIO_init()

{

    gpGPIO_regs->BANK_REGISTERS[0].DIR = 0; //set all gpio pin is out

    /*enable interrupt*/

    //Interrupt per-bank enable register (bit0=0 disable gpio interrupts,bit0=1 enable gpio interrupt)

    gpGPIO_regs->BINTEN= 3;

 

    /*trigger interrupt on rising edge*/

    //gpGPIO_regs->BANK_REGISTERS[0].SET_RIS_TRIG= 0xFFFFFFFF; //Gpio14 used rising edge

    /*trigger interrupt on falling edge*/

    gpGPIO_regs->BANK_REGISTERS[0].SET_FAL_TRIG= 0xFFFFFFFF; //Gpio15 used falling edge

    gpGPIO_regs->BANK_REGISTERS[0].SET_FAL_TRIG= 0xFFFFFFFF;

 

    /*clear output data*/

    gpGPIO_regs->BANK_REGISTERS[0].CLR_DATA= 0xFFFFFFFF;

 

}

 

三. 自己写的测试用中断函数

int int15TestCnt = 0;

void interrupt GpioInt15Service(void)

{

    static int Int15TestOutCnt = 0;

Uint32 eventFlag;

 

    int15TestCnt++;

    if(int15TestCnt%1000==0)

        {

            Int15TestOutCnt++;

            puts("int15 test success!\r\n");

        }

}

 

四. 中断向量表,更改的地方 

1.最顶上宏定义

;reference to the externally defined ISR

    .ref _c_int00

    .ref GpioInt15Service

    .ref Exception_service_routine

    .ref exception_record

 

    .global vectors

2. 中断向量表

;--------------------------------------------------------------

;interrupt vector table 

    .sect "vecs"

    .align 1024

vectors:

    VEC_RESET _c_int00           ;RESET

    VEC_ENTRY NMI_ISR ;NMI/Exception

    VEC_DUMMY         ;RSVD

    VEC_DUMMY         ;RSVD

    VEC_DUMMY         ;interrupt 4

    VEC_DUMMY         ;interrupt 5

    VEC_DUMMY         ;interrupt 6

    VEC_DUMMY         ;interrupt 7

    VEC_DUMMY         ;interrupt 8

    VEC_DUMMY         ;interrupt 9

    VEC_DUMMY         ;interrupt 10

    VEC_DUMMY         ;interrupt 11

    VEC_DUMMY         ;interrupt 12

    VEC_DUMMY         ;interrupt 13

    VEC_ENTRY          ;interrupt 14

    VEC_DUMMY  GpioInt15Service  ;interrupt 15

    .end

问题1:使用GPIO作为外部中断,通过GPIO15由FPGA向DSP发脉冲促发中断,GPIO方向设置为输入,GPIO15电阻两端用示波器量1.8V,Debug时观测IFR寄存器对应位的值出现变化,但是程序不进中断函数。

问题2:gpGPIO_regs->BINTEN该寄存器在datasheet查询后,BINTEN在6657中只有BIT0的设置有实际意义,即BIT0:disable,BIT1:enable,为什么在例子中赋值为3。

问题3:GPIO BANK_REGISTERS为什么是数组,在资料中并没有找到