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.

MSP430F67641A: UART stops receiving data after overrun error in debug mode/breakpoints

Part Number: MSP430F67641A
Other Parts Discussed in Thread: MSP430F67641


Dear Team,

I am interfacing an RF module through Asynchronous UART at 9600 baudrate. My RF module is receiving data every 2 seconds once and writing out to be read by the controller MSP430F67641.

The problem i face is that, whenever i place a breakpoint in my code, i get an overrun error set (UCOE and UCRXERR set) and i am no longer able to receive any data anymore until i hit a full reset.

I do not get this issue while i do not halt the target with breakpoints and allow it to run continuously. I know that if i halt the core with a breakpoint, the external RF still receives some data and writes the data to the controller and there is surely some data missed to be received. But i expected that UART module is also be paused without receiving anything and just the intermediate data is lost instead of a overrun error.

I did not notice this strange overrun behaviour in the other MSP430 controllers i used in other projects while in breakpoint.

Attached the key parts of my code. Could you please help here ?

Thanks

Surya


void SetClock_24Mhz()
{

    SetVCore(3);
    // Setup UCS
    UCSCTL3 |= SELREF_2;                   // Set DCO FLL reference = REFO
    UCSCTL4 |= SELA_2;                     // Set ACLK = REFO

    UCSCTL5 |= DIVS__2 | DIVA__4 | DIVM__1;
    UCSCTL4 |= SELM__REFOCLK | SELS__REFOCLK | SELA__REFOCLK;     /* 24MHz MCLK, 12MHz SMCLK, ACLK  (6Mhz)*/


    __bis_SR_register(SCG0);               // Disable the FLL control loop
    UCSCTL0 = 0x0000;                      // Set lowest possible DCOx, MODx
    UCSCTL1 = DCORSEL_7;                   // Select DCO range 24MHz operation
    UCSCTL2 = FLLD_1 | 732;                // Set DCO Multiplier for 24MHz
                                           // (N + 1) * FLLRef = Fdco
                                           // (732 + 1) * 32768 = 24MHz
                                           // Set FLL Div = fDCOCLK/2
    __bic_SR_register(SCG0);               // Enable the FLL control loop

    __delay_cycles(250000);
    __delay_cycles(250000);
    __delay_cycles(250000);
    __delay_cycles(250000);

    // Loop until XT1, XT2 & DCO fault flag is cleared
    do
    {
        UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
        // Clear XT2,XT1,DCO fault flags
        SFRIFG1 &= ~OFIFG;                 // Clear fault flags
    } while (SFRIFG1 & OFIFG);             // Test oscillator fault flag

    SFR_clearInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);
    SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);

    __delay_cycles(250000);

}


void Uart_Init_9600()
{

    // Setup P2.2 UCA2RXD, P2.3 UCA2TXD
    P2SEL |= BIT2 | BIT3;                   // Set P2.2, P2.3 to non-IO
    P2DIR |= BIT2 | BIT3;                   // Enable UCA2RXD, UCA2TXD

    // Setup eUSCI_A2
    UCA2CTLW0 |= UCSWRST;                   // **Put state machine in reset**
    UCA2CTLW0 |= UCSSEL__SMCLK | UCRXEIE;             // SMCLK (12Mhz) accurate -> 12009472 Hz

    /*
     * Baud Rate calculation (9600) [PAge No- 586 user guide 2433]
     * 12009472/(9600) = 1250  [Greater than 16. So proceed with next calc's]
     * (1250.987/16) = 78.186  => (UCA1BR0 = 78)
     *
     * UCBRFx = (0.186*16) = 2.98 => 3 roundoff
     * User's Guide Table 22-4: Decimal value of (0.00) is UCBRSx = 0x00
     */

    UCA2BRW = 78;                       // 24MHz 9600
    UCA2MCTLW = UCBRF_3 | UCOS16;          // Modln UCBRSx=0, UCBRFx=0x13,

    UCA2CTLW0 &= ~UCSWRST;                  // **Initialize USCI state machine**
    UCA2IE |= UCRXIE;                       // Enable USCI_A2 RX interrupt

}


#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A2_VECTOR
__interrupt void USCI_A2_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A2_VECTOR))) USCI_A2_ISR (void)
#else
#error Compiler not supported!
#endif
{
    switch (__even_in_range(UCA2IV, USCI_UART_UCTXCPTIFG))
    {
        case USCI_NONE: break;              // No interrupt
        case USCI_UART_UCRXIFG:             // RXIFG

            UCA2_Status = UCA2STATW;
            if (UCA2_Status & UCRXERR)
            {
                // This part of code is hit when i set a breakpoint and some data is receiveid during that time
                DummyRX = UCA2RXBUF; // Dummy read to clear out data
                UARTErrorCnt++;
            }
            else
            {
                UartRxBuff[UartRxCnt] = UCA2RXBUF;          // TX -> RXed character

                /* Check if new line received and set processing flag */
                if(UartRxBuff[UartRxCnt] == 0x0A) { UartRxFlg = true; }
                UartRxCnt++;
            }

            /* If RX buffer exceeds then process and flush garbage data */
            if(UartRxCnt >= UartRxBuffMAX)
            {
                UartRxCnt = UartRxBuffMAX;
                UartRxFlg = true;
            }
            break;
        case USCI_UART_UCTXIFG: break;      // TXIFG
        case USCI_UART_UCSTTIFG: break;     // TTIFG
        case USCI_UART_UCTXCPTIFG: break;   // TXCPTIFG
        default: break;
    }
}

  • Hi,

    Since your UART baudrate is 9600. You can use a lower frequency clock for the UART clock source instead of using the SMCLK.

    Best regards,

    Cash Hao

  • Hi,

    Thanks for your reply. I tried using the AUXCLK with prescalar of 8 and even more lesser clock rates but none of them helped.

    Maybe to confine my problem

    1) When i halt the core with a breakpoint, and at this time when i send some data to UART i am getting this overrun error while i resume back my code. Is this an expected behavior for MSP430 controllers ?

    2) Incase i encounter this overrun issue, how do we come out of this to get the UART RX back working ?. I tried to clear the error by reading the RX buffer and the error is cleared, but i can no longer receive any RX data anymore until i restart.

    Thanks again

    Surya

**Attention** This is a public forum