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.

[参考译文] MSP430FR4133:UART 配置帮助。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1233733/msp430fr4133-uart-configuration-help

器件型号:MSP430FR4133
主题中讨论的其他器件: MSP430FR6877

您好!

我正在尝试使用 UART 在 MSP430FR4133和 MSP430FR6877 MCU 之间建立通信。 MSP430FR4133采用32.768KHz 的外部晶振来工作。 下面是我用于 UART 初始化的代码片段:

void inituart()

P1SEL0 |=(BIT0 | BIT1);
UCA0CTLW0 &=~μ m (UCSYNC);
UCA0CTLW0 |= UCSWRST;          //将 eUSCI 复位
UCA0CTLW0 |= UCSSEL_UCLK;    // CLK = UCLK

UCA0BR0 = 3;                     //32000/9600
UCA0BR1 = 0x00;
UCA0MCTLW ~(UCOS16);
UCA0CTLW0 &=~μ m (UCSWRST);       //初始化 eUSCI
UCA0IE |= UCRXIE;

}

我发送的字符串如下

guckfactor_array[8]='\0';
guckfactor_array[7]=(((int) digit8)+ 0x30);
guckfactor_array[6]=(((int) digit7)+ 0x30);
guckfactor_array[5]=(((int) digit6)+ 0x30);
guckfactor_array[4]=(((int) digit5)+ 0x30);
guckfactor_array[3]=((( int ) digit4 )+ 0x30 );
guckfactor_array[2]=((( int ) digit3 )+ 0x30 );
guckfactor_array[1]=(((int) digit2)+ 0x30);
guckfactor_array[0]=(((int) digit1)+ 0x30 );

inituart();
UARTPutString (guckfactor_array);

在代码中、字符串是通过将每个数字分配给数组元素并将其转换为 ASCII 来构建的。

用于向 UART 发送数据的片段如下  


void UARTPutString (字符*str)

无符号 int i=0;
while (str[i]!='\0')//检查 NULL 字符以终止循环
 {
  while (!(UCA0IFG 和 UCTXIFG));
  UCA0TXBUF = str[i];
  __ delay_cycles (10);
  I++;
  }
}

但是,当第一个字节被写入时UCA0TXBUFUCTXIFG标志被重置,但UCTXCPTIFG标志保持未设置状态。 因此、程序在 while 条件下进入一个无限循环。 似乎是数据没有被成功的传输到移位寄存器TXBUF.我怎么知道数据是否被 TXBUF 放入移位寄存器? 我在 PuTTY 上没有看到任何内容。我由此推断出什么?请查看代码并建议解决方案。CCS 版本为12.0.0
谢谢。此致。
Pratik.

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

    您是否清除了 LOCKLPM5?

    您已经通过 UCLK 选择了一个外部时钟源。 您是否配置了该引脚? 您可以选择内部时钟是 SMCLK 和 MODCLK。

    如果在上电清除后的任何其他时间调用您的初始化可能会失败。 UCSYNC 是在 UCSWRST 置位时不能更改的位之一。 两个都是在上电时。

    比特率不是9600。 这将需要设置调制位。 如果两个 MSP430使用相同的设置、则没问题。 (如果使用调制模式、它们必须相同。)

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

    感谢您的答复 David!
    是的、我已经在 PMCTL0中清除了 LOCKLPM5。
    还为 SMCLK 配置了引脚。 正如您建议的、我在设置 UCSWRST 后移动了 USync 清除部分。
    现在、我能够在 Docklight (在我的 PC 上)上接收控制器发送的数据。
    但是、当我从 PC 向控制器发送数据时、似乎有一个问题。
    控制器不会为接收数据而跳转至 ISR

    以下是更新后的用于 MSP430FR4133的 UART 初始化函数

    P1SEL0 |=(BIT0 | BIT1);
    UCA0CTLW0 |= UCSWRST;             //将 eUSCI 复位
    UCA0CTLW0 &=~μ m (UCSYNC);
    UCA0CTLW0 |= UCSSEL__SMCLK;      // CLK = SMCLK
    UCA0BR0 = 0x68;                     // 1000000/9600
    UCA0BR1 = 0x00;
    UCA0CTLW0 &=~μ m (UCSWRST);          //初始化 eUSCI
    UCA0IE |= UCRXIE;


    ISR 函数如下

    #if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
    #pragma vector=USCI_A0_vector
    __interrupt void USCI_A0_ISR (void)
    #Elif 已定义(_ GNU _)
    void __attribute__((interrupt (USCI_A1_vector))) USCI_A1_ISR (void)
    #else
    #错误编译器不受支持!
    #endif

    switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))

    USCI_NONE:中止;
    案例 USCI_UART_UCRXIFG:
    while (!(UCA0IFG&UCTXIFG));
    gucrcvChar = UCA0RXBUF;
    gucRxBuffer[guiRXIndex]= gucrcvChar;
    guiRXIndex++;

    中断;
    USCI_UART_UCTXIFG 情况:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;
    }
    }



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

    您是否在某处启用中断? (__enable_interrupt ();)