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.

[参考译文] MSP430FR6047:UART 代码无法正常工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1529900/msp430fr6047-uart-code-is-not-working

器件型号:MSP430FR6047

工具/软件:

您好团队:

请帮助解决通过 UART 发送数据时的问题、我使用的是 MSP430fr6047 EVM 板、修订版 A 和修订版 B 芯片。

#include

#define UART_TX_PORT_SEL0 P2SEL0
#define UART_TX_PORT_SEL1 P2SEL1
#define UART_TX_PIN   BIT0
#define UART_RX_PIN   BIT1

void UART_init (void);
void uart_send_string (const char *str);

内部 main (void)
  WDTCTL = WDTPW | WDTHOLD;   //停止看门狗计时器
  PM5CTL0 且=~LOCKLPM5;      //启用 GPIO

  //为 UART 配置引脚
  UART_TX_PORT_SEL0 <= UART_TX_PIN | UART_RX_PIN;
  UART_TX_PORT_SEL1 &&~(UART_TX_PIN | UART_RX_PIN);

  uart_init ();

  while (1){
    uart_send_string(“Hello MSP430 UART!\r\n“)
    __delay_cycles (1000000);//~ 1s 延迟@ 1MHz  
  }
}

void UART_init (void)
  UCA0CTLW0 |= UCSWRST;        //保持复位状态
  UCA0CTLW0 || UCSSEL_SMCLK;    // SMCLK
  UCA0BRW = 104           // 1MHz / 9600≈104
  UCA0MCTLW = UCOS16 | UCBRF_2 | 0xD600// 9600 的调制设置
  UCA0CTLW0 &=~UCSWRST;       //初始化 USCI
}

void uart_send_string (const char *str)
  while (*str){
    while(!(UCA0IFG 和 UCTXIFG)); //等待 TX 就绪
    UCA0TXBUF =*str++;
  }
}

谢谢你。

文卡塔拉马纳

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

    你不说你的问题是什么。

    但一目了然、您的比特率设置是错误的。注释显示为 9600、但设置约为 1/16。

    查看指南中典型波特率设置的表 (30-5)。

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

    以 9600 波特率通过 UART 发送数据时要设置的实际值是什么。  

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

    尊敬的 Venkat:

    下面是供您参考的示例:

    https://dev.ti.com/tirex/explore/node?node=A__ALlQ8TQBkgGtFo0cTvhy2Q__msp430ware__IOGqZri__LATEST&placeholder=true 

    您可以参考 UG 来了解如何计算波特率:(该演示也在注释中显示)

    B.R.

    Sal

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

    更具体地说:删除 UCOS16。

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

    让我检查一下并更新。 不过、我在 TI 网站上找到了另一个工作示例:它的工作原理。

    #include

    void uartSendStr (char*);
    内部 main (void)

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗

    //配置 GPIO
    P1SEL0 |= BIT2 | BIT3;// USCI_A1 UART 操作

    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 且=~LOCKLPM5;

    //最大 DCO 设置~8MHz 的启动时钟系统
    CSCTL0_H = CSKEY_H;//解锁 CS 寄存器
    CSCTL1 = DCOFSEL | DCORSEL;//将 DCO 设置为 8MHz
    CSCTL2 = SELA_VLOCLK | SELS__DCOCLK | SELM_DCOCLK;
    CSCTL3 = DIVA__1 | DIVS__1 | DIVM_1;//设置所有分频器
    CSCTL0_H = 0;//锁定 CS 寄存器

    //为 UART 模式配置 USCI_A0
    UCA1CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
    UCA1CTLW0 || UCSSEL_SMCLK;// CLK = SMCLK
    //波特率计算
    // 8000000/(16*9600)=52.083
    //分数部分= 0.083
    //用户指南表 24-4:UCBRSx = 0x04
    // UCBRFx = int ((52.083-52)*16)= 1
    UCA1BRW = 52;// 80000/16/9600
    UCA1MCTLW |= UCOS16 | UCBRF_1 | 0x4900;
    UCA1CTLW0 &=~UCSWRST;//初始化 eUSCI
    // UCA1IE |= UCRXIE;//启用 USCI_A0 RX 中断

    //__bis_SR_register (GIE);//进入 LPM3、启用中断
    uartSendStr(“\r\nramaSita\r\n")“);
    //__bis_SR_register (LPM3_bits + GIE);//进入 LPM3、中断已启用

    //uartSendStr(“ramaSita")“);

    __ no_operation ();//对于调试器



    }

    /*

    无符号字符温度;
    #if Defined (__TI_COMPILER_VERSION__)|| Defined (__IAR_SYSTEM_ICC__)
    pragma vector=EUSCI_A1_vector
    __interrupt void USCI_A1_ISR (void)
    #elif defined (__GNUC__)
    void _attribute__((interrupt (EUSCI_A1_vector)) USCI_A1_ISR (void)
    #else
    错误:不支持编译器!
    #endif

    switch (__even_in_RANGE (UCA1IV、USCI_UART_UCTXCPTIFG))

    case USCI_NONE:中断;
    case USCI_UART_UCRXIFG:
    while(!(UCA1IFG 和 UCTXIFG));
    TEMP = UCA1RXBUF;
    UCA1TXBUF = temp;
    // UCA1TXBUF = temp;
    __ no_operation ();
    休息;
    用例 USCI_UART_UCTXIFG:
    休息;
    用于 USCI_UART_UCSTTIFG:BREAK;
    case USCI_UART_UCTXCPTIFG:break;
    默认值:中断;
    }
    }
    */
    void uartSendStr(字符* s)


    while (* s)

    UCA1TXBUF =*s;
    while(!(UCA1IFG & UCTXIFG));

    s++;

    }

    }