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.

[参考译文] MSP430FR2155:在 XT1上使用外部5MHz 振荡器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1452269/msp430fr2155-using-external-5mhz-oscillator-on-xt1

器件型号:MSP430FR2155
主题中讨论的其他器件:MSP430FR2355LP-MSPM0G3507

工具与软件:

我当前用于测试振荡器设置的代码如下:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(void) {
WDT_A_hold(WDT_A_BASE);
//Configure MCLOCK OUtput Pin
GPIO_setAsPeripheralModuleFunctionOutputPin(
GPIO_PORT_P3,
GPIO_PIN0,
GPIO_PRIMARY_MODULE_FUNCTION
);
//Configure XIN and XOUT pins
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_P2,
GPIO_PIN7,
GPIO_SECONDARY_MODULE_FUNCTION
);
//Turn on bypass mode
CS_bypassXT1();
//source MCLOCK from XT1
CS_initClockSignal(CS_MCLK,CS_XT1CLK_SELECT,CS_CLOCK_DIVIDER_1);
//Clear flags after starting oscillator
CS_clearAllOscFlagsWithTimeout(1000);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

运行时、此代码无法尝试调用 CS_bypassXT1()。 它停留在 cs.c 中的以下 while 语句上:

Fullscreen
1
2
3
4
5
6
7
8
9
while (HWREG8(CS_BASE + OFS_CSCTL7) & (XT1OFFG)) {
//Clear OSC fault flags
HWREG8(CS_BASE + OFS_CSCTL7) &= ~(XT1OFFG);
// Clear the global fault flag. In case the XT1 caused the global fault
// flag to get set this will clear the global error condition. If any
// error condition persists, global flag will get again.
HWREG8(SFR_BASE + OFS_SFRIFG1) &= ~OFIFG;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

如有任何帮助、将不胜感激

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

    您是否尝试过寄存器级代码? 或者您能否在此处共享整个项目的 zip 文件?

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

    e2e.ti.com/.../Clock-Test.zip

    我已经浏览了寄存器级别。 它似乎得到了一个振荡器故障标志、但我还无法找到关于原因的具体解释。

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

    连接到 XIN 的外部时钟似乎遇到了一个非常类似的问题、这会导致 MSP 锁定。 最初我们认为在清除全局振荡器故障标志时 MSP 正在锁定。 但是、经过进一步调查、我们发现从内部 DCO (800kHz)切换到外部时钟时、MSP430FR2355会卡住。

    MCU 可以保持此状态一段时间、我们观察到该行为与温度相关。 一段时间后、CPU 开始使用外部时钟正常工作。 外部时钟未中断、似乎不是问题的原因。

    我们上周的帖子:MSP430FR2355:MCU 锁定、时钟问题?"

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

    我认为您可能是对的。 "你是不是说你的孩子?"

    Fullscreen
    1
    while (HWREG8(SFR_BASE + OFS_SFRIFG1) & OFIFG);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    另外、我也无法重现您的温度问题。 我的温度循环它与一个不太优雅的冷冻喷雾和热枪,但它从来没有逃脱环路。

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

    是的,我们也首先注意到使用冷冻喷雾和热风枪的行为。 然后、我们将硬件放入温度室中。

    我们还尝试了以下方法:可以在引脚上启用 MCLK 输出。 在正常运行中、您应该首先看到频率为800kHz 左右的内部时钟、然后应该切换到外部时钟。 但在本例中、有时会发生切换、有时不会发生切换。

    要测试我们的代码是否卡在振荡器故障 while环路中:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do
    {
    GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN1);
    //Clear XT1 and DCO fault flags
    HWREG8(CS_BASE + OFS_CSCTL7) &= ~(XT1OFFG | DCOFFG);
    // Clear the global fault flag. In case the XT1 caused the global fault
    // flag to get set this will clear the global error condition. If any
    // error condition persists, global flag will get again.
    HWREG8(SFR_BASE + OFS_SFRIFG1) &= ~OFIFG;
    GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN1);
    } while (HWREG8(SFR_BASE + OFS_SFRIFG1) & OFIFG); // Test oscillator fault flag
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我们只需使用 GPIO 引脚并已将其切换。

    要将 MCLK 重新路由至输出引脚、可以使用以下代码:

    Fullscreen
    1
    2
    3
    4
    P2SEL0 |= BIT6; // Select P2.6 as MCLK out
    P2SEL1 &= ~(BIT6); // Select P2.6 as MCLK out
    // Output MCLK on P2.6
    P2DIR |= BIT6; // Configure P2.6 as output direction pin
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    在示波器上观察信号波形时、我们会看到代码卡在需要从内部800kHz 时钟切换到24MHz 外部时钟的点。 此问题会持续一段时间、然后才能恢复正常运行。

    此时:

    Fullscreen
    1
    CSCTL4 = SELMS__XT1CLK | SELA__REFOCLK;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    代码卡住时示波器的图像:

    • MCLK: MCLK 引脚的输出。 它从大约800kHz 开始、然后保持高电平、但应切换到24MHz。
    • 复位信号: 高电平。
    • P1.4引脚: 检查振荡器故障时切换
    • Xin: 24MHz。

    如果您使用热风枪对 MCU 加热一点点、或者只是让器件预热、它从它卡住的点开始正常工作

    MCU 有时会卡住、而在其他情况下、它在复位后可以正常工作。 这是一切正常运行时示波器的波形、我们可以看到 MCLK 波形从800kHz 变为24 MHz

    毫无疑问、TI 专家应介入并就您和我们的行为提供反馈。 在本例中、我们无法解释为什么会发生这种情况、为什么它会卡住一段时间、然后开始再次工作、但不会自行复位。 或许 GPIO 引脚可以帮助您识别它卡住的位置、这可能是一个很好的故障排除技巧。

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

    myside 的几条评论:

    1.您能帮助捕捉时钟信号捕获,以确保质量好吗?  

    2.您可以尝试此代码、我已使用5.333MHz 信号输入(由 LP-MSPM0G3507生成、从计时器的 PWM 输出来看占空比为57%)对其进行了验证、MSP430FR2355没有问题

     e2e.ti.com/.../6518.main.c