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.

[参考译文] MSP430FR5968:UART (时钟?)

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/980558/msp430fr5968-uart-clock

器件型号:MSP430FR5968

430出现了大量问题(msp430fr5968)。 初始化 micro 和 UART (请参阅下面的初始化代码)。 然后向 TX 缓冲区发送一个字符(UCA1TXBUF = 0x55;)。 初始化后、发送数据线为高电平、但当字符加载到 TX buf 中时、txdata 变为低电平并保持该状态。

 

我被骗了! 就像 UART 的时钟不存在一样。 这可能是两个问题。

 

使用一个计时器中断检查了4、000个时钟的时钟频率(正在运行且频率连接到 HFXT 引脚的4MHz 陶瓷谐振器)(一毫秒中断)、并且中断的时间仅为750us (??)。

 

我不得不做一些非常愚蠢的事情,但我找不到它——因此,任何帮助都将得到极大的感谢!!!

 

Bob Scott

bobscott@jamesport.com

214.673.1439

 

下面初始化–

 

void  init_micro (void)

           

  WDTCTL = WDTPW + WDTHOLD;      //停止 WDT 中断

  PMMCTL0 = 0XA540;//解锁 PMM 寄存器

 

  PM5CTL0 =~LOCKLPM5;//打开 IO 端口配置功能

  UCA1CTLW0 = 0X00E1;            //保持复位至设置

 

  UCA1BRW = 0x0004;        // 57600基于4MHz 时钟

  UCA1MCTLW = 0x5551;            // 57600基于4MHz 时钟

 

       // init 主寄存器首先为 hfxtl 选择端口

  FRCTL0 = 0xA501;针对 FR 存储器的//设置写保护

 

      //初始化 IO 端口

 

  P1SEL0 = 0x03;        // P1.0 & 1是模拟 Vref

  P1SEL1 = 0x03;

  P1DIR = 0x80;  //**++仅用于测试,P1位1是时间测试的输出

 

  P1IES = 0x30;      //启用的初始中断脉冲发生器稍后将启用此功能

  P1OUT = 0x00;          //初始输出状态全部为低电平

 

  P1IFG = 0;//尝试清除 INT 标志

  P1IE = 0x30;

 

      //设置端口2

 

  P2SEL0 = 0x00;        //对于位7、所有引脚都是 I/O 更改、请使用 COMPAIR

  P1SEL1 = 0x60;5和6上的//UART

  P2DIR = 0xBF;          //除 RXD 外的所有输出

  P2IE = 0x00;          //中断被禁用

  P2OUT = 0x6f;          //初始输出状态 LED 关闭(高电平)

 

      //设置端口3

 

  P3SEL0 = 0x00;        //使用 UART 0 (P3-4、5)其他半个 I/O             

  P3SEL1 = 0x0C;  //比较器 C14 - C15

  P3DIR = 0xF3;          //除以外的所有输出

  P3OUT = 0x00;          //初始输出状态全部为低电平(RS485 RX)

 

 

      //设置端口4

 

  P4SEL0 = 0x00;          //所有引脚都是 I/O

  P4SEL1 = 0x00;

  P4DIR = 0xF0;          //下半部分输入、上半部分输出

  P4OUT = 0x00;          //初始输出状态全部为低电平

 

     //设置端口 J

 

  PJSEL0 = 0xCF;        //位4和位5是 IO

  PJSEL1 = 0x00;

  PJDIR = 0x00;          //所有输出(未使用)

  PJOUT = 0x00;          //初始输出状态全部为低电平

  

  //时钟

 

  CSCTL0 = 0xA500;//设置密码以更改时钟寄存器

 

  CSCTL4 = 0xC009;//HF 开启、高驱动、oSCS 关闭

 

  CSCTL2 = 0x0055;//HF 用于所有时钟

 

  CSCTL3 = 0x0000;所有时钟上的//DIV 为1

           

  int m = 0;//等待时钟稳定

  while (m < 1000)

  {

      M++;

  }

 

  CSCTL5 &=~HFXTOFFG;//复位故障

 

      //初始化 UART RS485

 

  UCA1CTLW0 = 0X00E0;       //初始化 USART0状态机(~SWRST)释放复位

  UCA1IE = UCRXIE;                //启用 USART RX 中断(仅 Rx)

 

      

                       //初始化计时器

      

           TA0CTL  = 0x0212;              //0x01D6;    // SMCLK、向上计数到 TACCR0 (CCR0)、清除计时器、启用中断

           TA0CCTL0 = 0x0010;//启用比较 int

           TA0CCR0 = 0x0F9E;                                   // 1msec 中断

           TA0CCTL1 = 0;

           TA0CCTL2 = 0;

           TA0R = 0x0001;//开始计时器

 

 

           //++设置比较器

           CECTL0 = 0x008F;//+输入通道15和-输入 VREF

           CECTL1 = 0x050c;//++ comp 打开、正常模式、输出滤波、下降沿内部

           CECTL2 = 0x20D0;//++ vfref 至- term、1.2v ref、ref 共享

           CEINT = 0x0100;// int 打开

 

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

    尊敬的 Bob:

    我快速浏览并注意到您为端口2引脚5、6选择了错误的 PSEL 位。

    根据以上代码:

    //设置端口2
       P2SEL0 = 0x00;        //对于位7、所有引脚都是 I/O 更改、请使用 COMPAIR
       P1SEL1 = 0x60;         5/UART ON 5和6 <--- 应为 P2SEL1

    如果这无法完全解决您的问题、请查看 适用于 FR5968的 TI 资源浏览器中的此示例(出于方便起见、请复制此处)。  此代码回显字符、但显示时钟和 UART 配置。

    #include "msp430.h"

    int main (空)

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

     //配置 GPIO
     P2SEL1 |= BIT0 | BIT1;                   // USCI_A0 UART 操作
     P2SEL0 &=~(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;                     //将 eUSCI 置于复位状态
     UCA0CTLW0 |= UCSSEL_SMCLK;              // CLK = SMCLK
     //波特率计算
     // 800000000 /(16*9600)= 52.083
     //分数部分= 0.083
     //用户指南表21-4:UCBRSx = 0x04
     // UCBRFx = int ((52.083-52)*16)= 1.
     UCA0BR0 = 52;                            // 8000000/16/9600
     UCA0BR1 = 0x00;
     UCA0MCTLW |= UCOS16 | UCBRF_1;
     UCA0CTLW0 &=~UCSWRST;                   //初始化 eUSCI
     UCA0IE |= UCRXIE;                        //启用 USCI_A0 RX 中断

     _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;
         __no_operation();
         中断;
       案例 USCI_UART_UCTXIFG:中断;
       案例 USCI_UART_UCSTTIFG:中断;
       案例 USCI_UART_UCTXCPTIFG:中断;
     }

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

    它一定是愚蠢的。  为什么我看不到它------ 错别字、我不知道。  非常感谢。

    您正是第二件事。  它无法解决时钟问题。  显然、我不是在某种程度上指向 HFXT 振荡器。  如果有人有任何想法,我会欢迎他们!!!

    再次感谢您提供的证明!!!

    此致

    Bob Scott

    bobscott@jamesport.com

    214.673.1439

    我将关闭这个、并单独询问时钟问题。

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

    尊敬的 Bob:

    很高兴听到您正在正常运行。

    另外一个配置 HFXT 的代码示例可能很有用。