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.

[参考译文] MSP432P401R:外部晶体未以正确的频率驱动 MCU

Guru**** 2604225 points
Other Parts Discussed in Thread: MSP-FET

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/652408/msp432p401r-external-crystal-is-not-driving-mcu-at-correct-frequency

器件型号:MSP432P401R
主题中讨论的其他器件: MSP-FET

您好!  

我有一个带有 MSP432P401R 和 MSP432 Launchpad 的定制 PCB。 我正在尝试使用48MHz 外部晶体来驱动我的定制设计。 我在 CSS 中创建了两个空白项目、一个用于 Launchpad、另一个用于定制板。 我已经使用 TI 的示例代码将 Launchpad 从使用 DCO 切换到使用48MHz 晶体。 当我将使用48MHz 晶体驱动 MCU 的示例代码复制/粘贴到定制板的项目中、编译、下载到器件、并查看 MCLK 的输出引脚时、频率为16MHz 而不是48MHz。 我只复制/粘贴.c 示例、而不是整个示例项目、因此基于创建示例的 CSS 版本、startup_*.c 代码可能会有一些细微的差异?

Launchpad 具有 MSP432P401R 版本 C、而我的定制板具有 MSP432P401R 版本 D

我已经检查了晶振的器件型号、以确保它是48MHz。 由于我要复制/粘贴代码、因此没有软件差异。 这两种配置之间的唯一区别是调试器(Launchpad 上的 XDS 与 MSP-FET 中的 MSP430)和晶体的实际器件型号、但两者均为48MHz。

我的定制板上的晶体是 Abraacon ABLS-48.000MHZ-B2-T、具有22pF 接地电容、连接在引脚 PJ.2和 PJ.3之间。

我还使用了调试器来检查 CS 时钟分频器的寄存器值、并且所有分频器都设置为零、因此在提供 MCLK 之前不应对 HFXTCLK 进行分频。  

不确定接下来要看的是什么。

感谢您的任何帮助!

下面是我一直使用的示例代码:

include "ti/devices/msp432p4xx/inc/msp.h"
#include "stdint.h"

void error (void);

int main (void)
{
volatile uint32_t i;
uint32_t currentPowerState;

WDT_A->CTL = WDT_A_CTL_PW | //停止 WDT
WDT_A_CTL_HOLD;

P1->DIR |= BIT0;

/*注意:此示例假设默认电源状态为 AM0_LDO。
*有关更完整的 PCM 操作、请参阅 msp432p401x_PCM_0x 代码示例
*在工作模式之间进行各种电源状态转换。
*

/*步骤1:转换到 VCORE 电平1:AM0_LDO --> AM1_LDO */

/*获取当前电源状态,如果它不是 AM0_LDO,则错误输出*/
currentPowerState = PCM->CTL0 & PCM_CTL0_CPM_MASK;
if (currentPowerState!= PCM_CTL0_CPM_0)
error();

while (((PCM->CTL1 & PCM_CTL1_PMR_BUSY));
PCM->CTL0 = PCM_CTL0_KEY_VAL | PCM_CTL0_AMR_1;
while (((PCM->CTL1 & PCM_CTL1_PMR_BUSY));
IF (PCM->IFG & PCM_IFG_AM_INVALID_TR_IFG)
error(); //转换失败时出错
if (((PCM->CTL0 & PCM_CTL0_CPM_MASK)!= PCM_CTL0_CPM_1)
error(); //器件不处于 AM1_LDO 模式时出错

/*步骤2:将闪存等待状态配置为1 (对于组0和组1)*/
FLCTL->BANK0_RDCTL =(FLCTL->BANK0_RDCTL 和~(FLCTL_BANK0_RDCTL_WAIT_MASK))|
FLCTL_BANK0_RDCTL_WAIT_1;
FLCTL->BANK1_RDCTL =(FLCTL->BANK0_RDCTL 和~(FLCTL_BANK1_RDCTL_WAIT_MASK))|
FLCTL_BANK1_RDCTL_WAIT_1;

/*步骤3:将 HFXT 配置为使用48MHz 晶体,源至 MCLK 和 HSMCLK*/


PJ->SEL0 |= BIT2 | BIT3; //为 HFXT 函数配置 PJ.2/3
PJ->SEL1 &=~(BIT2 | BIT3);

CS->KEY = CS_KEY_VAL; //解锁 CS 模块以进行寄存器访问
CS->CTL2 |= CS_CTL2_HFXT_EN | CS_CTL2_HFXTFREQ_6 | CS_CTL2_HFXTDRIVE;
while (CS->IFG 和 CS_IFG_HFXTIFG)
CS->CLRIFG |= CS_CLRIFG_CLR_HFXTIFG;

/*选择 MCLK & HSMCLK = HFXT、无分频器*/
CS->CTL1 = CS->CTL1和 μ~(CS_CTL1_SELM_MASK | CS_CTL1_DIVM_MASK | CS_CTL1_SELS_MASK | CS_CTL1_DIVHS_MASK)|
CS_CTL1_SELM_HFXTCLK | CS_CTL1_SELESS_HFXTCLK;

CS->KEY = 0; //锁定 CS 模块,防止意外访问

/*步骤4:将 MCLK 输出到端口引脚以演示48MHz 运行*/
P4->DIR |= BIT3 | BIT4;
P4->SEL0 |=BIT3 | BIT4; //输出 MCLK
P4->SEL1 &=~(BIT3 | BIT4);

while (1) //连续循环
{
P1->OUT ^= BIT0; //闪烁 P1.0 LED
对于(i = 200000;i > 0;i---); //延迟
}
}

void 错误(void)
{
volatile uint32_t i;

while (1)
{
P1->OUT ^= BIT0;
对于(i = 20000;i>0;i--); //一直闪烁 LED
}
}

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

    感谢您为这个问题制作新主题! 如果您在 launchpad 上工作、而不是在您的定制板上工作、那么我认为这与硬件或布局有关、而不是与代码本身有关。 Rev C 和 Rev D 之间的版本差异不应影响这一点、因此我认为我们现在可以排除这种情况。

    您是否有机会在定制电路板上发送晶体的原理图和布局快照?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    硬件布局的一些建议也适用于此:

    确保 HFTX 线路不靠近任何其他高频信号。 如果可能、请确保在晶体振荡器和线路下方有一个接地层。 请勿通过过孔发送 HFXT 线路。 确保考虑线路的负载电容。

    此外、我注意到晶体的负载电容可能为18pF? 您可以确认这一点吗?

    如果您的负载电容为18pf、您能否尝试使用30pF 电容器将 C1和 C2接地?

    我根据以下公式计算了这一点:

    这可在 E4系统设计指南手册中找到、但更常见的情况适用于任何晶体布局。  

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

    您好 Evan!

    我同意这可能不是代码。 该板相当简单:4层(2层信号、电源和 GND)。

    上面是振荡器原理图和布局的屏幕截图。 如果您感兴趣的内容未包含在其中、请告诉我。

    谢谢!

    James

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

    请告诉我您对在您的正上方的帖子中尝试的看法。 我想知道您是否为接地电容器计算了自己的 C1和 C2值、或者您是否刚刚使用了我们在 LaunchPad 上提供的标准22pF 电容器。 这些电容器取决于晶体的负载电容、这可能需要进行一些调整。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我使用的是22pF 负载电容器、而不是18pF、因此将针对修订版2进行更改、但很难相信负载电容的变化会导致振荡器频率精确除以4。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    22pF 负载电容器是从另一个使用相同振荡器但使用不同的微处理器的设计中拉出的、但它们可能会遇到类似的问题、不得不对电容器进行一些调优、但这些更改并未将其纳入原理图中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    James、

    也许我应该更清楚、抱歉、但我认为您的 C24和 C25需要为30pF。 我同意这会造成4分之1是奇怪的,但这是我的第一个行动方针。 我在上面提到的等式是 C24和 C25的计算(由于它们在等式中、因此只是简单地对 C1和 C2进行了弯曲)。 这一切都基于您的晶体本身的18pF 负载电容、我在查看它的数据表后了解到这一点。 我想知道您的其他团队是否需要进一步调整上限。 请告诉我!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有27pF 和33pF 电容、因此我使用了27pF、MCLK 引脚上的频率仍然为16MHz。 接下来、我将更换晶体。 Abraacon 可能将16MHz 晶体置于48MHz 封装中...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    James、

    这很奇怪。 我一定会联系 Abraacon 并提出问题。 如果您尝试更换晶振、您可能会看到 KX-7T 48MHz 12pF。 我们在 LaunchPad 上使用它。 最好查看这是否解决了问题。
    www.geyer-electronic.de/.../GEYER-KX-7.pdf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在、我必须坚持使用相同的封装、但我肯定会查看 KX-7T 的未来发展。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    听起来不错、如果您有任何更新或希望我进一步了解某些内容、请告诉我。 谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Evan、

    我想我偶然发现了这个问题。 我选择的晶体是第三个泛音晶体、它可能考虑了我看到的要获得16MHz 的3分频。 我正在阅读 Abraacon 应用手册以了解更多相关信息。

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

    James、

    感谢您的告知。 我们应该将这个线程关闭、还是需要研究其他方面?

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

    已关闭。 我只是想确保我在 MSP 方面的一切都要考虑、以确保我不会犯愚蠢的错误。 事实证明、这只是一个糟糕的器件选择。

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    明白了! 愉快的假期、如有任何其他问题、欢迎随时再次入住! 我很高兴帮助确保它不会成为我们结尾的错误!