[MPC5777C] Interrupts are not called after a external ISR call

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

[MPC5777C] Interrupts are not called after a external ISR call

Jump to solution
1,043 Views
byungwouk
Contributor II

Hello, all.

 

I am using MPC5777C in vehicle controller. and I am building my project by referring to NXP's example.

The problem is that the external ISR executes once, the external ISR doesn't executes again.

I would like to know a method I found is correct.

 

Below is the mechanism I analyzed why the ISR does not work again.

1. After ISR, Writing to the INTC_EOIR_PRC for sending the end signal of the servicing of the interrupt request on epilog.

2. In case of PIT interrupt, after writing INTC_EOIR_PRC, INTC_CPR_PRC is changed automatically in epilog. and then, PIT ISR will executes again after PIT timeout interrupt arise.

3. In case of external interrupts, INTC_CPR_PRC is NOT changed in epilog. and external ISRs do not executes again.

 

I have confirmed that adding writing INTC_EOIR_PRC in the external ISR makes the ISR continuously work well. To summarize, Writing INTC_EOIR_PRC twice for an interrupt event.

Writing INTC_EOIR_PRC at first time doesn't change INTC_CPR_PRC, but at the second time change INTC_CPR_PRC

But I have doubts about whether this method is correct.

Object is that external ISRs process while the PIT ISR is running.

The solution that I found is fit to my object, That situation doesn't make sense for me..

 

Reference projects are below:

Example MPC5777C-SIUL_External_NMI GHS714

Example MPC5777C-SIUL_External_IRQ GHS714

 

Below is my sample code.

void Initialize_Interrupt(void){

    // PIT Interrupt Setting
    PIT.MCR.R = 0;
    PIT.TIMER[0].TFLG = 1;  // Timer Int. Flag Clear
    PIT.TIMER[0].TCTRL = 3; // Timer Enable, Timer Int. Enable
    PIT.TIMER[0].LDVAL = 24000000 - 1; // Timeout Period

    // External Interrupt Setting
    SIU.MCR.R = 0;
    INTC.IACKR_PRC[0].R =  (uint32_t)&INTC_IVT; // Setting Vector Table
    SIU.DIRER.R = 0x0000FFFF; // Int. Enable
    SIU.IFEER.R = 0x0000FFFF; // Falling-Edge
    SIU.IREER.R = 0x00000000; // Rising-Edge
    SIU.PCR[450~455] = 0x0913;
    SIU.IMUX3.B.MUXSEL0~5 = 1; // Input Mux. IRQ 0~5

    // Priority Setting
    INTC.PSR[50]  = 4; // Core0, Ext Isr, Priority 4 (Higher)
    INTC.PSR[301] = 3; // Core0, PIT Isr, Priority 3
}


void isr_ISR5(void){
    // Clear Int. Flag
    SIU.EISR.R = 0x80;
    // Do Something
    // Writting INTC_EOIR_PRC as 0
    INTC.EOIR_PRC[0].R = 0; // Is it Correct? But It goes as planned
}
void isr_PIT0(void){
    // Clear Int. Flag
    PIT.TIMER[0].TFLG = 1;
    // Do Something
}

Thanks in advance.

0 Kudos
Reply
1 Solution
947 Views
davidtosenovjan
NXP TechSupport
NXP TechSupport

I have added PIT to the External IRQ example, but I don't see mentioned behavior.

One LED is blinking by EIRQ button, second by PIT interrupt.

View solution in original post

0 Kudos
Reply
4 Replies
948 Views
davidtosenovjan
NXP TechSupport
NXP TechSupport

I have added PIT to the External IRQ example, but I don't see mentioned behavior.

One LED is blinking by EIRQ button, second by PIT interrupt.

0 Kudos
Reply
926 Views
byungwouk
Contributor II

Thank you for testing about that.

The reason that my project has problem is my fault.

I did add some logging code in ISR to know the order of interrupts called.

It seems that reading INTC.IACKR_PRC in IRQ makes interrupt wrong.

 

Thank you so much!

0 Kudos
Reply
1,005 Views
davidtosenovjan
NXP TechSupport
NXP TechSupport

I don't understand it too much as write to EOIR register is present in the epilog. From core point of view there is no difference between external interrupt and other IVOR4 sources.

I will check it on HW when I am able, letting you know.

0 Kudos
Reply
1,034 Views
byungwouk
Contributor II
In addition, prolog and epilog are same with the examples
0 Kudos
Reply