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.

[参考译文] MSP430FR2433:通过 UART (USCIA0)从 MSP430FR2433向 PC 发送数据时出现问题

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/788144/msp430fr2433-problem-with-sending-data-from-msp430fr2433-to-pc-by-uart-uscia0

器件型号:MSP430FR2433
主题中讨论的其他器件:MSP430WARE

大家好、我正在尝试通过 在 UART 模式下运行 uscia0来将数据从微控制器传输到 PC。 我从 msp430ware 中获取了一个示例、并修改为 在按下按钮时向 PC 发送一个字符。 但我无法在我的 PC 上看到任何数据。

PC 端我使用的 Linux 主机具有 PuTTy。 我正在查看端口 ttyACM1 (不确定要检查哪个 ttyACM1和 ttyACM0)。 我将包含以下完整代码。 如果我在实施过程中犯了任何错误、请通知我。

谢谢、

Ravi

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   代码//////////////

#include
#define MCLK_FREQ_MHz 8                    // MCLK = 8MHz
void Software_Trim ();
void Init_GPIO();
volatile unsigned int p=0;

int main (空)

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

 //配置 GPIO
 init_gpio();
 PM5CTL0 &=~LOCKLPM5;                   //禁用 GPIO 上电默认高阻抗模式
                                          //激活1个先前配置的端口设置
 _bis_SR_register (SCG0);                //禁用 FLL
   CSCTL3 |= SELREF_REFOCLK;              //将 REFO 设置为 FLL 基准源
   CSCTL1 = DCOFTRIMEN | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
   CSCTL2 = FLLD_0 + 243;                  // DCODIV = 8MHz
   _DELAY_CYCLES (3);
   _BIC_SR_register (SCG0);                //启用 FLL
   Software_Trim ();                        //软件调整可获得最佳 DCOFTRIM 值



 CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
                                          //默认 DCODIV 为 MCLK 和 SMCLK 源

 //配置 UART 引脚
 P1SEL0 |= BIT4 | BIT5;                   //将2个 UART 引脚设置为第二功能

 //配置 UART
 UCA0CTLW0 |= UCSWRST;
 UCA0CTLW0 |= UCSSEL_SMCLK;

 //波特率计算
 // 800000000 /(16*9600)= 52.083
 //分数部分= 0.083
 //用户指南表14-4:UCBRSx = 0x49
 // UCBRFx = int ((52.083-52)*16)= 1.
 UCA0BR0 = 52;                            // 8000000/16/9600
 UCA0BR1 = 0x00;
 UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;
 UCA0STATW |= 0x0080;
 UCA0CTLW0 &=~UCSWRST;                   //初始化 eUSCI

while (1)

 如果(!(P2IN 和 BIT3))
         {
             if (p=0)
             {
                
              UCA0TXBUF = 1;                    // P1.0切换
          
              __no_operation();

             P=1;
             }
         }
         其他
             P = 0;




空 Init_GPIO()

   P1DIR = 0xFF; P3DIR = 0xFF;
   P1REN = 0xFF; P3REN = 0xFF;
   P1OUT = 0x00; P3OUT = 0x00;
   P2DIR |= BIT3;                         //将 P2.3设置为输入方向
   P2REN |= BIT3;                         // P2.3使能上拉电阻
   P2OUT |= BIT3;                  //配置 P2.3上拉




空 Software_Trim ()

   unsigned int oldDcotTap = 0xFFFF;
   unsigned int newDcoTap = 0xFFFF;
   unsigned int newDcoDelta = 0xFFFF;
   unsigned int bestDcoDelta = 0xFFFF;
   unsigned int csCtl0Copy = 0;
   unsigned int csCtl1Copy = 0;
   无符号 int csCtl0Read = 0;
   无符号 int csCtl1Read = 0;
   unsigned int dcoFreqTrim = 3;
   unsigned char endLoop = 0;

   操作
   {
       CSCTL0 = 0x100;                        // DCO 抽头= 256
       操作
       {
           CSCTL7 &=~DCOFFG;                 //清除 DCO 故障标志
       } while (CSCTL7 & DCOFFG);              //测试 DCO 故障标志

       __DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
                                                          //建议等待24个经过分频的 FLL 参考时钟周期
       while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));

       CSCCtl0Read = CSCTL0;                  //读取 CSCTL0
       CSCCtl1Read = CSCTL1;                  //读取 CSCTL1

       oldDcoTap = newDcoTap;                //记录上次的 DCOTAP 值
       newDcoTap = csCtl0Read & 0x01ff;      //这次获得 DCOTAP 值
       dcoFreqTrim =(csCtl1Read & 0x0070)>>4;//获取 DCOFTRIM 值

       if (newDcoTap < 256)                   // DCOTAP < 256
       {
           newDcoDelta = 256 - newDcoTap;    // DCPTAP 和256之间的增量值
           if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
               endLoop = 1;                  //停止 while 循环
           其他
           {
               dcoFreqTrim --;
               CSCTL1 =(csCtl1Read &(~(DCOFTRIM0+DCOFTRIM1+DCOFTRIM2)))|(dcoFreqTrim <4);
           }
       }
       else                                  // DCOTAP >= 256
       {
           newDcoDelta = newDcoTap - 256;    // DCPTAP 和256之间的增量值
           if (oldDcoTap < 256)               // DCOTAP 交叉256
               endLoop = 1;                  //停止 while 循环
           其他
           {
               dcoFreqTrim++;
               CSCTL1 =(csCtl1Read &(~(DCOFTRIM0+DCOFTRIM1+DCOFTRIM2)))|(dcoFreqTrim <4);
           }
       }

       if (newDcoDelta < bestDcoDelta)        //记录最接近256的 DCOTAP
       {
           csCtl0Copy = csCtl0Read;
           csCtl1Copy = csCtl1Read;
           bestDcoDelta = newDcoDelta;
       }

   }while (endLoop =0);                     //轮询直至 endLoop =1

   CSCTL0 = csCtl0Copy;                      //重新加载锁定的 DCOTAP
   CSCTL1 = csCtl1Copy;                      //重新加载锁定的 DCOFTRIM
   while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到 FLL 被锁定


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

    您可以对 UART TX 引脚上的信号进行示波、以确认 MCU 是否发送了数据。 如果是、则 PC 主机配置可能会出现一些问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ravi:

    我已经听过您几天了,所以我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Wei:

    感谢你的答复。

    我将 Tx 引脚连接到示波器、并注意到数据正在传输。

    但我注意到我的代码中存在问题。 当 UCA0TXBUF = 1时、我将数据分配给 Tx 缓冲器。 但是、当我将其更改为 UCAOTXBUF ="1"时、PuTTy 能够正确显示字符。 现在、我可以将数据发送到 PC。

    我意识到为了解释我要发送的字符、我应该发送它的 ASCII 值。 问题得到解决。

    很抱歉、您之前未能再回复您、再次感谢您的回复。

    此致、

    Ravi