参考GPIO示例代码编写的一个外部中断的程序,通过FPGA定时向DSP发送外部中断信号(触发引脚为GPIO15),检测上升沿,下降沿触发中断函数。现在的问题是程序跑起来观测相关IFR寄存器值,对应位的值按照程序出现变化,现在的问题是始终不进中断函数。
一.GPIO中断初始化
voidGPIO_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初始化,使用了直通事件
voidGPIO_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;
voidinterrupt GpioInt15Service(void)
{
staticint 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为什么是数组,在资料中并没有找到
Shine:
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头文件里 有定义。
user4982709:
回复 Shine:
现在程序跑起来,IFR中IF15置1,TSR中的GIE enable,IER中IE15也是enable。已然不能触发中断函数。
user4982709:
回复 Shine:
不能,程序就是进不了中断函数。
user4982709:
回复 Shine:
搞定了扣掉了KeyStone_Exception_cfg函数