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.

[参考译文] MSP430FR5994:LaunchPad UART 无法正常工作

Guru**** 2562120 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/602999/msp430fr5994-launch-pad-uart-does-not-work-correctly

器件型号:MSP430FR5994

尊敬的 Sirs:

   无法使用此 LaunchPad 使 UART 运行。  我已经尝试过该帖子中的两个简单程序。

 

 

   以下是 MSP430FR5994 LaunchPad 的 UART 回显程序的代码:

此版本 A 使用 P2和 UCA0 UART。  它将正确接收字符并生成接收中断。  但它不会传输任何内容 (范围为): 使用 LaunchPad UART 进行测试。

#include

 

/*

 * main.c

 *

int main (void){

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

      

   //配置 GPIO

   P2SEL0 |= BIT0 | BIT1;                   // USCI_A0 UART 操作

   P2SEL1 &=~(BIT0 | BIT1);

 

   //禁用 GPIO 上电默认高阻抗模式以激活

   //先前配置的端口设置

   PM5CTL0 &=~LOCKLPM5;

 

   //最大 DCO 设置~8MHz 的启动时钟系统

   CSCTL0_H = CSKEY >> 8;                   //解锁时钟寄存器

   CSCTL1 = DCOFSEL_3 | DCORSEL;            //将 DCO 设置为8MHz

   CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;

   CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;    //设置所有分频器

   CSCTL0_H = 0;                            //锁定 CS 寄存器

 

   //将 USCI_A0配置为 UART 模式

   UCA0CTLW0 = UCSWRST;

   UCA0CTLW0 |= UCSSEL_SMCLK;              // CLK = SMCLK

   //波特率计算

   // 800000000 /(16*9600)= 52.083

   //分数部分= 0.083

     // UCBRFx = int ((52.083-52)*16)= 1.

   UCA0BR0 = 52;                            // 8000000/16/9600

   UCA0BR1 = 0x00;

   UCA0MCTLW |= UCOS16 | UCBRF_1 | 0x4900;

   UCA0CTLW0 &=~UCSWRST;                   //初始化 eUSCI

   UCA0IE |= UCRXIE;                        //启用 USCI_A0 RX 中断

  UCA3TXBUF = 0x41;                       //测试发送'A'                这没什么!

   _bis_SR_register (LPM3_bits | GIE);      //输入 LPM3、中断被启用

   __no_operation();                        //用于调试器

 }

 

 #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

 #pragma vector=USCI_A0_Vector

 _interrupt void USCI_A0_ISR (void)

 #Elif defined (_GNU_)

 void __attribute__((中断(USCI_A0_Vector)) USCI_A0_ISR (void)

 其他

 错误编译器不受支持!

 #endif

 {

   switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))

   {

     USCI_NONE 案例:中断;

     USCI_UART_UCRXIFG 案例:

       while (!(UCA0IFG&UCTXIFG));

       UCA0TXBUF = UCA0RXBUF;       //程序在接收到的字符上到达此处,但 TX 引脚没有输出任何内容

       __no_operation();

       中断;

     案例 USCI_UART_UCTXIFG:中断;

     案例 USCI_UART_UCSTTIFG:中断;

     案例 USCI_UART_UCTXCPTIFG:中断;

   }

 

 

--------------------------------------------------------------------

 

 

该版本 B 版本 使用 P6和 UCA3。  它可以发送出 P6.0、但不能在 P6.1上接收。  也不会产生中断:

 

#include

 

 

Int TempStat;

 

/

 * main.c

 *

 (小部分 /

int main (void){

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

      

   //配置 GPIO

   P6SEL0 |= BIT0 | BIT1;                   // USCI_A0 UART 操作

   P6SEL1 &=~(BIT0 | BIT1);

 

   //禁用 GPIO 上电默认高阻抗模式以激活

   //先前配置的端口设置

   PM5CTL0 &=~LOCKLPM5;

 

   //最大 DCO 设置~8MHz 的启动时钟系统

   CSCTL0_H = CSKEY >> 8;                   //解锁时钟寄存器

   CSCTL1 = DCOFSEL_3 | DCORSEL;            //将 DCO 设置为8MHz

   CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;

   CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;    //设置所有分频器

   CSCTL0_H = 0;                            //锁定 CS 寄存器

 

   //为 UART 模式配置 USCI_A0 (int 标志30.3.15.4):

   UCA3CTLW0 = UCSWRST;                       //软 rst 使能

   UCA3CTLW0 |= UCSSEL_SMCLK;              // CLK = SMCLK

   //波特率计算

   // 800000000 /(16*9600)= 52.083

   //分数部分= 0.083

     // UCBRFx = int ((52.083-52)*16)= 1.

   UCA3BR0 = 52;                            // 8000000/16/9600

   UCA3BR1 = 0x00;

   UCA3MCTLW |= UCOS16 | UCBRF_1 | 0x4900;

   UCA3CTLW0 &=~UCSWRST;                   //初始化 eUSCI

   UCA3IE |= UCRXIE;                        //启用 USCI_A0 RX 中断(int 标志寄存器30.4.10)

 

   TempStat=UCA3CTLW0;                   //read ctl word 0

 

   TempStat=UCA3IFG;                         //读取 int 标志

   UCA3TXBUF = 0x41;                       //测试发送'A'

 

   _bis_SR_register (LPM3_bits | GIE);      //输入 LPM3、中断被启用

   __no_operation();                        //用于调试器

 }

 

 #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

 #pragma vector=USCI_A0_Vector

 _interrupt void USCI_A0_ISR (void)

 #Elif defined (_GNU_)

 void __attribute__((中断(USCI_A0_Vector)) USCI_A0_ISR (void)

 其他

 错误编译器不受支持!

 #endif

 {

   switch (__evo_in_range (UCA3IV、USCI_UART_UCTXCPTIFG))

   {

     USCI_NONE 案例中断

     案例 USCI_UART_UCRXIFG:                      //2

       TempStat=UCA3IFG;                         //读取 int 标志

       while (!(UCA3IFG &~UCTXIFG));                 //30.4.11

       UCA3TXBUF = UCA3RXBUF;                     //echo

       TempStat= UCA3TXBUF;                       //查看其中的内容

       __no_operation()

       中断;

     USCI_UART_UCTXIFG 案例

         TempStat=UCA3IFG;                         //读取 int 标志

         UCA3TXBUF = 0x42;                       //测试发送'b'

         中断;

 

     案例 USCI_UART_UCSTTIFG:中断

     案例 USCI_UART_UCTXCPTIFG:中断

   }

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >P2SEL0 |= BIT0 | BIT1; // USCI_A0 UART 操作
    >P2SEL1 &=~(BIT0 | BIT1);

    根据 SLASE54B 表6-23、您需要 P2SEL0位为0、P2SEL1位为1。 这个设置将引脚交给 TB0。 这与 UCA3/P6SELx 设置相反(表6-32)。

    即将推出:
    > while (!(UCA3IFG &~UCTXIFG)); //30.4.11
    这可能会永远旋转。 您可能想要的
    > while (!(UCA3IFG & UCTXIFG)); //30.4.11

    > UCA3TXBUF = 0x41; //测试发送'A' 这没什么!
    这使用了错误的 UART。 您可能想要的
    > UCA0TXBUF = 0x41; //测试发送'A' 这没什么!

    MSP43FR5994页面上应提供示例代码(包括 UART)(最有可能提供"工具和软件"选项卡)。 也可以使用其 Resource Explorer (或某些此类工具)将此代码直接下载到 CCS 中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、Bruce McKenney47378、您是一名救生员!

      很显然、我不理解选择、但你让我开始了。

    最终使用的代码为:

    /
    * main.c 使用 P2
    *
    (小部分 /
    int main (void){
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

    //配置 GPIO
    P2SEL0 &=~(BIT0 | BIT1);
    P2SEL1 |= BIT0 | BIT1;// USCI_A0 UART 操作

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

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

    //将 USCI_A0配置为 UART 模式
    UCA0CTLW0 = UCSWRST;
    UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
    //波特率计算
    // 800000000 /(16*9600)= 52.083
    //分数部分= 0.083
    // UCBRFx = int ((52.083-52)*16)= 1.
    UCA0BR0 = 52;// 8000000/16/9600
    UCA0BR1 = 0x00;
    UCA0MCTLW |= UCOS16 | UCBRF_1 | 0x4900;
    UCA0CTLW0 &=~UCSWRST;//初始化 eUSCI
    UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断

    UCA0TXBUF = 0x41;//测试发送'A'

    _bis_SR_register (LPM3_bits | GIE);//输入 LPM3、中断被启用
    __no_operation();//用于调试器

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=USCI_A0_Vector
    _interrupt void USCI_A0_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(USCI_A0_Vector)) USCI_A0_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))

    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    while (!(UCA0IFG & UCTXIFG));
    UCA0TXBUF = UCA0RXBUF;//echo
    __no_operation();
    中断;
    案例 USCI_UART_UCTXIFG:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;

    John

       

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

    请参阅上一条消息。