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.

[参考译文] MSP430FR5969:CAN#39;t 获取 LFXT 或 HFXT 以在 EXP 板上稳定。

Guru**** 2536780 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1001868/msp430fr5969-can-t-get-lfxt-or-hfxt-to-stabilize-on-exp-board

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


/*edit:未来的线程读取器,导致此问题的实际原因是我缺少这行代码
 * PJSEL0 |= BIT4 | BIT5 | BIT6 | BIT7;     //用于 XT1和 XT2
 *用于设置 GPIO 引脚振荡器作为晶体输入打开、而不仅仅是 GPIO。 当端口到达名为 ports 的字母时,我就停止了对端口的读取。

*

因此、我使用的是最新的 CCS、我使用的是独立的 MSP430FET 编程器、而不是内置在开发板中的编程器、并且我在 Y1中添加了自己的12MHz 振荡器。 我从 msp430ware 驱动程序中构建了时钟初始化程序、特别是 CS.c 当我运行下面的代码时、我总是会在两个晶振上都超时。

uint8_t init_crystals (){
   //此函数初始化 X2上的高频晶振和 X1上的低频晶振
   //此外,它可以适当地设置和提供每个系统时钟源。 (请参阅其他文档、了解其中包含的内容)
   //最后,此函数返回一个状态向量,指示是否发生了任何错误



   uint8_t crystal_errors = 0;
   ///---------------- LF 频率、HF 频率
   cs_setExternalClockSource (32768、12000000);//这告诉将来函数低频和高频是什么频率

   if (CS_TurnOnHFXTWithTimeout (CS_HFXT_DRIVE_8MHZ_16MHz、0xFFF)){
       //"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此、如果晶体上的过程正常工作、则会发生这种情况
       if (CS_TurnOnLFXTWithTimeout (CS_LFXT_DRIVE_3、0xFFF)){
           //"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此、如果晶体上的过程正常工作、则会发生这种情况

           //在这种状态下,两个晶振都已成功激活,现在是时候设置时钟源了。
           FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1);   //effective Frequency = Nominal * 1/(1+cycles)、因此我们在这里仅使用一个。
           CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_Clock_divider _1);//Errata 注释:切勿单步将 SMCLK 升高到 MCLK 以上、它们必须在某个点同步
           CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_clock_divider);//出于我猜测的原因将这个小数设置为1.5MHz。
           CS_initClockSignal (CS_ACLK、CS_LFXTCLK_select、CS_Clock_divider);

       }否则{
           //"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此这会导致晶体无法初始化

           //在此状态下,12MHz 晶体已成功激活,但32.768KHz 没有激活。
           //我们应首先将所有内容放在工作晶体上

           //then we need to set the DCO to Emulate the 32.768KHz,but then do does do does do does do it do does do it do LF Modclock?

           //并使用它来获取相关的时钟
           FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1);   //effective Frequency = Nominal * 1/(1+cycles)、因此我们在这里仅使用一个。            CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_Clock_divider _1);//Errata 注释:切勿单步将 SMCLK 升高到 MCLK 以上、它们必须在某个点同步
           CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_clock_divider);//出于我猜测的原因将这个小数设置为1.5MHz。
           CS_initClockSignal (CS_ACLK、CS_LFMODOSC_select、CS_clock_divider);
           crystal_errors |= 0x0A;

       }


   }否则{
       //"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此这会导致晶体无法初始化
       crystal_errors |= 0x50;
       if (CS_TurnOnLFXTWithTimeout (CS_LFXT_DRIVE_3、0xFFF)){
           //"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此、如果晶体上的过程正常工作、则会发生这种情况

           //在此状态下,32.768 KHz 晶振已成功激活,但12MHz 没有激活
           //此器件缺少 FLL,因此我们无法使用32kHz 来改进内部振荡器
           //so、我们首先需要将 DCO 设置为12MHz、然后设置时钟源
           //为此、我们首先将 DCO 设置为24MHz、然后在进入 MCLK 时进行半分

           //---- 高频模式、最大频率
           CS_setDCOFreq (CS_DCORSEL_1、CS_DCOFSEL_6);
           FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1);   //effective Frequency = Nominal * 1/(1+cycles)、因此我们在这里仅使用一个。
           CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_clock_divider _2);//Errata 注释:切勿单步将 SMCLK 升高到 MCLK 以上、它们必须在某个点同步
           CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_clock_divider _16);//出于我猜测的原因将这个小数设置为1.5MHz。
           CS_initClockSignal (CS_ACLK、CS_LFXTCLK_select、CS_Clock_divider);


       }否则{
           //"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此这会导致晶体无法初始化
           //在这种状态下,两个时钟都失败。 这非常糟糕、但我们会尽力而为。

           //so、我们首先需要将 DCO 设置为12MHz、然后设置时钟源
           //为此、我们首先将 DCO 设置为24MHz、然后在进入 MCLK 时进行半分

           //---- 高频模式、最大频率
           CS_setDCOFreq (CS_DCORSEL_1、CS_DCOFSEL_6);
           FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1);   //effective Frequency = Nominal * 1/(1+cycles)、因此我们在这里仅使用一个。
           CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_clock_divider _2);//Errata 注释:切勿单步将 SMCLK 升高到 MCLK 以上、它们必须在某个点同步
           CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_clock_divider _16);//出于我猜测的原因将这个小数设置为1.5MHz。
           CS_initClockSignal (CS_ACLK、CS_LFMODOSC_select、CS_clock_divider);
           crystal_errors |= 0x0A;
       }

   }
   返回 crystal_errors;

我还尝试在没有这些计时器的情况下运行、并查看它是否会在以下代码中稳定下来、也没有效果。

void crystal_hard_loop (uint8_t crystal_errors){

   if (crystal_errors & 0x0A){
       CS_TurnOnLFXT (CS_LFXT_DRIVE_3);
       crystal_errors &=~0x0A;
   }
   if (crystal_errors & 0x50){
       CS_TurnOnHFXT (CS_HFXT_DRIVE_8MHZ_16MHz);
       crystal_errors &=~0x50;
   }

在我的主循环中、它按如下方式运行

int main (空)

   WDTCTL = WDTPW | WDTHOLD;   //停止看门狗计时器
   PM5CTL0 &=~LOCKLPM5;                  //禁用 GPIO 上电默认高阻抗模式


   //启用中断
   _enable_interrupt ();
   //初始化全局变量
   uint8_t crystal_errors;

   crystal_errors = init_crystels();


   __no_operation();







   //crystal_hard_loop (crystal_errors);

   while (crystal_errors== 0x50);

   while (crystal_errors== 0x0A);

   while (crystal_errors== 0x5A);

   while (crystal_errors=0);

   while (1);

   
   返回0;

我有一点损失、因为我主要只在 TI 设计的电路板上使用 TI 提供的时钟系统代码。 尝试确保我现在在该开发板上获得了此信息、因此当我在其他板上使用此芯片时、我可以正确诊断它是否是硬件问题。