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.

[参考译文] MSP430G2553:仿真 EXP HW UART 波特率不一致。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1373873/msp430g2553-emulation-exp-hw-uart-baud-rate-inconsistent

器件型号:MSP430G2553
主题中讨论的其他器件:MSP430G2533

工具与软件:

#include <msp430.h>
#include <intrinsics.h>

#if defined(__IAR_SYSTEMS_ICC__)
int16_t __low_level_init(void) {
    // Stop WDT (Watch Dog Timer)
    WDTCTL = WDTPW + WDTHOLD;
    return(1);
}

#endif

#define LED BIT0
#define RXD BIT1
#define TXD BIT2

void initGPIO() {
    P1OUT &= ~LED;                 // Clear LED output
    P1DIR |= LED;                  // Set P1.0 as output

    P1SEL = BIT1 + BIT2;            // P1.1 = RX, P1.2 = TX
    P1SEL2 = BIT1 + BIT2;           // P1.1 = RX, P1.2 = TX
}

void initUART() {
    UCA0CTL1 |= UCSSEL_2;          // SMCLK
    UCA0BR0 = 104;                 // 1MHz 9600
    UCA0BR1 = 0;                   // 1MHz 9600
    UCA0MCTL = UCBRS0;             // Modulation UCBRSx = 1
    UCA0CTL1 &= ~UCSWRST;          // Initialize USCI state machine
}

void initWatchdog() {
    WDTCTL = WDT_MRST_32;          // Watchdog timer +/-32ms with SMCLK/32768
    // IE1 |= WDTIE;                  // Enable WDT interrupt
}


void initClock() {
    if (CALBC1_1MHZ==0xFF)         // If calibration constant erased
    {
        while(1);                  // do not load, trap CPU!!
    }
    //DCOCTL = 0;                    // Select lowest DCOx and MODx settings
    //BCSCTL1 = CALBC1_1MHZ;         // Set DCO
    //DCOCTL = CALDCO_1MHZ;

    BCSCTL1 = CALBC1_1MHZ;                    // Set range
    DCOCTL = CALDCO_1MHZ;
    BCSCTL2 &= ~(DIVS_3);                     // SMCLK = DCO = 1MHz
}// Clock calbirated at 1 MHz

void sendUART(char *text) {
    unsigned int i = 0;
    while(text[i] != '\0') {
        while (!(IFG2 & UCA0TXIFG)); // Wait for TX buffer to be ready
        UCA0TXBUF = text[i];
        i++;
    }
}

// Watchdog Timer interrupt service routine
int timerA_counter=0; 

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void) {
    timerA_counter++;
}

void initTimerA(void) {
    TACTL = TASSEL_2 + MC_1 + ID_3; // SMCLK, up mode, input divider = 8
    TACCR0 = (unsigned int)(125000 - 1);           // Count up to 125000 (1-second interval with 1 MHz SMCLK/8)
    TACCTL0 = CCIE;                // Enable interrupt for CCR0
}

int main(void) {
    WDTCTL = WDTPW + WDTHOLD;      // Stop watchdog timer
    initClock();                   // Setup clock
    initGPIO();                    // Initialize GPIO
    initUART();                    // Initialize UART
    initTimerA();                  // Initialize Timer A
    initWatchdog();                // Initialize watchdog timer

    // __bis_SR_register(GIE);        // Enable global interrupts
    _enable_interrupts();
    char out_string[] = "Hello World\n";
    // sendUART(out_string);
    while (1) {
        __no_operation();          // For debugger
        if (timerA_counter > 1)
        {
                P1OUT ^= LED;               // Toggle LED
                sendUART(out_string);
                timerA_counter = 0; 
        }
        WDTCTL = WDTPW | WDTCNTCL; // Kick the watchdog        
    }
}

我编写了一个我可以想象的最简单的代码、通过 HW UART 定期打印"Hello world"。  

我预计波特率为9600bps、但 TeraTerm 仅在配置为2400bps 时才显示数据、但 我不知道为什么。  

有什么提示吗?

我在理论上、因此 firs #ifdef 不适用。  

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

    尊敬的 Luca:

    TI 提供了一个用于 Buad Rate 计算器-> MSP430 USCI/EUSCI UART 波特率计算器的在线计算器(TI.com)

    我相信您需要启用过采样。  通常、当从32kHz 时钟源生成9600时、您设置过采样= 0、否则= 1、我会看到1MHz 时钟。  上面的链接将一步你 trought 这一切。

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

    尊敬的 Dennis:  

    感谢您的答复。  

    我尝试使用 FTDI/UART 直接连接到 TX/RX 引脚、一切都正常。  

    也许还有 其他一些 配置可以允许仿真板与窗口通信?

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

    尊敬的 Luca:

    我来确认一下您的设置是否正确。  您说、当您将 FTDI 直接连接到 MSP430G2533 RX 和 TX (引脚1.0和1.1)时、它工作正常、对吗?  您以前是如何连接的、但现在无法连接?

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

    Bruce 现在遇到了哪里、当您需要他时、我将遇到一个有关 MSP-FET 和低波特率的问题...

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

    (旧) G2 Launchpad 限制为9600bps [请参阅 SLAU647O 表18]。 G2ET (eZFET-Lite)在没有流控制的情况下可高达28800bps [表14]。 奇怪的是、两个表中都没有提到2400bps。

    [编辑:也就是说,这种症状是相当奇怪的。]

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

    我在网上读到关于9600bps 限制。

    是的、在我之前会通过垂直或水平方式测试 RX 和 TX 引脚、但运气差。  

    背景提示:由于是不工作的、我尝试运行"MSP-EXP430G2-LaunchPad 用户体验应用"来验证该电路板是否工作正常。  

    示例不起作用。 然后、回到原始固件、我可以看到"hello world"以2400 kps 的速率打印。

    这就是我假设我缺少某些配置的原因。  

    已在 Windows + TeraTerm 上尝试、尚未在 mincom 和* nix 上尝试。

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

    尊敬的 Luca:

    回顾时钟初始化、看起来您正在为1MHz 配置 DCO。  这是你的意图吗? 默认情况下、SMCLK = DCO、因此在您的情况下、SMCLK 为1MHz。 但是、我看到您对 SMCLK 进行了分频、从而使 SMCLK = 125kHz、而不是1MHz。  您能检查一下吗?