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.

[参考译文] MSP430F5438A:程序开始时超出程序代码范围。 由于振荡器问题,可能存在故障

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1085449/msp430f5438a-program-going-outside-of-program-code-at-the-start-suspect-due-to-oscillator-issue

部件号:MSP430F5438A
“线程:测试”中讨论的其它部件

我的项目有时会在我的项目开始时退出程序代码。

经过多次测试,它似乎与振荡器有关。

void OSC_Init(void)
{
    P5SEL |= BIT2 + BIT3;                     // P5.2,3 = XT2IN and XT2OUT
    UCSCTL6 &= ~XT2OFF;
    UCSCTL3 |= SELREF__REFOCLK;
    UCSCTL4 |= SELA__REFOCLK;

//    __bis_SR_register(SCG0);                  // Disable the FLL control loop
//    UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
//    UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation
//    UCSCTL2 = FLLD_1 + 390;                   // Set DCO Multiplier for 8MHz
//                                              // (N + 1) * FLLRef = Fdco
//                                              // (390 + 1) * 32768 = 12.8MHz
//                                              // Set FLL Div = fDCOCLK/2
//    __bic_SR_register(SCG0);                  // Enable the FLL control loop
//    __delay_cycles(400000);

    // Loop until XT1,XT2 & DCO stabilizes
    do
    {
      UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
                                              // Clear XT2,XT1,DCO fault flags
      SFRIFG1 &= ~OFIFG;                      // Clear fault flags
    }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

//    UCSCTL6 &= XT2DRIVE1;                    // Decrease XT2 Drive according to
                                              // expected frequency
    UCSCTL4 |= SELS__XT2CLK + SELM__XT2CLK;               // SMCLK=MCLK=XT2
    UCS_setExternalClockSource(XT1_CLK, XT2_CLK);
}


这是发生错误时我的原始代码。
我正在尝试使用 XT2外置晶体生成12.8MHz 时钟。


我尝试检查示波器上的 SMCLK,这是程序运行正常时捕获的内容


但是,当错误发生且程序已超出程序顺序时,SMCLK 就会捕获这种情况。

我从  MSP430x5xx 和 MSP430x6xx 系列用户指南中了解到,当我将 UCSCTL4设置为选择 XT2作为 SMCLK 时,它将在 XT2可用时选择它,否则将选择 DCOCLKDIV。

我怀疑 DCOCLK 是在发生错误时被使用的,因为偶尔,当错误发生时,我可以在示波器上看到1MHz 的波形。
因此,我尝试添加逻辑来配置 DCOCLK 频率,如上载代码的注释部分所示。
我添加了这一逻辑后,错误似乎消失了。 (我尝试重置程序100次以上,但没有发生。 通常在20次内发生)

我也尝试了没有 DCOCLK 配置的情况,但将__delay_cycles (400000)留在代码中,错误似乎也消失了。 这让我感到奇怪的是,在 XT2稳定使用之前清除 XT2OFF 后是否需要一定的延迟? 如果没有 DELAY_CYCLES,当我尝试选择 XT2作为 SMCLK 源时,XT2有时不可用,这是什么原因? 我想在这里的论坛上核实我的怀疑。

如果确实需要延迟,我应该实际延迟多长时间? 我在测试期间只使用了40000个周期 ,因为这是我在配置 DCOCLK 时使用的周期数,我只是重复使用了该代码行。 但是,清除 XT2OFF 后所需的周期数的正确估计值是多少(如果需要)?

此外,我认为在代码中的 DO while 循环后,XT2应该是稳定的? 这是从 msp430x54xA_UCS_8示例代码中获取的。 因此,我也想澄清我在这个岗位上的疑虑

谢谢

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

    您是否尝试过另一种 MSP430?

    通常,在代码运行通过 while 循环后,DCO 应该被锁定。

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

    您好,Eason,

    我刚刚尝试过另一种 MSP430,似乎无法重现该错误。

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

    可能是与设备相关的。 我建议您在更多设备上尝试此操作。 如果您有一个较大的 PPM,我想,那么我们需要看看您的晶体部件的 PCB 布局。