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.

TMS320F28335: GPIO16_External Interrupt is not working

Part Number: TMS320F28335
Other Parts Discussed in Thread: C2000WARE

Tool/software:

Dear Team,

I have TMS320F28335 and I want to configure external interrupt on GPIO12,GPIO13 and GPIO16.

GPIO12 and GPIO13 are working fine but GPIO16 is not working.

Below is the my configuration please let me know what configuration is missing.

Best and regards,

Dipak

/**
 * @brief: External GPIO Interrupt ISR
 * @param[in]
 * @param[out]
 */
__interrupt void vGpioIntr1ISR(void)
{
    if(++u16Int1counter>2000)
    {
        GpioDataRegs.GPBTOGGLE.bit.GPIO36 = 1;
        u16Int1counter= 0;
    }
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

/**
 * @brief: External GPIO Interrupt ISR
 * @param[in]
 * @param[out]
 */
__interrupt void vGpioIntr2ISR(void)
{
    if(++u16Int2counter>2000)
    {
        GpioDataRegs.GPBTOGGLE.bit.GPIO36 = 1;
        u16Int2counter= 0;
    }

    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
/**
 * @brief: External GPIO Interrupt ISR
 * @param[in]
 * @param[out]
 */
__interrupt void vGpioIntr3ISR(void)
{
    if(++u16Int3counter>100)
    {
        GpioDataRegs.GPBTOGGLE.bit.GPIO50 = 1;
        u16Int3counter= 0;
    }

    PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}




void vInitXInterruptConfig(void)
{
    //============================================= External Interrupt ==============================================================================================
    // External Interuupt
    //dsp_pwm_rx1 : GPIO12
    //dsp_pwm_rx2:  GPIO13
    //dsp_pwm_rx3:  GPIO16


    EALLOW;
    PieVectTable.XINT1 = &vGpioIntr1ISR;// register ISR in interrupt vector table
    PieVectTable.XINT2 = &vGpioIntr2ISR;
    PieVectTable.XINT3 = &vGpioIntr3ISR;
    EDIS;

    PieCtrlRegs.PIECTRL.bit.ENPIE  = 1;// Enable PIE block
    PieCtrlRegs.PIEIER1.bit.INTx4  = 1;// Enable PIE Group 1 INT4
    PieCtrlRegs.PIEIER1.bit.INTx5  = 1;// Enable PIE Group 1 INT5
    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;// Enable PIE Group 1 INT6
    IER |= M_INT1;                    // Enable CPU interrupt 1
    EINT;                             // Enable Global Interrupt

    //
    // GPIO12, GPIO13 and GPIO16 are inputs
    //
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
    GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0;         //Xint1 Synch to SYSCLKOUT only

    GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;
    GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 0;


    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO16 = 0;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 0;

    //
    // Each sampling window is 510*SYSCLKOUT
    //
    GpioCtrlRegs.GPACTRL.bit.QUALPRD0 = QUAL_PERIOD_CONFIG;//Each Sample window is 510*SYSCLKOUT
    EDIS;

    EALLOW;

    GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;      //tag XINT1 interrupt with GPIO12
    GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 13;      //tag XINT2 interrupt with GPIO13
    GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 16;      //tag XINT3 interrupt with GPIO16
    EDIS;

    XIntruptRegs.XINT1CR.bit.POLARITY = 1;//Detect interrupt on rising edge of GPIO12
    XIntruptRegs.XINT2CR.bit.POLARITY = 1;//Detect interrupt on rising edge of GPIO13
    XIntruptRegs.XINT3CR.bit.POLARITY = 1;//Detect interrupt on rising edge of GPIO16

    XIntruptRegs.XINT1CR.bit.ENABLE = 1;  //Enable XINT1
    XIntruptRegs.XINT2CR.bit.ENABLE = 1;  //Enable XINT2
    XIntruptRegs.XINT3CR.bit.ENABLE = 1;  //Enable XINT3

}

  • Hi Vishal,

    Please check the c2000ware example : Example_2833xExternalInterrupt for reference code

    Thanks

  • Hi Prarthan,

    Thank you for your response!

    I have reviewed the example and successfully implemented interrupts for GPIO12 and GPIO13, which are working as expected.

    However, I am encountering an issue with the interrupt for GPIO16. I would appreciate it if you could review the code I provided earlier and let me know if there are any configuration errors or if I am possibly missing something.

    Thank you for your assistance.

    Best regards,
    Dipak

  • Hi Dipak,

    Config looks okay except for : QUALPRD0 is only for GPIO0-7 whereas you are using GPIO12,13 and 16.

     GpioCtrlRegs.GPACTRL.bit.QUALPRD0 = QUAL_PERIOD_CONFIG;

    Can you try the XINT with GPIO12 or GPIO13 and see if that works for you.
    Also then you can assign GPIO16 XINT1 and see if that works for you

    Thanks

  • Hi Prathan,

    I am confused a lot can you please give me the code for GPIO12,13 and 16 [GPIO12 and 13 are working but 16 is not working - I already sent the code please have a look that].

    -Dipak

  • Hi Prathan,

    Can you please verify my logic or can you please share me the code for the same?

    -Dipak

  • Hi Dipak,

    It will take some time for me to find the board and check the code.
    Please expect reply by end of the week.

    Thanks

  • Hi Prarthan,

    Okay, Thanks for the reply!

    -Dipak

  • Hi Prarthan,

    Is there any update for me?

    - Dipak

  • Hi Prarthan,

    Is there any update for me?

    -Dipak

  • Hi Team,

    Can you confirm if the solution to the mentioned question is possible or not?

    It's been a long time, and I still haven't received an answer. Please provide an update at the earliest.

    Best regards,
    Dipak

  • Hi Dipak,

    Sorry for the delay wasn't able to find the board to test the code.

    Finally today I was able to find an old control card to test the code and I have attached the modified example that works on my end for XINT1,2,3

    For XINT3-7 there is a catch that it only works with GPIO32-63 as shown in the user manual screenshot below.

    In the code below I assigned GPIO33 as XINT3 source and it works as expected.

    Let me know if you have any further issues so we can close this thread after you verified its working on your end as well.

    Thanks.


    //###########################################################################
    //
    // FILE:	Example_2833xExternalInterrupt.c
    //
    // TITLE:	External Interrupt Example
    //
    //! \addtogroup f2833x_example_list
    //! <h1>External Interrupt (external_interrupt)</h1>
    //!
    //! This program sets up GPIO0 as XINT1 and GPIO1 as XINT2.  Two other
    //! GPIO signals are used to trigger the interrupt (GPIO30 triggers
    //! XINT1 and GPIO31 triggers XINT2). XINT1 input is synched to SYSCLKOUT
    //! XINT2 has a long qualification - 6 samples at 510*SYSCLKOUT each.
    //! GPIO34 will go high outside of the interrupts and low within the
    //! interrupts. This signal can be monitored on a scope.
    //! Each interrupt is fired in sequence - XINT1 first and then XINT2 AND THEN xint3
    //!
    //! Monitor GPIO34 with an oscilloscope. GPIO34 will be high outside of
    //! the ISRs and low within each ISR.
    //!
    //! \b External \b Connections \n
    //!  - Connect GPIO30 to GPIO0. GPIO0 is assigned to XINT1
    //!  - Connect GPIO31 to GPIO1. GPIO1 is assigned to XINT2
    //!  - Connect GPIO29 to GPIO33. GPIO33 is assigned to XINT3
    //!
    //! \b Watch \b Variables \n
    //!  - Xint1Count - XINT1 interrupt count
    //!  - Xint2Count - XINT2 interrupt count
    //!  - LoopCount  - Idle loop count
    //
    //###########################################################################
    // $TI Release: $
    // $Release Date: $
    // $Copyright:
    // Copyright (C) 2009-2024 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without 
    // modification, are permitted provided that the following conditions 
    // are met:
    // 
    //   Redistributions of source code must retain the above copyright 
    //   notice, this list of conditions and the following disclaimer.
    // 
    //   Redistributions in binary form must reproduce the above copyright
    //   notice, this list of conditions and the following disclaimer in the 
    //   documentation and/or other materials provided with the   
    //   distribution.
    // 
    //   Neither the name of Texas Instruments Incorporated nor the names of
    //   its contributors may be used to endorse or promote products derived
    //   from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //###########################################################################
    
    //
    // Included Files
    //
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    //
    // Function Prototypes
    //
    __interrupt void xint1_isr(void);
    __interrupt void xint2_isr(void);
    __interrupt void xint3_isr(void);
    
    //
    // Globals
    //
    volatile Uint32 Xint1Count;
    volatile Uint32 Xint2Count;
    volatile Uint32 Xint3Count;
    Uint32 LoopCount;
    
    //
    // Defines
    //
    #define DELAY 35.700L
    
    //
    // Main
    //
    void main(void)
    {
        Uint32 TempX1Count;
        Uint32 TempX2Count;
        Uint32 TempX3Count;
    
        //
        // Step 1. Initialize System Control:
        // PLL, WatchDog, enable Peripheral Clocks
        // This example function is found in the DSP2833x_SysCtrl.c file.
        //
        InitSysCtrl();
    
        //
        // Step 2. Initialize GPIO:
        // This example function is found in the DSP2833x_Gpio.c file and
        // illustrates how to set the GPIO to it's default state.
        //
        // InitGpio();  // Skipped for this example
    
        //
        // Step 3. Clear all interrupts and initialize PIE vector table:
        // Disable CPU interrupts
        //
        DINT;
    
        //
        // Initialize PIE control registers to their default state.
        // The default state is all PIE interrupts disabled and flags
        // are cleared.
        // This function is found in the DSP2833x_PieCtrl.c file.
        //
        InitPieCtrl();
    
        //
        // Disable CPU interrupts and clear all CPU interrupt flags
        //
        IER = 0x0000;
        IFR = 0x0000;
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        // This will populate the entire table, even if the interrupt
        // is not used in this example.  This is useful for debug purposes.
        // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
        // This function is found in DSP2833x_PieVect.c.
        //
        InitPieVectTable();
    
        //
        // Interrupts that are used in this example are re-mapped to
        // ISR functions found within this file.
        //
        EALLOW;	        // This is needed to write to EALLOW protected registers
        PieVectTable.XINT1 = &xint1_isr;
        PieVectTable.XINT2 = &xint2_isr;
        PieVectTable.XINT3 = &xint3_isr;
        EDIS;   // This is needed to disable write to EALLOW protected registers
    
        //
        // Step 4. Initialize all the Device Peripherals:
        // This function is found in DSP2833x_InitPeripherals.c
        //
        // InitPeripherals(); // Not required for this example
    
        //
        // Step 5. User specific code, enable interrupts
        //
    
        //
        // Clear the counters
        //
        Xint1Count = 0; // Count Xint1 interrupts
        Xint2Count = 0; // Count XINT2 interrupts
        Xint3Count = 0; // Count XINT2 interrupts
    
        LoopCount = 0;  // Count times through idle loop
    
        //
        // Enable Xint1 and XINT2 in the PIE: Group 1 interrupt 4 & 5
        // Enable int1 which is connected to WAKEINT:
        //
        PieCtrlRegs.PIECTRL.bit.ENPIE = 1;          // Enable the PIE block
        PieCtrlRegs.PIEIER1.bit.INTx4 = 1;          // Enable PIE Group 1 INT4
        PieCtrlRegs.PIEIER1.bit.INTx5 = 1;          // Enable PIE Group 1 INT5
        PieCtrlRegs.PIEIER12.bit.INTx1 = 1;         // enable PIE Group 12 INT1
        IER |= M_INT1;                              // Enable CPU int1
        IER |= M_INT12;
        EINT;                                       // Enable Global Interrupts
    
        //
        // GPIO30 & GPIO31 are outputs, start GPIO30 high and GPIO31 low
        //
        EALLOW;
        GpioDataRegs.GPASET.bit.GPIO30 = 1;         // Load the output latch
        GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 0;        // GPIO
        GpioCtrlRegs.GPADIR.bit.GPIO30 = 1;         // output
    
        GpioDataRegs.GPACLEAR.bit.GPIO31 = 1;       // Load the output latch
        GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;        // GPIO
        GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;         // output
    
        GpioDataRegs.GPASET.bit.GPIO29 = 1;       // Load the output latch
        GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0;        // GPIO
        GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;         // output
    
        EDIS;
    
        //
        // GPIO0 and GPIO1 are inputs
        //
        EALLOW;
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;      // GPIO
        GpioCtrlRegs.GPADIR.bit.GPIO0 = 0;       // input
        GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 0;     // Xint1 Synch to SYSCLKOUT only
    
        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;      // GPIO
        GpioCtrlRegs.GPADIR.bit.GPIO1 = 0;       // input
        GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 2;     // XINT2 Qual using 6 samples
        
        GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;      // GPIO
        GpioCtrlRegs.GPADIR.bit.GPIO2 = 0;       // input
        GpioCtrlRegs.GPAQSEL1.bit.GPIO2 = 0;     // Xint3 Synch to SYSCLKOUT only
    
        //
        // Each sampling window is 510*SYSCLKOUT
        //
        GpioCtrlRegs.GPACTRL.bit.QUALPRD0 = 0xFF;
        EDIS;
    
        //
        // GPIO0 is XINT1, GPIO1 is XINT2
        //
        EALLOW;
        GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 0;   // Xint1 is GPIO0
        GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 1;   // XINT2 is GPIO1
        GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 1;   // XINT3 is GPIO33 (Refer to User guide) XINT3-7 are assigned to GPIO32-63
    
        EDIS;
    
        //
        // Configure XINT1
        //
        XIntruptRegs.XINT1CR.bit.POLARITY = 0;      // Falling edge interrupt
        XIntruptRegs.XINT2CR.bit.POLARITY = 1;      // Rising edge interrupt
        XIntruptRegs.XINT3CR.bit.POLARITY = 0;      // Falling edge interrupt
    
        //
        // Enable XINT1 and XINT2
        //
        XIntruptRegs.XINT1CR.bit.ENABLE = 1;        // Enable Xint1
        XIntruptRegs.XINT2CR.bit.ENABLE = 1;        // Enable XINT2
        XIntruptRegs.XINT3CR.bit.ENABLE = 1;        // Enable XINT3
    
        //
        // GPIO34 will go low inside each interrupt.  Monitor this on a scope
        //
        EALLOW;
        GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;        // GPIO
        GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;         // output
        EDIS;
    
        //
        // Step 6. IDLE loop
        //
        for(;;)
        {
            TempX1Count = Xint1Count;
            TempX2Count = Xint2Count;
            TempX3Count = Xint3Count;
    
            //
            // Trigger both XINT1
            //
            GpioDataRegs.GPBSET.bit.GPIO34 = 1;   // GPIO34 is high
            GpioDataRegs.GPACLEAR.bit.GPIO30 = 1; // Lower GPIO30, trigger Xint1
            while(Xint1Count == TempX1Count)
            {
                
            }
    
            //
            // Trigger both XINT2
            //
            GpioDataRegs.GPBSET.bit.GPIO34 = 1;   // GPIO34 is high
            DELAY_US(DELAY);                      // Wait for Qual period
            GpioDataRegs.GPASET.bit.GPIO31 = 1;   // Raise GPIO31, trigger XINT2
            while(Xint2Count == TempX2Count)
            {
                
            }
    
            GpioDataRegs.GPBSET.bit.GPIO34 = 1;   // GPIO34 is high
            GpioDataRegs.GPACLEAR.bit.GPIO29 = 1; // Lower GPIO29, trigger Xint3
            while(Xint3Count == TempX3Count)
            {
    
            }
    
            //
            // Check that the counts were incremented properly and get ready
            // to start over.
            //
            if(Xint1Count == TempX1Count+1 && Xint2Count == TempX2Count+1 && Xint3Count == TempX3Count+1)
            {
                LoopCount++;
                GpioDataRegs.GPASET.bit.GPIO30 = 1;   // raise GPIO30
                GpioDataRegs.GPACLEAR.bit.GPIO31 = 1; // lower GPIO31
                GpioDataRegs.GPASET.bit.GPIO29 = 1;   // raise GPIO30
            }
            else
            {
                __asm("      ESTOP0"); // stop here
            }
        }
    }
    
    //
    // Step 7. Insert all local Interrupt Service Routines (ISRs) and 
    // functions here
    //
    
    //
    // Note: If local ISRs are used, reassign vector addresses in vector table as
    // shown in Step 5
    //
    
    //
    // xint1_isr -
    //
    __interrupt void 
    xint1_isr(void)
    {
        GpioDataRegs.GPBCLEAR.bit.GPIO34 = 0x1;   // GPIO34 is low
        Xint1Count++;
    
        //
        // Acknowledge this interrupt to get more from group 1
        //
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    }
    
    //
    // xint2_isr -
    //
    __interrupt void 
    xint2_isr(void)
    {
        GpioDataRegs.GPBCLEAR.bit.GPIO34 = 0x1;   // GPIO34 is low
        Xint2Count++;
    
        //
        // Acknowledge this interrupt to get more from group 1
        //
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    }
    
    __interrupt void
    xint3_isr(void)
    {
        GpioDataRegs.GPBCLEAR.bit.GPIO34 = 0x1;   // GPIO34 is low
        Xint3Count++;
        //
        // Acknowledge this interrupt to get more from group 12
        //
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
    }
    //
    // End of File
    //
    
    

  • Hi Prathan,

    Apologies for the delayed response.

    I was unwell and unable to reply earlier.

    I have reviewed the code, and you are suggesting that GPIO 32 to 63 can be configured for external interrupt 3 to 7, correct?

    However, in my board design, I have used GPIO 16 for the external interrupt. Given this setup, what would be the best approach to configure GPIO 16 for this purpose?

    Best regards,
    Dipak

  • GPIO 32 to 63 can be configured for external interrupt 3 to 7, correct?

    That is how the MCU is designed

    I have used GPIO 16 for the external interrupt.

    You can use GPIO16 with only XINT1-2 instances

    Thanks