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.

[参考译文] MSP430FR6989:使用外部方波发生器作为时钟

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/984021/msp430fr6989-using-external-square-wave-generator-for-clock

器件型号:MSP430FR6989

您好!  

我想使用8MHz 的外部方波发生器来驱动芯片的高频部分。 连接了 LFXT 的外部晶振。 之前的版本与外部 LFXT 和内部 DCO 一起工作。  

8MHz 信号如下所示:

现在初始化:

  • PJSEL1 &=~(BIT4 + BIT5 + BIT6);
    PJSEL0 |= BIT4 + BIT5 + BIT6;
  • 低频晶体已初始化、以前工作过
  • CSCTL4_bitfield.HFXTOFF_bit = 1;

    CSCTL4_bitfield.HFXTBYPASS 位= 1;// 启用旁路
    CSCTL4_bitfield.HFXTDRIVE_BITS = 0; //低驱动模式
    CSCTL4_bitfield.HFFREQ_bits = 1;     // 4至8MHz
    CSCTL5_bitfield.ENSTFCNT2_BIT = 1;
    SFRIEx_bitfield.OFIE_BIT = 0;
    CSCTL4_bitfield.HFXTOFF_bit = 0;

    操作

       CSCTL5_bitfield.HFXTOFFG_BIT = 0;
       SFRIFGx_bitfield.OFIFG_BIT = 0;   

       if (exitCount >= CLOCKGENERAL HFXT_ERROR_COUNT)
       {
          CSCTL4_bitfield.HFXTOFF_bit = 1;
          返回 clockGeneral_status_error;
        }
        exitCount++;

    } while (SFRIFGx_bitfield.OFIFG_BIT);

  • 设置 CDCTL2_bitfield.SELM = 5;// HFXT
  • 设置 CDCTL2_bitfield.SELS = 5;// HFXT

系统运行、但实际上不正确

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

    您好!

    我怀疑您的问题是由配置时钟设置寄存器而未先解锁引起的。 请参阅 TI Resource Explorer中的 msp430fr69xx_cs_04.c 代码示例、了解这是如何实现的。 此外、您指的是 LFXT、但实际上您正在尝试使用 HFXT。

    此致、

    James

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

    尊敬的 James:

    很抱歉、在 LFXT 初始化完成之前、我只提供了 HFXT 初始化的一个片段。

    我之前解锁了。

    步骤为:

    - CSCTL0.CSKEY_HighByte = 0xA5;//解锁时钟外设

    -配置 LFXT (外部32KHz)

    -配置 HFXT (外部方波发生器8MHz)

    - CSCTL1 = 12;//8MHz

    - CSCTL2.SELM = 5;//MCLK 源 HFXT

    - CSCTL3.DIVM = 0;//MCLK 分频器1

    - CSCTL2.SELS = 5;//SMCLK 源 HFXT

    - CSCTL3.DIVS = 1;// SMCLK 分频器2

    - CSCTL4.SMCLKOFF = 0;//激活 SMCLK

    - CSCTL2.SELA = 0;//时钟源 LFXT

    - CSCTL3.DIVA = 0;//除以1

    - CSCTL0.CSKEY_HighByte = 0;//锁定时钟外设

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

    我做了一个非常简单的设置:(即使这不起作用)

    PJSEL1 &=~(BIT4 + BIT4 + BIT6 + BIT4);
    PJSEL0 |= BIT4 + BIT5 + BIT6 + BIT7;

    PM5CTL0 &=~LOCKLPM5;

    CSCTL0_H = CSKEY >> 8;//解锁 CS 寄存器
    CSCTL2 = SELA_LFXTCLK | SELS__HFXTCLK | SELM_HFXTCLK;//设置所有源
    CSCTL3 = DIVA_1 | DIVM_2 | DIVM_1;// Aclk 分频器1、SMCLK 分频器2 = 4MHz、MCLK 分频器= 1 = 8MHz
    CSCTL4 |= LFXTDRIVE_3 | HFXTBYPASS | HFFREQ_1;//驱动 ACLK 并绕过 SMCLK,因为它是由方形发生器驱动的
    CSCTL4 &=~(LFXTOFF | HFXTOFF | SMCLKOFF);//释放所有时钟
    操作

    CSCTL5 &=~(LFXTOFFG | HFXTOFFG);//清除 XT1和 XT2故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1&OFIFG);//测试振荡器故障标志
    CSCTL0_H = 0;//锁定 CS 寄存器

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

    您好!

    该8MHz 信号看起来相当嘈杂。

    您是否 正在将方波应用到 HFXIN 引脚?  在此模式下、HFXOUT 引脚仅配置为 GPIO。 现在我还将重点介绍 HFXT、并建议在 HFXT 正常工作之前对 ACLK 使用内部 VLO。 然后、您可以添加代码以使用 LFXT。

    您是否看到无法清除的振荡器故障标志?  您还可以尝试输出 SMCLK 或 MCLK 并使用示波器进行捕获。

    此致、

    James

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

    尊敬的 James:

    立即开始工作。 问题是、我交换了 HFXIN 和 HFXOUT 引脚。  

    感谢您建议删除 HFXOUT 引脚的设置。 我删除了它。 我想我在 TI 源代码库的示例代码中看到了它。

    Jus、我现在确实放置了用于此主题初始化的代码。 也许有人可以使用它:

    PJSEL1 &= ~(BIT4 + BIT5 + BIT6);
    PJSEL0 |= BIT4 + BIT5 + BIT6;

    PM5CTL0 &= ~LOCKLPM5;

    CSCTL0_H = CSKEY >> 8; // Unlock CS registers
    CSCTL2 = SELA__LFXTCLK | SELS__HFXTCLK | SELM__HFXTCLK; // set all sources
    CSCTL3 = DIVA__1 | DIVS__2 | DIVM__1; // Aclk divider 1, SMCLK divider 2 = 4MHz, MCLK divider = 1 = 8MHz
    uint16_t temp = CSCTL4;
    temp |= HFXTDRIVE_0 | HFXTBYPASS | HFFREQ_1 | LFXTDRIVE_3;
    CSCTL4 = temp ; //drive ACLK and bypass SMCLK becaus it is driven from square generator
    CSCTL4 &= ~(LFXTOFF | HFXTOFF | SMCLKOFF); // release all clocks
    do
    {
    CSCTL5 &= ~(LFXTOFFG | HFXTOFFG); // Clear XT1 and XT2 fault flag
    SFRIFG1 &= ~OFIFG;
    }while (SFRIFG1&OFIFG); // Test oscillator fault flag
    CSCTL0_H = 0; // Lock CS registers