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.

[参考译文] MSP430F4152:UART

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1189939/msp430f4152-uart

器件型号:MSP430F4152
主题中讨论的其他器件: MSP430FR5962

您好!
我将 MSP430f4152与4MHz 外部晶振搭配使用。
时钟、定时器和 GPIO 功能正常工作。
此外、我将软件 I2C 用于 MLX90614温度传感器。
也没关系。
但是、我遇到了 UART 问题。
当我执行 UART 程序时、MCU 暂停。
以下是我的 UART 设置和 UART 过程。

<UART init>
void init_USCI(void)
{
    UCA0CTL1 |= UCSSEL_2;                  // SMCLK
    UCA0BR0 = 26;                                   // High Frequency Mode, Over sampling(UCOS16 = 1)
    UCA0BR1 = 0;
    UCA0MCTL |= UCBRF_1 + UCOS16; // UCBRFx = 1, UCOS16 = 1
    UCA0CTL1 &= ~UCSWRST;                // **Initialize USCI state machine**
    IE2 |= UCA0RXIE;                                // Enable USCI_A0 RX interrupt
}

<UART sending procedure>
void UCA0_chout(unsigned char tx_ch)
{
    while(!(IFG2&UCA0TXIFG));
    UCA0TXBUF = tx_ch;
}

void UCA0_strout_length(UBYTE *tx_str, UBYTE length)
{
    UBYTE I;
    for(i=0; i<length; i++) {
    UCA0_chout(*(tx_str+i));
}
}

请帮帮我。

谢谢、

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

    您启用接收中断、但不显示中断服务例程。

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

    感谢您的快速回复。
    发布的代码不是整个代码。
    结果是相同的。
    下面是我正在使用的 RX 中断过程。

    //回显 RXed 字符,确认 TX 缓冲区已准备就绪
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=USCIAB0RX_vector
    _interrupt void USCIA0RX_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((interrupt (USCIAB0RX_vector)) USCIA0RX_ISR (void)
    其他
    错误编译器不受支持!
    #endif

      //while (!(IFG2&UCA0TXIFG));
      //UCA0TXBUF = UCA0RXBUF;// TX -> RXED 字符


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

    完全不执行任何操作的 ISR 将不会清除 RXIFG。 因此、中断再次发生。 再说一次。

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

    您好!
    在中断服务例程中插入以下代码后、
    MCU 停止问题已解决。

    IFG2 &=~UCA0RXIFG;


    但是、我的音频模块的 UART 通信失败。
    因此、我检查了 MCLK 时钟。 然后、我的板具有不同的 MCLK 频率。 3.265MHz、3.187MHz、3.238MHz、3.539MHz
    我的板具有4MHz 外部晶体。
    以下代码是时钟初始化代码。

    空 init_Clock (空)

      FLL_CTL0 |= XTS_FLL;
      FLL_CTL1 |= SELM_A;

    如何解决此问题?
    感谢您的评论。
    谢谢、



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

    您好!

    首先、在论坛上发布代码时、请使用插入- 代码实用程序、以实现更好的可读性。 我已经修改了您的帖子以反映此更改。

    第二、要调试 UART、 请参阅此应用手册 以及我们 要比较的标准 UART 示例。  

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

    该文档详细介绍了波特率的生成。 阅读它、可以清楚地看到如何从参考时钟中获取所需的波特率。

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

    您好!

    感谢您的回复。
    我将介绍您推荐的文档和标准 UART 示例。
    此时、我的好奇心是、时钟(MCLK)与外部晶体不是稳定的。
    此外、感谢您提供有关插入代码实用程序的信息。 它具有比以往更高的可读性。
    我将 UART 输出波形与其他 MCU (MSP430FR5962)进行比较
    如果我有任何结果、我将发布它们。

    谢谢、此致、

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

    您好!
    由于时钟不稳定、因此使用外部4MHz 晶振时、UART 设置失败。
    因此、我将外部4MHz 晶体替换为32.768kHz 晶体。
    最后、我使用9600bps UART 设置与声音模块进行通信。 以下是我的代码。

    void initClockTo16MHz()
    {
        FLL_CTL0 |= DCOPLUS + XCAP11PF;           // DCO+ set, freq = xtal x D x N+1
        SCFI0 = FLLD_4+FN_4;                      // x4 DCO freq, 16MHz nominal DCO
        SCFQCTL = 121;                            // (121+1) x 32768 x 4 = 16 MHz
    }
    
    void initUART()
    {
        UCA0CTL1 |= UCSSEL_1;                     // ACLK
        UCA0BR0 = 3;                              // 32768Hz 9600
        UCA0BR1 = 0;                              // 32768Hz 9600
        UCA0MCTL = UCBRS_3;                       // Modulation UCBRSx = 3
        UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
        IFG2 &= ~(UCA0RXIFG);
        //IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
    }
    
    void UCA0_chout(unsigned char tx_ch)
    {
        while(!(IFG2&UCA0TXIFG));
        UCA0TXBUF = tx_ch;
    }
    
    void UCA0_strout_length(UBYTE *tx_str, UBYTE length)
    {
        UBYTE i;
        for(i=0; i<length; i++) {
            UCA0_chout(*(tx_str+i));
        }
    }

    谢谢、此致、