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:MSP430fr4133 UART 波特率1200不起作用

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/992217/msp430fr4133-msp430fr4133-uart-baudrate-1200-doesn-t-work

器件型号:MSP430FR4133

在我之前的帖子中、msp430fr4133的 eUSCI 无法使用 aclk、因此建议我通过调整来设置 smclk 值。(smclk = 1MHz、BRW = 833)

我制作了1MHz smclk 并设置了1200波特率 UART、但传输无法正常工作...  (我想在 msp430fr4133上以1200波特率进行 UART 通信)

下面是我设置的整个代码。

(我通过仅更改 initUART 和 initClockTo16mHz 中的设置值来创建 initUART_1200()和 initClockTo1MHz。 逻辑的其余部分与基准电压相同。

#include <msp430.h>

//******************************************************************************
// UART Initialization *********************************************************
//******************************************************************************

#define LED_OUT     P1OUT
#define LED_DIR     P1DIR
#define LED_PIN     BIT2

#define SMCLK_115200     0
#define SMCLK_9600       1

#define UART_MODE       SMCLK_115200//SMCLK_9600//

void initUART()
{
    // Configure USCI_A0 for UART mode
    UCA0CTLW0 |= UCSWRST;                      // Put eUSCI in reset
#if UART_MODE == SMCLK_115200

    UCA0CTLW0 |= UCSSEL__SMCLK;               // CLK = SMCLK
    // Baud Rate Setting
    // Use Table 21-5
    UCA0BRW = 8;
    UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;   //0xF700 is UCBRSx = 0xF7

#elif UART_MODE == SMCLK_9600

    UCA0CTLW0 |= UCSSEL__SMCLK;               // CLK = SMCLK
    // Baud Rate Setting
    // Use Table 21-5
    UCA0BRW = 104;
    UCA0MCTLW |= UCOS16 | UCBRF_2 | 0xD600;   //0xD600 is UCBRSx = 0xD6
#else
    # error "Please specify baud rate to 115200 or 9600"
#endif

    UCA0CTLW0 &= ~UCSWRST;                    // Initialize eUSCI
    UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
}

void initUART_1200()
{
    // Configure USCI_A0 for UART mode
    UCA0CTLW0 |= UCSWRST;
    UCA0CTLW0 |= UCSSEL__SMCLK;

    UCA0BRW = 52;
    UCA0MCTLW |= UCOS16 | UCBRF_1 | 0x4900;

    UCA0CTLW0 &= ~UCSWRST;
    UCA0IE |= UCRXIE;
}

//******************************************************************************
// Device Initialization *******************************************************
//******************************************************************************

void initGPIO()
{
    LED_DIR |= LED_PIN;
    LED_OUT &= ~LED_PIN;

    // USCI_A0 UART operation
    P1SEL0 |= BIT0 | BIT1;

    // Disable the GPIO power-on default high-impedance mode to activate
    // previously configured port settings
    PM5CTL0 &= ~LOCKLPM5;
}

void initClockTo16MHz()
{
    // Configure one FRAM waitstate as required by the device datasheet for MCLK
    // operation beyond 8MHz _before_ configuring the clock system.
    FRCTL0 = FRCTLPW | NWAITS_1;

    __bis_SR_register(SCG0);    // disable FLL
    CSCTL3 |= SELREF__REFOCLK;  // Set REFO as FLL reference source
    CSCTL0 = 0;                 // clear DCO and MOD registers
    CSCTL1 &= ~(DCORSEL_7);     // Clear DCO frequency select bits first
    CSCTL1 |= DCORSEL_5;        // Set DCO = 16MHz
    CSCTL2 = FLLD_0 + 487;      // set to fDCOCLKDIV = (FLLN + 1)*(fFLLREFCLK/n)
                                //                   = (487 + 1)*(32.768 kHz/1)
                                //                   = 16 MHz
    __delay_cycles(3);
    __bic_SR_register(SCG0);                        // enable FLL
    while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));      // FLL locked

    CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;
}

void initClockTo1MHz()
{
    // Configure one FRAM waitstate as required by the device datasheet for MCLK
    // operation beyond 8MHz _before_ configuring the clock system.

    FRCTL0 = FRCTLPW | NWAITS_1;

    __bis_SR_register(SCG0);    // disable FLL
    CSCTL3 |= SELREF__REFOCLK;  // Set REFO as FLL reference source
    CSCTL0 = 0;                 // clear DCO and MOD registers
    CSCTL1 &= ~(DCORSEL_7);     // Clear DCO frequency select bits first
    CSCTL1 |= DCORSEL_0;        // Set DCO = 1MHz
    CSCTL2 = FLLD_0 + 30;       // set to fDCOCLKDIV = (FLLN + 1)*(fFLLREFCLK/n)
                                //                   = (487 + 1)*(32.768 kHz/1)
                                //                   = 16 MHz
    __delay_cycles(3);
    __bic_SR_register(SCG0);                        // enable FLL
    while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));      // FLL locked

    CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;
}

//******************************************************************************
// Main ************************************************************************
// Enters LPM0 if SMCLK is used and waits for UART interrupts. If ACLK is used *
// then the device will enter LPM3 mode instead. The UART RX interrupt handles *
// the received character and echoes it.                                       *
//******************************************************************************

int main(void)
{
  WDTCTL = WDTPW | WDTHOLD;                 // Stop Watchdog

  initGPIO();
  //initClockTo16MHz();
  //initUART();
  initClockTo1MHz();
  initUART_1200();


#if UART_MODE == SMCLK_9600
    __bis_SR_register(LPM0_bits + GIE);       // Since ACLK is source, enter LPM0, interrupts enabled
#else
    __bis_SR_register(LPM0_bits + GIE);       // Since SMCLK is source, enter LPM0, interrupts enabled
#endif
  __no_operation();                         // For debugger
}

//******************************************************************************
// UART Interrupt ***********************************************************
//******************************************************************************

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
  switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
  {
    case USCI_NONE: break;
    case USCI_UART_UCRXIFG:
      while(!(UCA0IFG&UCTXIFG));
      UCA0TXBUF = UCA0RXBUF;
      __no_operation();
      break;
    case USCI_UART_UCTXIFG: break;
    case USCI_UART_UCSTTIFG: break;
    case USCI_UART_UCTXCPTIFG: break;
  }
}

是否有任何错误或部件缺失? 或者是否还有其他需要更改的内容?

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

    你(们)好

    根据 《MSP430FR4xx 和 MSP430FR2xx 系列用户指南》(修订版 I)的"22.3.10inga 设置波特率"、我认为以下设置在1MHz UART 时钟为1200bps 时是正确的。

    空 inituart_1200()

       //将 USCI_A0配置为 UART 模式
       UCA0CTLW0 |= UCSWRST;
       UCA0CTLW0 |= UCSSEL_SMCLK;

       UCA0BRW = 52;
       UCA0MCTLW |= UCOS16 | UCBRF_1 | 0x4900;

       UCA0CTLW0 &=~UCSWRST;
       UCA0IE |= UCRXIE;

    请考虑使用示波器检查 SMCLK 频率和 UART 波形。

    谢谢!

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

    如果您使用的是 Launchpad、请务必移除 JP1 (LED1)上的跳线、因为它还连接到 TXD (P1.0)引脚。

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

    我尝试了您的建议、但它不能正常工作。

    目前为止、只有文档表(MSP430FR4xx 和 MSP430FR2xx 系列表22-5、第589页)中显示的值才能正常工作。

    对于9600或115200波特率、表中提供了各种 BRCLK 内容、例如1M、4M 和16M、并且工作正常。(即使是使用我所做的设置。)

    对于32768 BRCLK、仅在表中显示1200波特率。

    我不知道这是不是原因,但它在1M BRCLK 设置中不起作用

    由于硬件结构、UCLK 无法在我的实际电路板上使用。 因此、我想使用 modclk 使用1200波特率。

    但 modclk 称为5M 固定值。 当我设置基于5M BRCLK (modclk)时、它不起作用。

    是否可以使用 modclk (msp430fr4133)设置 UART 1200波特率?  

    2.如果使用时没有问题,我对设置值很好奇(根据文档中的公式计算的值不起作用)
      我已经知道 在线计算器 

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

    我在我的 Launchpad 上看到相同的行为。 通过反向通道 UART 使用 UCA0、在主机处使用 PuTTY 时、我看到:

    1) 1)当我在 PuTTY 上键入时、我会在 RXD 上看到(单个)非常短的脉冲

    2) 2)当我使用调试器在 UCA0TXBUF 中放置一个字节时、我会在 TXD 上看到一个非常好的波形。 这表明 MSP430正在做正确的事情。

    我认为问题是反向通道 UART 无法以1200bps 的速率运行。 调试器用户指南(SLAU647O )中的表14未列出1200bps、最低的为4800bps。 [虽然我很确定我的运行速度超过115kbps。]

    您可能会成功使用外部 USB/UART 转换器、例如 FT232。

    我怀疑您不会成功使用 MODCLK、因为它仅指定为+/-20%。