This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM5728: A15核的纯裸机中断异常的问题

Part Number: AM5728
Other Parts Discussed in Thread: AM5729,

板子是beaglebone AI,CPU是AM5729,编译器是CCS10,开启的A15的定时器3的溢出中断,中断参数的配置和步骤如下:

第一步 :调用F:\ti\pdk_am57xx_1_0_17目录下的中断向量表初始化函数,将定时器3中断服务函数注册到向量表中

void CSL_A15_INIT_copyVectorTable(void)
{
uint32_t vectorBase = 0x40300000U;

uint32_t vectorOffset = (512U * 1024U) - 0x400U;


uint32_t *dest;
uint32_t const *src = (uint32_t const *)vecTbl;
uint32_t count;


if (&__vector_base__)
{
vectorBase = (uint32_t) &__vector_base__;
}
else
{
vectorBase += vectorOffset;
}

dest = (uint32_t *) vectorBase;
CSL_a15SetVectorTable(vectorBase);

for(count = 0; count < (sizeof(vecTbl)/sizeof(vecTbl[0])); count++)
{
dest[count] = src[count];
}
//Intc_IntRegister(4, (IntrFuncPtr)Ethernet_RX_ISR,0);//注册千兆网接收中断,编号为4
//Intc_IntRegister(7, (IntrFuncPtr)Ethernet_TX_ISR,0);//注册千兆网发送中断,编号为7
//Intc_IntRegister(8, (IntrFuncPtr)MDIO_ISR, 0);//注册千兆网MDIO中断,编号为8
Intc_IntRegister(39,(IntrFuncPtr)Timer3_ISR, 0);//注册TIMER3中断,编号为39
}

第二步 :分别配置T3的中断参数和A15中断控制器GIC的参数

void Init_MPU_INTC(void)
{
Intc_Init();

Init_TIMER3_INTC();
IntMasterIRQEnable(); //使能主IRQ中断
}

void Init_TIMER3_INTC(void)
{
GICDRegs.Priority[17] = 0x80F0F0F0;//39号中断优先级
Intc_SystemEnable(39); //使能39号中断,对应TIMER3中断
}

void Init_Timer_Interrupt_Parameter(void)
{
GPTIMER3_Regs.IRQEnableSet.bit.OverFlow = 1;//使能定时器溢出中断
GPTIMER3_Regs.TCLR.bit.Start_Stop = 1; //打开定时器
}

第三步:中断服务函数

interrupt void Timer3_ISR(void)
{
Uint32 Status;
Count++;
Test1 = 1;
if(GICDRegs.ISACTIVE[2] == 128)
{
Test2 = ~Test2;
Count1++;
}
GPTIMER3_Regs.IRQSTATUS.bit.OverFlow = 1;
GPTIMER3_Regs.IRQ_EOI.bit.Line_Num = 0;
Status = GICCRegs.IAR;
GICCRegs.EOIR = 71;
//while(GICCRegs.HPPIR != 71);
//Status = GICCRegs.IAR;
Test1 = 0;
}

中断服务函数中,Test1和Test2分别是板子上的两个IO口,外接裸机分析仪。进调试模式后,能进T3中断,如果正常运行的话,逻辑分析仪应该可以在Test1上测量到连续的脉冲串,但实际的测量结果如下:

对单个脉冲进行局部放大后的情况如下:

很明显,每次中断退出后,又在快速的进了一次中断,这明显有问题。而且T3中断基本每次运行287次后就进入系统默认中断,跑进死循环了。

这两个相邻的脉冲中,GICDRegs.ISACTIVE[2] == 128 这个事件发生在第一个脉冲里面,第二个脉冲,也就是快速进第二次中断后,这个事件就不成立了,在A15的GIC文档中有提到假中断的问题,不清楚这是不是属于假中断。中断函数中,变量Count的计数值是287,Count1因为是在GICDRegs.ISACTIVE[2] == 128这个事件成立时才开始自加一,故其计数值是144,之后中断就进入系统默认中断了。

另外,我开启千兆网的MDIO中断,就是检测网线是否接入的中断,每次插上或者拔下网线后,依然是同样的情况。且在AM5728上测试,都是同样的现象

针对上述问题,在ARM的官网上下载了有关中断控制器GIC的文档看了很久,也看了A15内核方面的官方文档,都没看出哪里有问题