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.

F29H850TU: XINT interrupt triggering for CPU3 (F29H85x)

Part Number: F29H850TU

Hello,

I am trying to trigger an interrupt through a GPIO which is controlled by CPU3.

I am confused how to do it. When all the inputXbar and interrupt configuration are configured for CPU1 there is no problem and ISR is enabled in run time. However, I don't know how to route the XINT to CPU3.

Note: In the CPU3 application I have enabled the CPU interrupts with below lines:

    ENINT;
    Interrupt_enableGlobal();

Can you gide me please?
  • Hi Gökhan,

    The key issue is that on the F29H85x dual-core device, each CPU (CPU1 and CPU3) has its own set of interrupt configuration registers. When you configure the INPUTXBAR and XINT on CPU1, those settings only apply to CPU1's interrupt path. To route the XINT to CPU3, you need to use CPU3-specific register instances.

    Critical Difference: Core-Specific Registers

    The F29H85x provides separate register sets for each core, typically prefixed with CPU3_ for CPU3. You must configure:

    • CPU3_INPUTXBAR registers (not the default INPUTXBAR registers)
    • CPU3_XINT registers (not the default XINT registers)
    • CPU3_PIE registers for interrupt enable/acknowledge

    Step-by-Step Configuration for CPU3

    Here's the complete setup for routing a GPIO interrupt to CPU3:

    /* 1. Route GPIO to INPUTXBAR on CPU3 */
    // Example: GPIO12 → INPUTXBAR5 → XINT1
    CPU3_INPUTXBAR5SELECT = 12; // Select GPIO12
    
    /* 2. Configure XINT1 on CPU3 */
    CPU3_XINT1CR = 0; // Clear previous config
    CPU3_XINT1CR.bit.XINT1SEL = 5; // Connect to INPUTXBAR5
    CPU3_XINT1CR.bit.POLARITY = 0; // 0=falling edge, 1=rising edge
    CPU3_XINT1CR.bit.QUAL = 0b01; // Optional: 2-sample qualification
    
    /* 3. Enable in PIE (assuming XINT1 → PIE Group 1, INT1) */
    CPU3_PIEIER1.bit.INTx1 = 1; // Enable PIE group 1, interrupt 1
    CPU3_PIEACK.all = 0xFFFF; // Clear any pending flags
    
    /* 4. Enable CPU3 interrupt line */
    CPU3_IER |= (1 << 1); // Enable INT1 (adjust bit for your mapping)
    
    /* 5. Enable global interrupts (you already have this) */
    EINT;
    Interrupt_enableGlobal();

    Your ISR Should Clear Flags

    #pragma CODE_SECTION(cpu3_xint1_isr, ".interrupts")
    __interrupt void cpu3_xint1_isr(void)
    {
    // Clear the XINT flag (MUST do this)
    CPU3_XINT1CR.bit.FLAG = 0;
    
    // Clear the PIE flag
    CPU3_PIEACK.all = 0xFFFF;
    
    // Your interrupt handling code here
    }

    Don't forget to register this ISR in CPU3's interrupt vector table.

    Multi-Core Considerations

    Warning️ Important:

    • A GPIO pin can only be routed to one INPUTXBAR at a time. If CPU1 is already using the same GPIO/INPUTXBAR channel, CPU3 must use a different GPIO or XBAR channel.
    • Each core has its own ePIE, IER, and IFR—interrupts are not automatically shared between cores.
    • If you need cross-core communication after the interrupt, use IPC (Inter-Processor Communication) registers.

    Where to Find Register Details

    Check the F29H850TU Technical Reference Manual sections:

    • Section 6.11.8: GPIO and Input X-Bar (for CPU3-specific INPUTXBAR routing)
    • Section 6.11.9: Interrupts (for CPU3 ePIE and XINT mapping tables)

    The TRM will show you the exact PIE group/INT line mapping for XINT1-XINT5 on CPU3.

    Quick Checklist

    White check mark Use CPU3_INPUTXBAR registers (not default INPUTXBAR)
    White check mark Use CPU3_XINT registers (not default XINT)
    White check mark Use CPU3_PIE registers for interrupt enable
    White check mark Clear both XINT flag and PIE flag in your ISR
    White check mark Verify GPIO isn't already claimed by CPU1 

    Best Regards,

    Zackary Fleenor

  • Hello Fleenor, 

    Thanks for the effort and I knew the general principle of how to route the XINT1 to CPU3 but I did not know the correct method due to the lack of documentation.

    However, as I can notice, some of the information in your answer are not valid.

    First there are no sections like Section 6.11.8, Section 6.11.9 in the TRM as think I am using the last updated one.

    Secondly, there is no register such as you suggest. ( At least my compiler pops up error since there is no identifier as "XINT1CR". )

    CPU3_XINT1CR = 0; // Clear previous config
    CPU3_XINT1CR.bit.XINT1SEL = 5; // Connect to INPUTXBAR5
    CPU3_XINT1CR.bit.POLARITY = 0; // 0=falling edge, 1=rising edge
    CPU3_XINT1CR.bit.QUAL = 0b01; // Optional: 2-sample qualification

    Only useful info I could found in TRM is in page 203 but I cant not find the base or register group called "CPUx.XINT1"


     

  • Hi Gökhan,

    You're right to push back — several details in my previous reply were incorrect. There are no registers named CPU3_XINT1CR, and the TRM sections referenced (6.11.8, 6.11.9) don't exist. Let me correct this with what the documentation and SDK actually show.

    The Key Correction: XINT Registers Are Shared, Not Core-Prefixed

    The XINT registers are not duplicated per core with a CPU3_ prefix. There is a single XINT register base at address 0x3027_0000 (DriverLib name: XINT_BASE), accessible by CPU1, CPU2, and CPU3 [1][2]. The register you're looking for is simply XINT1CR at offset 0h from that base, with fields for ENABLE (bit 0) and POLARITY (bits 3-2) [3].

    What is core-specific is each CPU's own INPUT XBAR instance and PIE — that's how the interrupt gets routed to the correct core [4][5].

    How to Actually Configure XINT for CPU3

    The correct approach uses the standard DriverLib API functions called from your CPU3 application. The hardware routes the interrupt to the correct core based on which core's XBAR and PIE you configure.

    Fixed XBAR-to-XINT Mapping

    This mapping is important — it's fixed in hardware [6]:

    XINT Instance
    Input XBAR Channel
    XINT1
    Input XBAR 4
    XINT2
    Input XBAR 5
    XINT3
    Input XBAR 6
    XINT4
    Input XBAR 13
    XINT5
    Input XBAR 14

    Configuration Code (run from CPU3 context)

    // Step 1: Assign GPIO to CPU3 (must be done from CPU1 — only CPU1 has write access to GPIO CTRL registers)
    GPIO_setControllerCore(myGPIO, GPIO_CORE_CPU3);
    GPIO_setDirectionMode(myGPIO, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(myGPIO, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(myGPIO, GPIO_QUAL_SYNC);
    
    // Step 2: Route GPIO through Input XBAR to XINT1 (XINT1 uses Input XBAR 4)
    XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT4, myGPIO);
    
    // Step 3: Configure XINT1 — these use XINT_BASE, not any CPU3-prefixed register
    GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_FALLING_EDGE);
    GPIO_enableInterrupt(GPIO_INT_XINT1);
    
    // Step 4: Enable in CPU3's PIE
    Interrupt_enable(INT_XINT1);
    Interrupt_enableInPIE(INT_XINT1);
    
    // Step 5: Enable global interrupts
    ENINT;
    Interrupt_enableGlobal();

    The DriverLib functions GPIO_setInterruptType() and GPIO_enableInterrupt() internally write to XINT_BASE + offset using the GPIO_ExternalIntNum enum values (GPIO_INT_XINT1 = 0, GPIO_INT_XINT4 = 6, etc.) [7][8].

    ISR Structure

    __interrupt void xint1ISR(void)
    {
    // Clear XINT flag
    GPIO_clearInterruptFlag(GPIO_INT_XINT1);
    // Clear PIE acknowledge
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    // Your handler code
    interruptCounter++;
    }

    Register this ISR in CPU3's interrupt vector table [9].

    Critical Notes

    • GPIO CTRL registers are CPU1 write-only — CPU2 and CPU3 have read-only access [10]. So GPIO_setControllerCore() must be called from CPU1's initialization code before CPU3 tries to use the pin.
    • A GPIO can only be routed to one INPUTXBAR at a time — if CPU1 is already using the same GPIO/XBAR channel, CPU3 must use a different one [9].
    • The SDK includes multicore GPIO examples at f29h85x-sdk/examples/driverlib/CORE_IF_MULTICORE/gpio/ that demonstrate this pattern [11].

    Remaining Gap

    I don't have confirmation of the exact PIE group/vector assignment for XINT1-XINT5 specifically on CPU3's PIE table. The INT_XINT1 define in the SDK should resolve this automatically, but if you encounter issues, check your SDK's interrupt mapping header for CPU3.


    1. F29H850TU Datasheet - XINT Register Base Address
    2. F29H85x TRM - XINT_REGS
    3. F29H85x TRM - XINT1CR Register Fields
    4. F29H85x Architecture Overview - Per-Core XINT and XBAR
    5. F29H850TU Datasheet - CPU Subsystem Architecture
    6. F29H85x SDK - XINT Input XBAR Mapping
    7. F29H85x SDK - gpio.h DriverLib Source
    8. F29H85x TRM - XINT1CR at Offset 0h
    9. E2E Thread - XINT1 and XINT4 on F29x
    10. E2E Thread - F29H850TU Multicore SysConfig GPIO Access
    11. F29H85x TRM - Multicore GPIO Examples

    Best Regards,

    Zackary Fleenor

  • Hi Gökhan,

    I wanted to follow up on your XINT interrupt routing question for CPU3. I realize my last response may have still left some gaps, particularly around the exact PIE configuration and register access patterns for your specific use case.

    A few questions to help move this forward:

    1. Were you able to get the XINT interrupt triggering on CPU3 using the DriverLib approach I outlined (GPIO_setInterruptType() + GPIO_enableInterrupt() called from CPU3 context)?

    2. Did you configure GPIO ownership from CPU1 first? Since GPIO CTRL registers are CPU1 write-only, you need CPU1 to call GPIO_setControllerCore(myGPIO, GPIO_CORE_CPU3) before CPU3 can control that pin.

    3. Which XINT instance are you using? (XINT1, XINT2, etc.) — this determines which Input XBAR channel you need (e.g., XINT1 → XBAR4, XINT4 → XBAR13).

    4. Are you seeing the interrupt flag set but the ISR not executing, or is the interrupt not triggering at all?

    If you're still stuck, could you share:

    • Which GPIO pin you're trying to use
    • A code snippet showing your current CPU3 interrupt setup
    • Whether the same GPIO/interrupt works when configured for CPU1

    I want to make sure we get this resolved correctly. The multicore GPIO interrupt routing on F29H85x has some specific requirements that aren't always obvious from the TRM alone.

    Looking forward to hearing back from you.

    Best Regards,
    Zackary Fleenor