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.

[参考译文] MSPM0G3507:SYSPLL 设置示例中的 TRM 错误[SLAU846B Sec 2.3.1.3.1]

Guru**** 2455560 points
Other Parts Discussed in Thread: MSPM0G1507, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491939/mspm0g3507-trm-error-in-syspll-setup-example-slau846b-sec-2-3-1-3-1

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

工具与软件:

TRM (SLAU846B)第2.3.1.3.1节中的 SYSPLL 使用示例的步骤中存在错误:

步骤(9)-(10)启动 PLL、然后步骤(11)使用 MCLK2XVCO 将 PLL 输出连接到 HSCLK。 但一旦启用了 PLL、就 无法设置 MCLK2XVCO [观察到的行为]、因此 HSCLK (以及 MCLK)在没有时钟源的情况下结束。 这种症状是 MCU 挂起、调试器无法联系它。  BSL 技巧足以将 其恢复。

解决方法是在执行步骤(9)之前执行步骤(11)。  

Driverlib 是这样做的、实际上它将步骤(7)、(8)和(11)合并为步骤(9)之前执行的单个步骤。

通常我不会发布简单的文档错误、但这似乎是一个相当重要(不明显)的错误。

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

    我只是张贴这是为了警告其他人。 我有一个权变措施、因此我没问题。

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

    您好、 

    [报价 userid="47378" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491939/mspm0g3507-trm-error-in-syspll-setup-example-slau846b-sec-2-3-1-3-1 "]步骤(9)-(10)启动 PLL、然后步骤(11)使用 MCLK2XVCO 将 PLL 输出连接到 HSCLK。 但一旦启用了 PLL、就 无法设置 MCLK2XVCO [观察到的行为]、因此 HSCLK (以及 MCLK)最终没有时钟源。[/QUOT]

    您是否有此测试代码?

    我打算从我这边尝试。

    此致、

    Helic

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

    我这里没有代码、我打算今晚将代码发布。 这实际上只是该示例的分步实施。 [我已经观察到每个 PLL 在某个地方都有一些不同寻常的内容、因此我一开始就很简单。]

    对于 PLL (子)系统来说、典型情况是一旦 PLL 开始计时、部分/所有配置都被锁定、但 TRM 并没有真正提到 SYSPLL、也没有(更重要的是)锁定哪些特定字段。

    一条线索(我刚注意到)是 CLKSTATUS:SYSPLLBLKUPD [参考表2-53]的定义、该定义被描述为适用于所有 SYSPLLCFG0/1 (和 SYSPLLPARAM0/1)、其中包括 MCLK2XVCO。 [我想如果 SYSPLL 正在运行、它会被"阻止"、但也不会这样。]

    正如我所提到的:我已经(现在)知道答案;我只是关心下一个尝试这种方法的人。

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

    这是一个 paked-down 版本。 将 PLLFAIL 设置为1将使用 TRM 顺序、而设置为0将使用更正后的顺序。

    导入几乎任何示例(我使用了 GPIO_toggle_output)、然后将其粘贴到 main.c 中 特别是,避免调用 SYSCFG_DL_init (),因为该代码假定没有人与时钟发生混乱。

    ///
    //      Start up the PLL
    //      No warranty, no support. I may not even exist.
    //
    #include <ti/devices/msp/msp.h>
    
    #define PLLFAIL 0           // Set to 1 to demonstrate TRM ordering
    
    //  clk.h:
    
    #define HZ  80000000UL // 32000000UL
    extern void clk_init(void);
    extern void clk_mon(void);
    
    //  clk.c:
    
    ///
    //  clk_icache()
    //  Turn the ICache on (>0) or off (=0)
    //
    static inline uint32_t
    clk_icache(uint32_t onoff)
    {
        uint32_t saved = (CPUSS->CTL & CPUSS_CTL_ICACHE_ENABLE);
        if (onoff)              // on?
            CPUSS->CTL |= CPUSS_CTL_ICACHE_ENABLE;
        else                    // off
            CPUSS->CTL &= ~CPUSS_CTL_ICACHE_ENABLE;
        return(saved);
    }
    
    ///
    //  clk_init()
    //  Make MCLK run at (HZ)
    //
    void
    clk_init(void)
    {
    #if (HZ == 32000000UL)
        //  (That was easy)
    #elif (HZ == 80000000UL)||(HZ == 64000000UL)
        uint32_t ic = clk_icache(0);            // Disable ICache for CPU_ERR_01
        SYSCTL->SOCLOCK.SYSPLLCFG0 &= ~SYSCTL_SYSPLLCFG0_SYSPLLREF_MASK;    // (3) PLLREF=0 (SYSOSC)
        SYSCTL->SOCLOCK.SYSPLLCFG1 |= SYSCTL_SYSPLLCFG1_PDIV_REFDIV2;       // (4) PLLREF/2 -> f_LOOPIN=16MHz
        SYSCTL->SOCLOCK.SYSPLLPARAM0 = FACTORYREGION->PLLSTARTUP0_16_32MHZ; // (5) f_LOOPIN = 16MHz
        SYSCTL->SOCLOCK.SYSPLLPARAM1 = FACTORYREGION->PLLSTARTUP1_16_32MHZ; // (5) f_LOOPIN = 16MHz
    #if (HZ == 80000000UL)
        SYSCTL->SOCLOCK.SYSPLLCFG1 |= ((5-1) << SYSCTL_SYSPLLCFG1_QDIV_OFS); // (6) QDIV=5 for (5*16)=80MHz
    #else   //  64MHz
        SYSCTL->SOCLOCK.SYSPLLCFG1 |= ((4-1) << SYSCTL_SYSPLLCFG1_QDIV_OFS); // (6) QDIV=4 for (4*16)=64MHz
    #endif //   HZ
        SYSCTL->SOCLOCK.SYSPLLCFG0 |= SYSCTL_SYSPLLCFG0_RDIVCLK1_CLK1DIV2|SYSCTL_SYSPLLCFG0_RDIVCLK2X_CLK2XDIV2; // (7) CLK1/2, CLK2X/2
        SYSCTL->SOCLOCK.SYSPLLCFG0 |= SYSCTL_SYSPLLCFG0_ENABLECLK1_ENABLE|SYSCTL_SYSPLLCFG0_ENABLECLK2X_ENABLE; // (8) En CLK1 and CLK2X
    #if !PLLFAIL
        SYSCTL->SOCLOCK.SYSPLLCFG0 |= SYSCTL_SYSPLLCFG0_MCLK2XVCO_ENABLE;   // (11) CLK2X->HSCLK
    #endif // PLLFAIL
        SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_SYSPLLEN_ENABLE;          // (9) Enable PLL
        while ((SYSCTL->SOCLOCK.CLKSTATUS & SYSCTL_CLKSTATUS_SYSPLLGOOD_MASK) == 0) {/*EMPTY*/;} // (10) Wait for PLLGOOD
    #if PLLFAIL
        SYSCTL->SOCLOCK.SYSPLLCFG0 |= SYSCTL_SYSPLLCFG0_MCLK2XVCO_ENABLE;   // (11) CLK2X->HSCLK
    #endif // PLLFAIL
        SYSCTL->SOCLOCK.HSCLKCFG &= ~SYSCTL_HSCLKCFG_HSCLKSEL_MASK;         // (12) HSCLKSEL=SYSPLL
        SYSCTL->SOCLOCK.MCLKCFG |= SYSCTL_MCLKCFG_USEHSCLK_ENABLE;          // (13) MCLK = HSCLK
        clk_icache(ic);             // Restore ICache
    #else
    #error "clk_init: HZ?"
    #endif // HZ
        return;
    }
    
    ///
    //  clk_mon()
    //  Put CLK_OUT (PLLOUT1) on PB11 for the scope
    //
    void
    clk_mon(void)
    {
    #define CLKOUT_PORT GPIOB
    #define CLKOUT_PIN  (1u << 11)  //  PB11
    #define CLKOUT_MUX  IOMUX_PINCM28
    #define CLKOUT_PF   4           // CLK_OUT per SLASEX6B Table 6-1
    #define CLKOUT_DIV  0           // /1 or maybe (SYSCTL_GENCLKCFG_EXCLKDIVVAL_DIV2|SYSCTL_GENCLKCFG_EXCLKDIVEN_ENABLE) // /2
        IOMUX->SECCFG.PINCM[CLKOUT_MUX] = (IOMUX_PINCM_PC_CONNECTED | IOMUX_PINCM_INENA_ENABLE | CLKOUT_PF);
        SYSCTL->SOCLOCK.GENCLKCFG |= SYSCTL_GENCLKCFG_EXCLKSRC_SYSPLLOUT1|CLKOUT_DIV;
        SYSCTL->SOCLOCK.GENCLKEN |= SYSCTL_GENCLKEN_EXCLKEN_ENABLE;
        return;
    }
    
    //  main.c:
    
    ///
    //  gpio_powerup()
    //
    void
    gpio_powerup(void)
    {
        //  Power up all the GPIOs
        GPIOA->GPRCM.PWREN = (GPIO_PWREN_KEY_UNLOCK_W | GPIO_PWREN_ENABLE_ENABLE);
        GPIOB->GPRCM.PWREN = (GPIO_PWREN_KEY_UNLOCK_W | GPIO_PWREN_ENABLE_ENABLE);
        return;
    }
    
    ///
    //  main()
    //
    int
    main(void)
    {
        gpio_powerup();
        clk_mon();              // Something to watch on the scope (PB11)
        clk_init();
        while (1)
        {
            __WFI();
        }
        /*NOTREACHED*/
        return(0);
    }
    

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

    太棒了!

    当然、如果您没有这样的演示、我会尝试设置一个。

    最好有一个、这将节省更多时间!

    感谢您的反馈~

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

    嗯、您是否正在寻找与我发布的内容不同的内容(如上所述)?

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

     

    我尝试了您的建议、 "将 PLLFAIL 设置为1将使用 TRM 顺序。" 在中 DL_SYSCTL_configSYSPLL () 位置。 通过这一改变、我将获得更好的结果 MSPM0G1507频率超出容差问题 .

    有关更多详细信息、请查看以下链接: MSPM0G1507 -频率超出容差问题

    请确认在使用时是否需要进行此修改 SYSPLL 或者是否有替代方法可以确保更高的准确性?

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

    我不是很确定你做了什么改变(和什么),但我认为这对你的结果有影响是有趣的。 [我没有评论,因为 Helic 似乎在我前面很远。]

    我注意到的一个区别是、在您的案例中、SysConfig 在我使用 QDIV=(5-1)和 RDIV2X=(2-1)时确定了 QDIV2X=(10-1)。

    每次采集过程中、80MHz、但您的时钟运行速度是{160MHz、32MHz 320MHz}与{80MHz、160MHz}快两倍。 这不是超出规范、但可能在某个地方有一个现象?

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

    Bruce、您好!

    感谢您的澄清、  

     我怀疑在"DL_SYSCTL_configSYSPLL ()"函数实现中有一些东西可能缺失或定序错误、这可能会影响 SYSPLL 初始化过程。

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

    关于此处的主题、configSYSPLL 使用正确的顺序(与 TRM 中的顺序不同)。  

    您做出了哪些改变、似乎可以改善您的结果?

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

    他在器件完全上电后重置器件、可获得更高的时钟精度。

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

    我们 重新初始化  使用时钟功能、是的、在软复位后、我也获得了更高的精度  

     // for any clock change the SYSOSC must be at 32MHz and PLL should be disabled
        DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE);
        DL_SYSCTL_enableSYSOSCFCLExternalResistor();
        DL_SYSCTL_disableHFXT();
        DL_SYSCTL_disableSYSPLL();
    
        
     
            static const DL_SYSCTL_SYSPLLConfig SYSPLLConfig_80Mhz = 
            {
                .inputFreq              = DL_SYSCTL_SYSPLL_INPUT_FREQ_16_32_MHZ,
                .rDivClk2x              = 3,
                .rDivClk1               = 0, 
                .rDivClk0               = 0,
                .enableCLK2x            = DL_SYSCTL_SYSPLL_CLK2X_ENABLE,
                .enableCLK1             = DL_SYSCTL_SYSPLL_CLK1_DISABLE, 
                .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
            };
            /*PLL setup and Clock dividers*/
            DL_SYSCTL_configSYSPLL((DL_SYSCTL_SYSPLLConfig *) &SYSPLLConfig_80Mhz);
            DL_SYSCTL_setMCLKSource(SYSOSC, HSCLK, DL_SYSCTL_HSCLK_SOURCE_SYSPLL); 
            DL_SYSCTL_setULPCLKDivider(DL_SYSCTL_ULPCLK_DIV_2);
            DL_SYSCTL_configSYSPLL((DL_SYSCTL_SYSPLLConfig *) &SYSPLLConfig_80Mhz);

    我已附上代码片段供您参考。

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

    请检查以下两种情况:

    1️⃣ μ A 初始化代码的晶体
    结果: 时钟不准确( 设置:2kHz、获取:2025-2030Hz 使用5个样片板进行测试)。

    void DL_SYSCTL_configSYSPLL(DL_SYSCTL_SYSPLLConfig *config)
    {
        /* PLL configurations are retained in lower reset levels. Set default
         * behavior of disabling the PLL to keep a consistent behavior regardless
         * of reset level. */
        DL_SYSCTL_disableSYSPLL();
    
        /* Check that SYSPLL is disabled before configuration */
        while ((DL_SYSCTL_getClockStatus() & (DL_SYSCTL_CLK_STATUS_SYSPLL_OFF)) !=
               (DL_SYSCTL_CLK_STATUS_SYSPLL_OFF)) {
            ;
        }
    
        // set SYSPLL reference clock
        DL_Common_updateReg(&SYSCTL->SOCLOCK.SYSPLLCFG0,
            ((uint32_t) config->sysPLLRef), SYSCTL_SYSPLLCFG0_SYSPLLREF_MASK);
    
        // set predivider PDIV (divides reference clock)
        DL_Common_updateReg(&SYSCTL->SOCLOCK.SYSPLLCFG1, ((uint32_t) config->pDiv),
            SYSCTL_SYSPLLCFG1_PDIV_MASK);
    
        // save CPUSS CTL state and disable the cache
        uint32_t ctlTemp = DL_CORE_getInstructionConfig();
        DL_CORE_configInstruction(DL_CORE_PREFETCH_ENABLED, DL_CORE_CACHE_DISABLED,
            DL_CORE_LITERAL_CACHE_ENABLED);
    
        // populate SYSPLLPARAM0/1 tuning registers from flash, based on input freq
        SYSCTL->SOCLOCK.SYSPLLPARAM0 =
            *(volatile uint32_t *) ((uint32_t) config->inputFreq);
        SYSCTL->SOCLOCK.SYSPLLPARAM1 =
            *(volatile uint32_t *) ((uint32_t) config->inputFreq + (uint32_t) 0x4);
    
        // restore CPUSS CTL state
        CPUSS->CTL = ctlTemp;
    
        // set feedback divider QDIV (multiplies to give output frequency)
        DL_Common_updateReg(&SYSCTL->SOCLOCK.SYSPLLCFG1,
            ((config->qDiv << SYSCTL_SYSPLLCFG1_QDIV_OFS) &
                SYSCTL_SYSPLLCFG1_QDIV_MASK),
            SYSCTL_SYSPLLCFG1_QDIV_MASK);
    
        // write clock output dividers, enable outputs, and MCLK source to SYSPLLCFG0
        DL_Common_updateReg(&SYSCTL->SOCLOCK.SYSPLLCFG0,
            (((config->rDivClk2x << SYSCTL_SYSPLLCFG0_RDIVCLK2X_OFS) &
                 SYSCTL_SYSPLLCFG0_RDIVCLK2X_MASK) |
                ((config->rDivClk1 << SYSCTL_SYSPLLCFG0_RDIVCLK1_OFS) &
                    SYSCTL_SYSPLLCFG0_RDIVCLK1_MASK) |
                ((config->rDivClk0 << SYSCTL_SYSPLLCFG0_RDIVCLK0_OFS) &
                    SYSCTL_SYSPLLCFG0_RDIVCLK0_MASK) |
                config->enableCLK2x | config->enableCLK1 | config->enableCLK0 |
                (uint32_t) config->sysPLLMCLK),
            (SYSCTL_SYSPLLCFG0_RDIVCLK2X_MASK | SYSCTL_SYSPLLCFG0_RDIVCLK1_MASK |
                SYSCTL_SYSPLLCFG0_RDIVCLK0_MASK |
                SYSCTL_SYSPLLCFG0_ENABLECLK2X_MASK |
                SYSCTL_SYSPLLCFG0_ENABLECLK1_MASK |
                SYSCTL_SYSPLLCFG0_ENABLECLK0_MASK |
                SYSCTL_SYSPLLCFG0_MCLK2XVCO_MASK));
    
        // enable SYSPLL
        SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_SYSPLLEN_ENABLE;
    
        // wait until SYSPLL startup is stabilized
        while ((DL_SYSCTL_getClockStatus() & SYSCTL_CLKSTATUS_SYSPLLGOOD_MASK) !=
               DL_SYSCTL_CLK_STATUS_SYSPLL_GOOD) {
            ;
        }
    }
    

    2️⃣ μ A 使用默认代码+您建议的更改

    void DL_SYSCTL_configSYSPLL(DL_SYSCTL_SYSPLLConfig *config)
    {
        /* PLL configurations are retained in lower reset levels. Set default
         * behavior of disabling the PLL to keep a consistent behavior regardless
         * of reset level. */
        DL_SYSCTL_disableSYSPLL();
    
        /* Check that SYSPLL is disabled before configuration */
        while ((DL_SYSCTL_getClockStatus() & (DL_SYSCTL_CLK_STATUS_SYSPLL_OFF)) !=
               (DL_SYSCTL_CLK_STATUS_SYSPLL_OFF)) {
            ;
        }
    
        // set SYSPLL reference clock
        DL_Common_updateReg(&SYSCTL->SOCLOCK.SYSPLLCFG0,
            ((uint32_t) config->sysPLLRef), SYSCTL_SYSPLLCFG0_SYSPLLREF_MASK);
    
        // set predivider PDIV (divides reference clock)
        DL_Common_updateReg(&SYSCTL->SOCLOCK.SYSPLLCFG1, ((uint32_t) config->pDiv),
            SYSCTL_SYSPLLCFG1_PDIV_MASK);
    
        // save CPUSS CTL state and disable the cache
        uint32_t ctlTemp = DL_CORE_getInstructionConfig();
        DL_CORE_configInstruction(DL_CORE_PREFETCH_ENABLED, DL_CORE_CACHE_DISABLED,
            DL_CORE_LITERAL_CACHE_ENABLED);
    
        // populate SYSPLLPARAM0/1 tuning registers from flash, based on input freq
        SYSCTL->SOCLOCK.SYSPLLPARAM0 =
            *(volatile uint32_t *) ((uint32_t) config->inputFreq);
        SYSCTL->SOCLOCK.SYSPLLPARAM1 =
            *(volatile uint32_t *) ((uint32_t) config->inputFreq + (uint32_t) 0x4);
    
        // restore CPUSS CTL state
        CPUSS->CTL = ctlTemp;
    
        // set feedback divider QDIV (multiplies to give output frequency)
        DL_Common_updateReg(&SYSCTL->SOCLOCK.SYSPLLCFG1,
            ((config->qDiv << SYSCTL_SYSPLLCFG1_QDIV_OFS) &
                SYSCTL_SYSPLLCFG1_QDIV_MASK),
            SYSCTL_SYSPLLCFG1_QDIV_MASK);
    
        // write clock output dividers, enable outputs, and MCLK source to SYSPLLCFG0
        DL_Common_updateReg(&SYSCTL->SOCLOCK.SYSPLLCFG0,
            (((config->rDivClk2x << SYSCTL_SYSPLLCFG0_RDIVCLK2X_OFS) &
                 SYSCTL_SYSPLLCFG0_RDIVCLK2X_MASK) |
                ((config->rDivClk1 << SYSCTL_SYSPLLCFG0_RDIVCLK1_OFS) &
                    SYSCTL_SYSPLLCFG0_RDIVCLK1_MASK) |
                ((config->rDivClk0 << SYSCTL_SYSPLLCFG0_RDIVCLK0_OFS) &
                    SYSCTL_SYSPLLCFG0_RDIVCLK0_MASK) |
                config->enableCLK2x | config->enableCLK1 | config->enableCLK0 |
                (uint32_t) config->sysPLLMCLK),
            (SYSCTL_SYSPLLCFG0_RDIVCLK2X_MASK | SYSCTL_SYSPLLCFG0_RDIVCLK1_MASK |
                SYSCTL_SYSPLLCFG0_RDIVCLK0_MASK |
                SYSCTL_SYSPLLCFG0_ENABLECLK2X_MASK |
                SYSCTL_SYSPLLCFG0_ENABLECLK1_MASK |
                SYSCTL_SYSPLLCFG0_ENABLECLK0_MASK |
                SYSCTL_SYSPLLCFG0_MCLK2XVCO_MASK));
    
        // enable SYSPLL
        SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_SYSPLLEN_ENABLE;
    
        // wait until SYSPLL startup is stabilized
        while ((DL_SYSCTL_getClockStatus() & SYSCTL_CLKSTATUS_SYSPLLGOOD_MASK) !=
               DL_SYSCTL_CLK_STATUS_SYSPLL_GOOD) {
            ;
        }
         SYSCTL->SOCLOCK.SYSPLLCFG0 |= SYSCTL_SYSPLLCFG0_MCLK2XVCO_ENABLE;   // (11) CLK2X->HSCLK: this is the only change I added extra
    }
    

    结果:  获得更高的时钟精度( 设置:2kHz、获取:1994-2015Hz 使用5个样片板进行测试)。

    基于此、我对是否有疑问 初始化序列 是正确的。 您能评论一下吗?

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

    我这边还有一点。

    需要确认这是由 SYSPLL 还是 SYSOSC 引起的。

    您是否可以在没有 SYSPLL 的情况下测试 SYSOSC? 直接从 SYSOSC 获得以32MHz 运行的 CPU。

    我想这是由 SYSPLL 配置序列引起的、而不是与 SYSOSC 精度有关。

    基于此、我对是否有疑问 初始化序列 是正确的。 请您查看一下吗?

    我会对此进行审核、但这可能需要几天的时间才能完成。

    很高兴收到您的反馈。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="571933" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491939/mspm0g3507-trm-error-in-syspll-setup-example-slau846b-sec-2-3-1-3-1/5736539 #5736539"]

    猜测这是由 SYSPLL 配置序列引起的、而不是 SYSOSC 精度问题。

    [报价]

    我也是 怀疑 SYSPLL 初始化序列 、而不是 SYSOSC  精度。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    i also 怀疑 SYSPLL 初始化序列 、而不是 SYSOSC  精度。 [报价]

    同意您的意见。

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

    这是一个令人惊讶的结果。 我观察到的--事实上这个线程的前提--是一旦 PLL 启动(PLLEN)、 MCLK2XVCO 位(可能全部是 PLLCFG0)就被锁定、无法更新。 这意味着您的附加代码行将不起作用。 (另外:到那时、 MCLK2XVCO 已被置位。) 读取(读/修改/写)是否产生影响? [这是不应该的、但我做这个事情的时间太长了、无法自动拒绝这个想法。]

    如果你看着我上面发布的代码的末尾,有一个 clk_mon()函数你可能想要窃取。 CLK_OUT 函数可以监视 PB11上的 SYOSC 或 PLLOUT1 [必须在 SysConfig 中启用该功能]。

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

    以下是 TRM 的一些参考资料、但这些资料似乎不够详细:

    Enabling and Disabling the SYSPLL
    After configuration, enable the SYSPLL by setting the SYSPLLEN bit in the HSCLKEN register. Before enabling
    the SYSPLL, make sure that the SYSPLL is in a disabled state by verifying that the SYSPLLOFF bit in the
    CLKSTATUS register is set. After the SYSPLL is enabled, application software must not disable it until the
    SYSPLLGOOD or SYSPLLOFF bit is set in the CLKSTATUS register, indicating that the SYSPLL transitioned to
    a stable active state or a stable dead state. When the SYSPLL is enabled, the SYSPLL reference clock selection
    must not be changed.

    现在很忙、但我相信我将在接下来的几天内证实这一点。