编译环境是CCS10,AM5728 ARM侧A15的裸机程序,在调试模式下运行,中断源是千兆网0的网线连接变化中断,插上网线后能很快进入相应中断服务程序,在服务程序中对相应中断标志位做了清除动作,GMAC模块中的MDIO寄存器,对应的LINKINTRAW和LINKINTMASKED寄存器相应位都正确的被清零了。该中断在退出后又在快速的第二次进入,但没有插拔过网线,之前已被清零的标志位一直保持是0的状态。后面再次插拔网线都不在进中断了,但主循环中的代码跑的好好的,没有死机。调试模式下看了GMAC模块中的MDIO寄存器,对应的LINKINTRAW和LINKINTMASKED寄存器相应位在重新插拔网线后能识别到网线重新连接上了,因而对应中断标志位又在重新置一,但就是不进中断。调试了很久,一直找不到原因在哪里。以下是中断允许,中断处理各过程的代码:
在C文件csl_a15_startup.c的中断向量表中调用了如下函数:
Intc_IntRegister(4,MDIO_ISR,0); //注册千兆网MDIO中断,编号为4
main函数的系统初始化中,调用了下面三个函数:
IntMasterIRQEnable(); //使能主IRQ中断
Intc_IntPrioritySet(4,10,0);//4号中断优先级为10
Intc_SystemEnable(4); //使能4号中断
模块级中断配置中,编写了如下中断配置函数
void Init_EtherNet_Interrupt_Parameter(void)
{
CPDMA_Regs.EOI_VECTOR = 0;
CPDMA_Regs.EOI_VECTOR = 1;
CPDMA_Regs.EOI_VECTOR = 2;
CPDMA_Regs.EOI_VECTOR = 3;
CPDMA_Regs.EOI_VECTOR = 4;
MDIORegs.USERPHYSEL0.bit.LINKINTENB = 1;//允许网线连接状态变化中断
CPSW_WR_Regs.C0MISCEN.bit.LINKINT0 = 1;//杂项配置中允许网线连接状态变化中断
CPSW_WR_Regs.C0RXEN.bit.CH0 = 1;//允许接收中断
CPSW_WR_Regs.C0TXEN.bit.CH0 = 1;//允许发送中断
}
以下是网线连接状态变化的中断服务函数
interrupt void MDIO_ISR(void)
{
if(CPSW_WR_Regs.C0MISCSTAT.bit.LINKINT0 == 1)
{
MDIORegs.LINKINTMASKED.bit.LINK_ChangEvent = 1;//清除中断
CPDMA_Regs.EOI_VECTOR = 3;//
DHCP_Discover();
}
LED3 = ~LED3;
//D3_GREEN = 1;
}
中断服务函数里面if语句中的代码都能正确运行
另外,不仅是这个网线连接状态变化中断会连续两次进入中断,之后就无论什么情况都不在进,我另外开了个定时器中断,也是同样的情况