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 停止接收数据

Guru**** 2378650 points
Other Parts Discussed in Thread: MSP430F67641
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1053559/msp430f67641a-uart-stops-receiving-data-after-overrun-error-in-debug-mode-breakpoints

器件型号:MSP430F67641A
主题中讨论的其他器件:MSP430F67641


尊敬的团队:

我正在通过9600波特率的异步 UART 连接射频模块。 我的射频模块每2秒接收一次数据、并进行写操作以供控制器 MSP430F67641读取。

我面临的问题是、每当我在代码中放置断点时、我都会得到一个溢出错误集(UCOE 和 UCRXERR 集)、并且在我完成完全复位之前、我不再能够接收任何数据。

当我不使用断点停止目标并允许其持续运行时、我不会遇到此问题。 我知道、如果我用断点停止内核、外部射频仍会接收一些数据并将数据写入控制器、并且肯定会错过一些数据。 但我希望 UART 模块也能在不接收任何内容的情况下暂停、并且只会丢失中间数据而不是溢出错误。

在断点时、我没有注意到我在其他项目中使用的其他 MSP430控制器中的这种奇怪的溢出行为。

我的代码的关键部分。 请在这里提供帮助吗?

谢谢

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;
    }
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    因为您的 UART 波特率为9600。 您可以为 UART 时钟源使用较低频率的时钟、而不是使用 SMCLK。

    此致、

    现金 Hao

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回复。 我尝试使用预分频器为8的 AUXCLK、甚至更低的时钟速率、但没有一个帮助。

    可能会限制我的问题

    1) 1)当我用断点停止内核时、此时当我向 UART 发送一些数据时、我在恢复代码时收到此溢出错误。 这是 MSP430控制器的预期行为吗?

    2) 2)如果遇到此溢出问题,我们如何通过它使 UART RX 恢复工作? 我尝试通过读取 RX 缓冲区来清除错误、并且错误被清除、但在我重新启动之前、我无法再接收任何 RX 数据。

    再次感谢

    Surya