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.

[参考译文] LP-MSPM0G3507:影响 PLL 的修整设置

Guru**** 2468460 points
Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1327927/lp-mspm0g3507-trim-settings-affecting-pll

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

大家好、

使用 MSPM0G3507 (Launchpad)时、我们将尝试在16MHz 下对 SYSOSC 应用微调、然后应用 PLL 以达到80MHz。

但面对一些问题、有时在应用 PLL 时 SYOSC 会恢复到32MHz、而在其他时候、CPUCLK 不是80MHz。

如果没有修整、PLL 可以正常使用。

您能为我们建议后续步骤吗?

此致、

马德赫里亚  

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

    尊敬的 Madhurya:

    他们何时看到32MHz? 是否在器件复位后才将 SYSOSC 设置为使用用户调整配置?

    将 CPU CLK 设置为80MHz 时、他们看到的时钟速率是多少?

    此致、

    卢克

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

    我在 SLAU846a 2.3.1.2.4下在 SYSOSC 上以16MHz 进行了校准、同时禁用了 PLL。 应用修整值时、无需复位 MCU、也无需重置 MCU 即可测量相同的值。 我在配置之后执行了校准、就像 测试1.

    测试1:

         即使 在 MCU 复位后、也使用 ENABLE_USE_PLL = 0、FCL_ENABLED = 1、FCL_PREVE = 1、测量结果为16.05Mhz。



    测试2:

    使用 ENABLE_USE_PLL = 0、 FCL_ENABLED = 1、 FCL_PERIOD = 0、 在复位前和复位后测量32MHz MCU 15.0Mhz。

    测试3:

    使用 ENABLE_USE_PLL = 1、 FCL_ENABLED = 1、 FCL_PERIOD = 1时、我的测量值为32.4Mhz、 即使 在 MCU 复位后也是如此。 这是按照关于 slau846a  SYSPLL 使用示例(第114页) 的建议和使用 CLK_OUT 且启用频率校正环路(FCL)(存在 ROSC 电阻器)的调整过程(第111页)进行的。 这是我认为应用修整和 PLL 的正确方法、但结果并非预期结果。



    测试4:

    通过使用  ENABLE_USE_PLL = 1、FCL_ENABLED = 1 、FCL_PAYER = 0、我应用时的测量值为32.4Mhz、 但 在复位后、MCU 更改为15.0Mhz、与 测试2 。  



    按照我的测试代码:

    /*
     * Copyright (c) 2023, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    #include "ti_msp_dl_config.h"
    
    volatile uint32_t mSysCTL = 0x0000000;
    
    #define POWER_STARTUP_DELAY                                                (16)
    
    
    #define GPIO_CLKOUT_PORT                                                   GPIOA
    #define GPIO_CLKOUT_PIN                                           DL_GPIO_PIN_14
    #define GPIO_CLKOUT_IOMUX                                        (IOMUX_PINCM36)
    #define GPIO_CLKOUT_IOMUX_FUNC                   IOMUX_PINCM36_PF_SYSCTL_CLK_OUT
    #define GPIO_ROSC_PORT                                                     GPIOA
    #define GPIO_ROSC_PIN                                              DL_GPIO_PIN_2
    #define GPIO_ROSC_IOMUX                                           (IOMUX_PINCM7)
    #define CPUCLK_FREQ                                                     32000000
    
    #define ENABLE_USE_PLL                                                  1 // 0 - DISABLE / 1 - ENABLE
    #define FCL_ENABLED                                                     1 // 0 - DISABLE / 1 - ENABLE
    #define FCL_BEFORE                                                      1 // 0 - AFTER / 1 - BEFORE
    
    void mySysInit()
    {
        DL_GPIO_reset(GPIOA);
        DL_GPIO_reset(GPIOB);
    
        DL_GPIO_enablePower(GPIOA);
        DL_GPIO_enablePower(GPIOB);
        delay_cycles(POWER_STARTUP_DELAY);
    
    
        DL_GPIO_initPeripheralOutputFunction(GPIO_CLKOUT_IOMUX, GPIO_CLKOUT_IOMUX_FUNC);
        DL_GPIO_enableOutput(GPIO_CLKOUT_PORT, GPIO_CLKOUT_PIN);
        DL_GPIO_initPeripheralAnalogFunction(GPIO_ROSC_IOMUX);
    
    
    
        DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE);
        /* Set default configuration */
        DL_SYSCTL_disableHFXT();
        DL_SYSCTL_disableSYSPLL();
        //DL_SYSCTL_enableExternalClock(DL_SYSCTL_CLK_OUT_SOURCE_SYSPLLOUT1,
        //    DL_SYSCTL_CLK_OUT_DIVIDE_2);
        DL_SYSCTL_enableExternalClock(DL_SYSCTL_CLK_OUT_SOURCE_SYSOSC,
                DL_SYSCTL_CLK_OUT_DIVIDE_DISABLE);
    
        //Low Power Mode is configured to be SLEEP0
        DL_SYSCTL_setBORThreshold(DL_SYSCTL_BOR_THRESHOLD_LEVEL_0);
    }
    
    int main(void)
    {
        //SYSCFG_DL_init();
        mySysInit();
    
    #if (FCL_ENABLED == 1 && FCL_BEFORE == 1)
        // Need to be at FREQ_BASE
        DL_SYSCTL_enableSYSOSCFCL();   
    #endif
    
        /**
         * FCL Disabled
         *      RDIV    0x150 
         *      FINE    0x08
         *      COARSE  0x13
         *      CAP     0x01
         * 
         * FCL Enabled
         *      RDIV    0x150 
         *      FINE    0x08
         *      COARSE  0x13
         *      CAP     0x01
        */
    
        DL_SYSCTL_SYSOSCUserTrimConfig myTrim =
            {
                 0x150,                             // RDIV
                 0x08,                              // resistorFine
                 0x15,                              // resistorCoarse
                 0x01,                              // capacitor
                 DL_SYSCTL_SYSOSC_USERTRIM_FREQ_16M
            };       //Trim Config
    
        DL_SYSCTL_configSYSOSCUserTrim(&myTrim);                                                                        //Writing the SYSOSC User Register
    
        DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_USERTRIM);                                                        //Updating the SYSOSC Frequency to User Value
        /*WOTHOUT ROSC END*/
    
    #if (FCL_ENABLED == 1 && FCL_BEFORE == 0) 
        /*WITH ROSC START*/
        DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE);                                                            // changing the SYSOSC to Base i.e. 32MHz
        DL_SYSCTL_enableSYSOSCFCL();                                                                                    // Enabling the FCL
        DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_USERTRIM);                                                        // Changing to trim value frequency
    #endif
    
    #if (ENABLE_USE_PLL == 1)
    
        static const DL_SYSCTL_SYSPLLConfig gSYSPLLConfig = {
            .inputFreq              = DL_SYSCTL_SYSPLL_INPUT_FREQ_16_32_MHZ,
            .rDivClk2x              = 3,
            .rDivClk1               = 1,
            .rDivClk0               = 0,
            .enableCLK2x            = DL_SYSCTL_SYSPLL_CLK2X_ENABLE,
            .enableCLK1             = DL_SYSCTL_SYSPLL_CLK1_ENABLE,
            .enableCLK0             = DL_SYSCTL_SYSPLL_CLK0_DISABLE,
            .sysPLLMCLK             = DL_SYSCTL_SYSPLL_MCLK_CLK2X,
            .sysPLLRef              = DL_SYSCTL_SYSPLL_REF_SYSOSC,
            .qDiv                   = 9,
            .pDiv                   = DL_SYSCTL_SYSPLL_PDIV_2,
    
        };
        DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE);
        DL_SYSCTL_configSYSPLL((DL_SYSCTL_SYSPLLConfig *) &gSYSPLLConfig);
        DL_SYSCTL_setULPCLKDivider(DL_SYSCTL_ULPCLK_DIV_2);
    
        while((DL_SYSCTL_getClockStatus() & DL_SYSCTL_CLK_STATUS_SYSPLL_GOOD) != DL_SYSCTL_CLK_STATUS_SYSPLL_GOOD);
        
        DL_SYSCTL_setMCLKSource(SYSOSC, HSCLK, DL_SYSCTL_HSCLK_SOURCE_SYSPLL);
        DL_SYSCTL_setMCLKDivider(DL_SYSCTL_MCLK_DIVIDER_DISABLE);
    
    
        DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_USERTRIM);
    #endif
    
        while (1) {
            mSysCTL = SYSCTL->SOCLOCK.SYSOSCFCLCTL;
        }
    }
    


    Question:
    我假设测试3是应用修整和 PLL 的正确方法、但当我们测量 SYSOSC 时、该值是意料之外的。 我们的流程是不是错误的?

    由于我们将在不同的值中使用 PLL、但主要是在80MHz 频率下使用、我们应该在启用 PLL 的情况下查看最终值、还是应该在禁用 PLL 但查看 SYSOSC 用户值的情况下执行校准、如16MHz? 由于我们计划在 PLL 中使用不同的时钟频率、因此至少要使用两种时钟频率(80MHz 及其他更低频率以适应低功耗模式下的电流消耗)

    3-我们是否需要在每次更改修整值时执行复位以检查时钟? 我们正在考虑建立一个可以自动校准的功能、但对每一项更改进行复位会更困难。

    4 -要应用 PLL、参考手册中提到我们需要在应用 PLL 之前更改为 FREQ BASE、但由于我们计划使用16MHz FREQ 用户、因此 PLL 参数不同。 因此、如果我们将使用16MHz 的 PLL 并使用80MHz、当我们应用 PLL 时、我们使用直接显示到最终值的值、或者我们应该应用一些逻辑值、思考如何32MHz、然后在应用 FREQ 用户之后我们更改 PLL 值? 这在参考手册上有点模糊。

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

    您好,Ulysses,

    您能否在时钟输出信号上添加分频器?

    1. 我对您的时钟信号持怀疑态度、因为您的时钟信号边沿没有定义。 它们的变化过程就像在信号上有一个电容器一样。
    2. 我会根据 Sysosc 精度来设置您的目标、SYSPLL 在很大程度上取决于您的输入精度。
    3. 每次更改修整值时、应该不需要重置器件。
      1. 您将需要返回到基础频率、然后更新修整值、再返回到用户修整频率。
      2. 如果您有一个低频晶体、您可以使用频率计数器来帮助自动更新您的 User Trim。 我没有亲自测试这个想法、但理论确实存在。 如果您有兴趣、我可以详细介绍一下这个想法。
    4. 让我看看用户指南中为何列出了此限制。

    此致、
    卢克

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

    Luke、您好!

    是的、我将使用分频器2重新运行测试。

    1.同意您的意见,这是我在所有测试中看到的信号,但我没有任何连接,是引脚(A14)直接到示波器。 我正在使用 A14引脚上的 Launchpad mspm0g3507时钟输出。 我正在使用示波器100Mhz 1GSa/s。
    2.好的,就是我所期望的,只需要检查一下  
    3. A.相关知识
      B.我对此很感兴趣。 我们可能会使用它、  

    4.让我知道更多关于这一点,因为这对我来说有点困惑

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

    您好,Ulysses,

    只想提供一个跟进信息、我仍在研究 TRM 中的注释、并澄清您是否可以在用户修整值而不是"基础频率"下运行 SYSOSC。

    此致、

    卢克

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

    Luke、您好!

    您是否有关于此 TT 的更新?

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

    您好,Ulysses,

    为了使内部系统正确执行 PLL、sysosc 需要处于基础频率。 由于您可以在第16 -48 MHz 处通过 PLL 放置一个外部晶体、因此这种限制不是来自 PLL。

    TRM 中的注释是正确的。

    此致、
    卢克

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

    Luke、您好!

    好的、但我的问题是、一旦我以用户频率(16MHz)使用 SYSOSC、并需要以80MHz 的频率运行 CPUCLK、如何正确地应用 PLL?  

    1- SYSOSC = BASE_FREQ
    考虑 USER_FREQ (16MHz)应用 PLL 参数、以获得80MHz
    3-将 SYSOSC 更改为 USER_FREQ

    这是正确的方法吗?

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

    您好,Ulysses,

    使用 sysosc 作为 syspll 源时、sysosc 需要处于基频。 我曾尝试手动更改该设置、但在使用 SYSPLL 时、sysosc 将一直保持在32MHz 状态。

    此致、
    卢克

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

    Luke、您好!

    好的、如果我理解正确的话、我们不能以用户频率运行 sysosc 的 PLL、这是正确的吗? 如果我的理解是正确的、那么一旦我们需要 PLL、我们如何提高时钟精度呢? 今天我们可以看到、sysosc 在基础频率下会出现大约2%的误差、这在 我们的系统中是不可接受的、我们需要大约0.5%的误差。

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

    您好,Ulysses,

    使用 ROSC 电阻器、您应该会获得比2%更好的精度。 左图是使用 FCL 和 ROSC 电阻器时的 sysosc 精度。 典型值在0.5%之内、  您的终端应用工作温度范围将会改变预期值。

    此致、
    卢克

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

    您好,Ulysses,

    我创建了一个计时器示例、该示例将根据 SYSPLL 的实际频率获得更高精度的计时器。

    如果您有任何后续问题、请告诉我。

    e2e.ti.com/.../timer_5F00_higher_5F00_accuracy_5F00_example.zip

    此致、
    卢克