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.

[参考译文] MSP430FR5043:使用8MHz 外部晶体为 MCLK 和 SMCLK 配置时钟系统时出现问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1161050/msp430fr5043-problems-configuring-the-clock-system-for-mclk-and-smclk-with-8-mhz-external-crystal

器件型号:MSP430FR5043

大家好、

我在配置时钟系统以使用外部8MHz 晶体时遇到问题。 我使用的是64VQFN 芯片变体(MSP430FR5043IRGCT)。

晶体振荡器似乎工作正常、当使用示波器进行测量时、我从 HFXIN 引脚上的晶体获得一个干净的8MHz 正弦波。

但是、当我将引脚 P3.3设置为输出 MCLK 时、我会得到频率为4.75MHz 的方波(P3.4和输出 SMCLK 相同)。

我已将 CS 配置为使用 HFXT 作为 MCLK 和 SMCLK 的源、分频器为1、最大驱动强度。 我使用的旁路电容器各为14pF。

即使我只配置 CS 模块、不使用任何其他外设、MCLK/SMCLK 也是在4.75 MHz。
下面是我用于测试 CS 模块的代码:

#include <msp430.h> 
#include <stdint.h>


/**
 * main.c
 */
int main(void)
{
    uint16_t i = 0;                                 // Variable for counting down in fault flag clearing loop...

	WDTCTL = WDTPW | WDTHOLD;	                    // stop watchdog timer
	
	PM5CTL0 &= ~(uint16_t)LOCKLPM5;                 // unlock port pins

	// initialize external 8 MHz crystal

    PJSEL0 |= (1 << 6);                             // configure PJ.6 / PJ.7 to be used as HFXTIN/ HFXTOUT
    PJSEL1 &= ~(1 << 6);

    CSCTL0_H = 0xA5U;                               // Write key to key register, unlock CS module registers


    CSCTL1 &= (uint16_t)0x0000U;                    // clear register, we don't need the DCO
    CSCTL2 = (uint16_t)0x0155U;                     // Clock sources: ACLK = VLOCLK, SMCLK = HFXT, MCLK = HFXT
    CSCTL3 = (uint16_t)0x0000U;                     // All clock dividers = 1
    CSCTL4 = (uint16_t)0xC401U;                     // Max drive strength, no bypass, HFXT always on, HFFREQ > 4...8MHz, LFXT unconfigured / off, SMCLK on
    CSCTL5 = (uint16_t)0x00C0U;                     // Enable startup fault counters, clear HFXT/LFXT fault flags
    CSCTL6 = (uint16_t)0x000FU;

    do{                                             // Wait until HFXT fault flag is cleared.
        CSCTL5 &= ~((1 << 1) | 1);
        for(i = 0x1FFF; i > 0; i--);
    } while(CSCTL5 & HFXTOFFG);

    CSCTL0_H = 0xFF;                                // Write non-PW value to PW register => lock CS module registers


    // Configure P3.3 / P3.4 to output MCLK / SMCLK

    P3DIR |= (BIT3 | BIT4);

    P3SEL1 &= ~(BIT3 | BIT4);
    P3SEL0 |= (BIT3 | BIT4);

    // Do nothing...
    while(1) {

    }



	return 0;
}


有人可以提供帮助吗?

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

    PJSEL1 &=~(1 << 6);

    这不应该是7?

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

    您好、Andreas、

    以下是支持8MHz 晶体并输出 SMCLK 的 MSP430FR5043的代码示例。   https://dev.ti.com/tirex/explore/node?node=A__AIKoHBH4YfzkN4eOHSTQCQ__msp430ware__IOGqZri__LATEST 

    请看一下、让我知道这是否有帮助。  我确实认为 Keith 也在指出一个错误。  我建议像在示例中那样使用"BITx"#defines、而不是手动移动位。    

    谢谢、

    JD

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

    您好、Keith、

    感谢您的回复。 根据数据表、只需设置 PJSEL1.6和 PJSEL0.6、而 PJSEL1.7和 PJSEL0.7在 HFXT 运行时为"无关";或者我是否误读了此表中的内容?

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

    JD、您好!

    感谢您的指导。 我将看一下代码示例、并告诉您这是否解决了我的问题。

    此致、

    Andreas

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

    JD、

    我刚刚测试了示例代码、它立即输出8MHz 方波 SMCLK 信号。 这很有帮助! 谢谢你。

    此致、

    Andreas

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

    添加:

    关于示例代码、当然我必须设置 LFXTOFF 位(而不是将其清零)、因为我只有一个 HF 振荡器连接到 μ µC。 否则、LFXT 的 LFXTOFFG 振荡器故障标志将永远不会清除。