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.

[参考译文] MSP430FR2353:XIN 上的外部24MHz 振荡器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/957824/msp430fr2353-external-24mhz-oscillator-on-xin

器件型号:MSP430FR2353

尊敬的*:

我们已在 MSP430FR2353的 XIN 引脚上连接24MHz 振荡器。

我无法将 MCLK 设置为24MHz、我观察到引脚 P2.6为 MCLK 输出、并且我将获得1MHz (可能是下降模式)

CS 初始化时是否出现问题?

代码

#include 
#include 

void init_CS();

/**
* main.c
*/
int main (void)
{

volatile uint32_t i;

//停止看门狗计时器
WDT_A_HOLD (WDT_A_base);

//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PMM_unlockLPM5 ();

//初始化外部 XT1CLK = 24MHz
init_CS();

// P2.6上的输出 MCLK
P2DIR |= BIT6; //将 P2.6配置为输出方向引脚

P2SEL0 |= BIT6; //选择 P2.6作为 MCLK 输出
P2SEL1 &=~(BIT6); //选择 P2.6作为 MCLK 输出

//将 P6.1设置为输出方向
GPIO_setAsOutputPin (
GPIO_PORT_P6、
GPIO_PIN1
);

while (1)
{
//切换 P6.1输出
GPIO_toggleOutputOnPin (
GPIO_PORT_P6、
GPIO_PIN1
);

//延迟
for (i=10000;i>0;i--);
}

}

void init_CS()
{
//CSCTL4
//为 ACLK、MCLK、SMCLK 设置 XT1CLK 源
CSCTL4 = SELMS_XT1CLK | SELA_XT1CLK;

/CSCTL5
// SMCLK 开启| SMCLK DIV = 1 | MCLK DIV = 1
CSCTL5 = SMCLKOFF _0 | DIVS_0 | DIVM_0;

/CSCTL6
// EN XT1故障| ACLK = MCLK/768 | HDS | HF 模式| XT1 EXT | 24MHz
CSCTL6 = XT1FAULTFF_0 | DIV_8 | XT1DRIVE_3 | XTS_1 | XT1BYPASSS_1 | XT1HFFREQ_3;

/CSCTL7
//清除 XT1故障标志
CSCTL7 &=~(XT1OFFG);
} 

此致、

David。

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

    您好!  

    我想您在设置 XT1BYPASSLV = 1、XTS = 1和 XT1HFFREQ = 3之前、错过了将 P2.6、P2.7设置为晶体引脚。  

    • P2SEL1 |= BIT6 | BIT7;          // P2.6~P2.7:晶振引脚

    FR2Xx/4x 用户指南(slau445)的第3.2.4节中提到了这一点。  

    谢谢、  

    Lixin  

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

    尊敬的 Lixin:

    我不使用外部晶体、而是使用外部晶体振荡器 ECS-2520MV-240-BN。

    那么、我是否只需要使用以下代码将引脚2.7配置为 XIN?

    P2SEL0 &=~(BIT7);//选择 P2.7作为 XIN
    P2SEL1 |= BIT7;//选择 P2.7作为 XIN

    此致、

    David。

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

    尊敬的 Lixin:

    我添加了以下内容,但没有变化?

    #include 
    #include 
    
    void init_CS();
    
    /**
    * main.c
    */
    int main (void)
    {
    
    volatile uint32_t i;
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    // P2.6上的输出 MCLK
    P2DIR |= BIT6; //将 P2.6配置为输出方向引脚
    
    P2SEL0 |= BIT6; //选择 P2.6作为 MCLK 输出
    P2SEL1 &=~(BIT6); //选择 P2.6作为 MCLK 输出
    
    // P1.0上的输出 SMCLK
    P1DIR |= BIT0; //将 P1.0配置为输出方向引脚
    
    P1SEL0 &=~(BIT0); //选择 P1.0作为 SMCLK 输出
    P1SEL1 |= BIT0; //选择 P1.0作为 SMCLK 输出
    
    // P1.1上的输出 ACLK
    P1DIR |= BIT1; //将 P1.1配置为输出方向引脚
    
    P1SEL0 &=~(BIT1); //选择 P1.1作为 ACLK 输出
    P1SEL1 |= BIT1; //选择 P1.1作为 ACLK 输出
    
    //将 P6.1设置为输出方向
    GPIO_setAsOutputPin (
    GPIO_PORT_P6、
    GPIO_PIN1
    );
    
    //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    PMM_unlockLPM5 ();
    
    //初始化外部 XT1CLK = 24MHz
    init_CS();
    
    while (1)
    {
    //切换 P6.1输出
    GPIO_toggleOutputOnPin (
    GPIO_PORT_P6、
    GPIO_PIN1
    );
    
    //延迟
    for (i=10000;i>0;i--);
    }
    
    }
    
    void init_CS()
    {
    P2SEL0 &=~(BIT7); //选择 P2.7作为 XIN
    P2SEL1 |= BIT7; //选择 P2.7作为 XIN
    
    //CSCTL4
    //为 ACLK、MCLK、SMCLK 设置 XT1CLK 源
    CSCTL4 = SELMS_XT1CLK | SELA_XT1CLK;
    
    /CSCTL5
    // SMCLK 开启| SMCLK DIV = 1 | MCLK DIV = 1
    CSCTL5 = SMCLKOFF _0 | DIVS_0 | DIVM_0;
    
    /CSCTL6
    // EN XT1故障| ACLK = MCLK/768 | HDS | HF 模式| XT1 EXT | 24MHz
    CSCTL6 = XT1FAULTFF_0 | DIV_8 | XT1DRIVE_3 | XTS_1 | XT1BYPASSS_1 | XT1HFFREQ_3 | XT1AUTOOFF_1;
    
    /CSCTL7
    //清除 XT1故障标志
    CSCTL7 &=~(XT1OFFG);
    
    SFRIFG1 &=~(OFIFG);
    
    }
    

    BR

    D.

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

    尊敬的 Lixin:

    当使用外部 HF 振荡器时、我无法在用于 BYPASS XT1模式的 cs.c 驱动程序库中找到函数、因此我将  void CS_BypassXT1 (void)函数重写如下:

    void CS_BypassXT1_HF ()
    {
    //启用 HF/LF 模式
    HWREG16 (CS_BASE + OFS_CSCTL6)|= XTS;
    
    //关闭 XT1振荡器并启用旁路模式
    HWREG16 (CS_BASE + OFS_CSCTL6)|=(XT1BYPASS | XT1AUTOOFF);
    
    while (HWREG8 (CS_BASE + OFS_CSCTL7)&(XT1OFFG)){
    //清除 OSC 故障标志
    HWREG8 (CS_BASE + OFS_CSCTL7)&=~(XT1OFFG);
    
    //清除全局故障标志。 如果 XT1导致全局故障
    //标志要进行设置,这将清除全局错误条件。 如果有的话
    //错误条件仍然存在,全局标志将再次出现。
    HWREG8 (SFR_BASE + OFS_SFRIFG1)&&~OFIFG;
    }
    }
    

    之后、我在我的初始化函数中使用 了代码下方的代码、现在 我获得了正确的时钟。

    但当我使用 ACLK 时、有一点需要注意   

    CS_initClockSignal (CS_ACLK、CS_XT1CLK_select、CS_Clock_divider); 

    然后、我得到24MHz/768 = 31.25kHz

    但当我调用时  

    CS_initClockSignal (CS_ACLK、CS_XT1CLK_select、CS_Clock_divider _1024); 

    那么我不会得到24MHz/1024,但却得到24MHz/768,为什么呢?

    #include 
    #include 
    
    void init_CS();
    void CS_BypassXT1_HF ();
    
    /**
    * main.c
    */
    int main (void)
    {
    
    volatile uint32_t i;
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    init_CS();
    
    // P2.6上的输出 MCLK
    P2DIR |= BIT6; //将 P2.6配置为输出方向引脚
    
    P2SEL0 |= BIT6; //选择 P2.6作为 MCLK 输出
    P2SEL1 &=~(BIT6); //选择 P2.6作为 MCLK 输出
    
    // P1.0上的输出 SMCLK
    P1DIR |= BIT0; //将 P1.0配置为输出方向引脚
    
    P1SEL0 &=~(BIT0); //选择 P1.0作为 SMCLK 输出
    P1SEL1 |= BIT0; //选择 P1.0作为 SMCLK 输出
    
    // P1.1上的输出 ACLK
    P1DIR |= BIT1; //将 P1.1配置为输出方向引脚
    
    P1SEL0 &=~(BIT1); //选择 P1.1作为 ACLK 输出
    P1SEL1 |= BIT1; //选择 P1.1作为 ACLK 输出
    
    //将 P6.1设置为输出方向
    GPIO_setAsOutputPin (
    GPIO_PORT_P6、
    GPIO_PIN1
    );
    
    //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    PMM_unlockLPM5 ();
    
    while (1)
    {
    //切换 P6.1输出
    GPIO_toggleOutputOnPin (
    GPIO_PORT_P6、
    GPIO_PIN1
    );
    
    //延迟
    for (i=10000;i>0;i--);
    }
    
    }
    
    void init_CS()
    {
    P2SEL0 &=~(BIT7); //选择 P2.7作为 XIN
    P2SEL1 |= BIT7; //选择 P2.7作为 XIN
    
    //CSCTL4
    //为 ACLK、MCLK、SMCLK 设置 XT1CLK 源
    //CSCTL4 = SELMS_XT1CLK | SELA_XT1CLK;
    
    /CSCTL5
    // SMCLK 开启| SMCLK DIV = 1 | MCLK DIV = 1
    //CSCTL5 = SMCLKOFF _0 | DIVS_0;
    
    /CSCTL6
    // ACLK = MCLK/768 | XT1高频选择
    //CSCTL6 = DIV_8;
    
    CS_initClockSignal (CS_MCLK、CS_XT1CLK_select、CS_Clock_divider);
    CS_initClockSignal (CS_SMCLK、CS_XT1CLK_select、CS_Clock_divider);
    CS_initClockSignal (CS_ACLK、CS_XT1CLK_select、CS_Clock_divider _1024);
    
    //CS_BypassXT1 ();
    CS_BypassXT1_HF ();
    }
    
    void CS_BypassXT1_HF ()
    {
    //启用 HF/LF 模式
    HWREG16 (CS_BASE + OFS_CSCTL6)|= XTS;
    
    //关闭 XT1振荡器并启用旁路模式
    HWREG16 (CS_BASE + OFS_CSCTL6)|=(XT1BYPASS | XT1AUTOOFF);
    
    while (HWREG8 (CS_BASE + OFS_CSCTL7)&(XT1OFFG)){
    //清除 OSC 故障标志
    HWREG8 (CS_BASE + OFS_CSCTL7)&=~(XT1OFFG);
    
    //清除全局故障标志。 如果 XT1导致全局故障
    //标志要进行设置,这将清除全局错误条件。 如果有的话
    //错误条件仍然存在,全局标志将再次出现。
    HWREG8 (SFR_BASE + OFS_SFRIFG1)&&~OFIFG;
    }
    }
    

    此致、

    David。

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

    很抱歉因为病假而迟到回复。  

    下周我将尝试在实验室中进行板载测试和波形生成、并向您发送结果。  

    谢谢、  

    Lixin  

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

    您好!  

    您能否按照以下nit_CS() 方式尝试 CSCTL6的配置?  

    • CSCTL6 = DIV_8 | XT1DRIVE_3 | XTS_1 | XT1HFFREQ_3;

    我已经过测试、它可以将外部时钟输入到 XT1IN。  

    谢谢、  

    Lixin  

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

    您好!  

    除了上述 CSCTL6设置、还请为 XIN 输入外部时钟24MHz 添加以下2个设置。  

    当使用频率大于8MHz 的 MCLK 时、 FRAM 等待状态应相应地设置。 对于24MHz、waitstate 应设置为2。  

    因此、请在 MCLK 切换到24MHz 之前添加以下设置:

    • FRCTL0 = FRCTLPW | NWAITS_2;

    2.设置 XIN 功能后、在将 XIN 输入时钟切换至 MCLK 之前、XT1OFFG、DCOFFT 和 OFIFG 需要清零。 请在 CSCTL6设置之后添加以下代码:  

    • P2SEL1 |= BIT7;
    • 操作
    •    CSCTL7 &=~(XT1OFFG | DCOFFG);//清除 XT1和 DCO 故障标志
    •    SFRIFG1 &=~OFIFG;
    • } while (SFRIFG1 & OFIFG);//测试振荡器故障标志
    • CSCTL4 = SELMS_XT1CLK;

    谢谢、  

    Lixin