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_StarterWare例程中的examples\lcdkC6748\uart中的例程出现串口中断无响应



您好:

    使用C6748_StarterWare例程中的examples\lcdkC6748\uart中的例程稍作如下修改:

1、屏蔽了串口中断函数中的"length--;和count++;"语句;

2、将uart2修改为uart0;

3、以1S一次的速率通过计算机每次给串口发送7个字符abcdefg;

4、几分钟后串口无响应,再也不能发送和接收,串口中断无响应;

请教,这是怎么造成的,是什么原因呢?

代码如下,附件中也有代码:

#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

}