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.

C6748 UART interrupt has no response using the example of uart int C6748_StarterWare\examples\lcdkC6748\uart

Hello,

I have a C6748 test board and I'm using a modified uartEcho program from C6748_StarterWare_1_20_04_01.

1.I modified the example of  C6748_StarterWare\examples\lcdkC6748\uart, I only delete(mask) the code of " length--; count++; "in UARTIsr().

2.I sent seven characters to uart using pc every second;

3.The uart can not transmit and receive after the board run a few minutes, 

Any suggestions or reasons?

The code is shown below.

#include "hw_psc_C6748.h"

#include "soc_C6748.h"

#include "interrupt.h"

#include "lcdkC6748.h"

#include "hw_types.h"

#include "uart.h"

#include "psc.h"

/****************************************************************************/

/*                      LOCAL FUNCTION PROTOTYPES                           */

/****************************************************************************/

static void ConfigureIntUART(void);

static void SetupInt(void);

static void UARTIsr(void);

/****************************************************************************/

/*                      GLOBAL VARIABLES                                    */

/****************************************************************************/

char txArray[] = "StarterWare UART echo application\n\r";

/****************************************************************************/

/*                      LOCAL FUNCTION DEFINITIONS                          */

/****************************************************************************/

int main(void)

{

    unsigned int intFlags = 0;

    unsigned int config = 0;

    /* Enabling the PSC for UART0.*/

    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,

    PSC_MDCTL_NEXT_ENABLE);

    /* Setup PINMUX */

    UARTPinMuxSetup(0, FALSE);

    

    /* Enabling the transmitter and receiver*/

    UARTEnable(SOC_UART_0_REGS);

    /* 1 stopbit, 8-bit character, no parity */

    config = UART_WORDL_8BITS;

    /* Configuring the UART parameters*/

    UARTConfigSetExpClk(SOC_UART_0_REGS, SOC_UART_0_MODULE_FREQ,

                        BAUD_115200, config,

                        UART_OVER_SAMP_RATE_16);

    /* Enabling the FIFO and flushing the Tx and Rx FIFOs.*/

    UARTFIFOEnable(SOC_UART_0_REGS);

    /* Setting the UART Receiver Trigger Level*/

    UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);

    

    /*

    ** Enable AINTC to handle interrupts. Also enable IRQ interrupt in ARM 

    ** processor.

    */

    SetupInt();

    /* Configure AINTC to receive and handle UART interrupts. */

    ConfigureIntUART();

    /* Preparing the 'intFlags' variable to be passed as an argument.*/

    intFlags |= (UART_INT_LINE_STAT  |  \

                 UART_INT_TX_EMPTY |    \

                 UART_INT_RXDATA_CTI);

    /* Enable the Interrupts in UART.*/

    UARTIntEnable(SOC_UART_0_REGS, intFlags);

    while(1);

}

/*

** \brief   Interrupt Service Routine(ISR) to be executed on UART interrupts.

**          Depending on the source of interrupt, this 

**          1> writes to the serial communication console, or 

**          2> reads from the serial communication console, or 

**          3> reads the byte in RBR if receiver line error has occured.

*/

static void UARTIsr()

{

    static unsigned int length = sizeof(txArray);

    static unsigned int count = 0;

    unsigned char rxData = 0;

    unsigned int int_id = 0;

    /* This determines the cause of UART0 interrupt.*/

    int_id = UARTIntStatus(SOC_UART_0_REGS);

#ifdef _TMS320C6X

    // Clear UART0 system interrupt in DSPINTC

    IntEventClear(SYS_INT_UART0_INT);

#else

    /* Clears the system interupt status of UART0 in AINTC. */

    IntSystemStatusClear(SYS_INT_UARTINT0);

#endif

  

    /* Checked if the cause is transmitter empty condition.*/

    if(UART_INTID_TX_EMPTY == int_id)

    {

        if(0 < length)

        {

            /* Write a byte into the THR if THR is free. */

            UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);

//            length--;

//            count++;

        }

        if(0 == length)

        {

            /* Disable the Transmitter interrupt in UART.*/

            UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);

        }

     }

    /* Check if the cause is receiver data condition.*/

    if(UART_INTID_RX_DATA == int_id)

    {

        rxData = UARTCharGetNonBlocking(SOC_UART_0_REGS);

//        UARTCharPutNonBlocking(SOC_UART_0_REGS, rxData);

    }

    /* Check if the cause is receiver line error condition.*/

    if(UART_INTID_RX_LINE_STAT == int_id)

    {

        while(UARTRxErrorGet(SOC_UART_0_REGS))

        {

            /* Read a byte from the RBR if RBR has data.*/

            UARTCharGetNonBlocking(SOC_UART_0_REGS);

        }

    }

    return;

}

/*

** \brief   This function invokes necessary functions to configure the ARM

**          processor and ARM Interrupt Controller(AINTC) to receive and

**          handle interrupts.

*/

static void SetupInt(void)

{

#ifdef _TMS320C6X

// Initialize the DSP INTC

    IntDSPINTCInit();

// Enable DSP interrupts globally

    IntGlobalEnable();

#else

    /* Initialize the ARM Interrupt Controller(AINTC). */

    IntAINTCInit();

    /* Enable IRQ in CPSR.*/     

    IntMasterIRQEnable();

    /* Enable the interrupts in GER of AINTC.*/

    IntGlobalEnable();

    /* Enable the interrupts in HIER of AINTC.*/

    IntIRQEnable();

#endif

}

/*

** \brief  This function confiugres the AINTC to receive UART interrupts.

*/ 

static void ConfigureIntUART(void)

{

#ifdef _TMS320C6X

    IntRegister(C674X_MASK_INT4, UARTIsr);

    IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);

    IntEnable(C674X_MASK_INT4);

#else

    /* Registers the UARTIsr in the Interrupt Vector Table of AINTC. */

    IntRegister(SYS_INT_UARTINT0, UARTIsr);

    /* Map the channel number 2 of AINTC to UART0 system interrupt. */

    IntChannelSet(SYS_INT_UARTINT0, 2);

    IntSystemEnable(SYS_INT_UARTINT0);

#endif

}