You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32L4S5VIT6时钟配置:代码卡在PLL系统时钟等待循环(注释7)

问题排查与解决方案

核心问题分析

你的代码卡在等待PLL成为系统时钟的循环,主要由两个关键错误导致:

1. 未启用PLLR输出

STM32L4系列的PLL需单独启用对应输出通道才能使用。要将PLLR作为系统时钟源,必须在配置PLLCFGR时设置PLLREN位,否则PLLR输出未激活,无法切换为系统时钟。

2. APB1总线时钟超标

STM32L4S5的APB1总线最大允许频率为60MHz。你的代码中,系统时钟切换到96MHz后才设置APB1分频为DIV1,导致APB1时钟等于系统时钟96MHz,远超上限,引发外设异常,阻止时钟切换完成。

修正后的代码

#define TIMEOUT 1000000  // Timeout value to avoid infinite loops
/* System Clock Configuration */
void cfg_sys_clock()
{
        uint32_t timeout;

        // 1. Enable MSI first
        SET_BIT(RCC->CR, RCC_CR_MSION);

        // 2. Wait for MSI Ready
        timeout = TIMEOUT;
        while (!(READ_BIT(RCC->CR, RCC_CR_MSIRDY)) && --timeout);
        if (timeout == 0) while (1); // Hang in case of failure

        // 3. Configure MSI to 8MHz (MSIRANGE=0x7)
        MODIFY_REG(RCC->CR, RCC_CR_MSIRANGE, _VAL2FLD(RCC_CR_MSIRANGE, 0x7));
        // Wait for MSI range update to take effect
        timeout = TIMEOUT;
        while (!(READ_BIT(RCC->CR, RCC_CR_MSIRDY)) && --timeout);
        if (timeout == 0) while (1);

        // 4. Configure PLL: Enable PLLR, set correct parameters
        MODIFY_REG(RCC->PLLCFGR,
            RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR | RCC_PLLCFGR_PLLREN,
            RCC_PLLCFGR_PLLSRC_MSI | _VAL2FLD(RCC_PLLCFGR_PLLM, 1) |
            _VAL2FLD(RCC_PLLCFGR_PLLN, 24) | _VAL2FLD(RCC_PLLCFGR_PLLR, 2) | RCC_PLLCFGR_PLLREN
        );

        // 5. Enable PLL
        SET_BIT(RCC->CR, RCC_CR_PLLON);

        // 6. Wait for PLL Ready
        timeout = TIMEOUT;
        while (!(READ_BIT(RCC->CR, RCC_CR_PLLRDY)) && --timeout);
        if (timeout == 0) while (1); // Hang in case of failure

        // 7. Set AHB/APB prescalers BEFORE switching system clock
        MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_CFGR_HPRE_DIV1);
        // APB1 must be divided by 2 to keep clock <=60MHz (96/2=48MHz)
        MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_CFGR_PPRE1_DIV2); 
        MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, RCC_CFGR_PPRE2_DIV1); 

        // 8. Set PLL as system clock
        MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_PLL);

        // 9. Wait until PLL is used as system clock
        timeout = TIMEOUT;
        while ((READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) && --timeout);
        if(timeout == 0) while (1); // Hang in case of failure
}

关键修改点说明

  • 启用PLLREN:在PLLCFGR配置中添加RCC_PLLCFGR_PLLREN位,确保PLLR输出通道激活。
  • 提前设置总线分频:在切换系统时钟前就配置AHB/APB分频,其中APB1设为DIV2,使APB1时钟为48MHz(96/2),符合60MHz的上限要求。
  • 调整MSI配置顺序:先启用MSI,再修改频率范围,并再次等待MSIRDY置位,确保MSI时钟稳定在8MHz。

额外验证项

确认你的Flash latency设置确实匹配96MHz的系统时钟:

  • 当VDD在2.7V-3.6V时,STM32L4S5的Flash latency设置为4WS(LATENCY[3:0]=0100)对应支持最高100MHz的系统时钟,96MHz在此范围内,设置正确。

内容的提问来源于stack exchange,提问作者Chethan Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 10:10:04