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
相关产品推荐
相关产品推荐

