C6657 GPIO中断

C6657 GPIO中断

此问题已被解答
All Replies
  • 秀才40分

    参考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为什么是数组,在资料中并没有找到

  • 状元106100分

    IFR.15置1表示中断发生了,检查一下IER.15和GIE有没有使能?

    你用CSL库的话,可以参考下面的wiki网站配置中断。
    http://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices#Configuring_CIC

    BINTEN.bit1是reserved位,写0,写1都没影响。

    bank_registers是一个结构体,在CSL库里的cslr_gpio.h头文件里 有定义。

  • 秀才40分
    现在程序跑起来,IFR中IF15置1,TSR中的GIE enable,IER中IE15也是enable。已然不能触发中断函数。
  • 状元106100分

        VEC_DUMMY  GpioInt15Service  ;interrupt 15这里设置断点,能停在这行代码上吗?

  • 秀才40分
    不能,程序就是进不了中断函数。
  • 秀才40分
    搞定了 扣掉了KeyStone_Exception_cfg函数