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

STM32G474RE配置RCC PLL时钟失败:PLLRDY标志始终未置位

STM32G474RE PLL配置问题排查与修复

问题分析

你的代码存在几个关键错误,导致PLL无法进入就绪状态:

  • PLL时钟源选择错误:目标是用HSI16作为PLL源,但代码中RCC->PLLCFGR |= (0x02 & RCC_PLLCFGR_PLLSRC_Msk)选择的是CSI时钟(PLLSRC位为10),而非HSI16(PLLSRC位为00)。
  • APB2分频配置错误:要求APB2为4分频,但代码中0x05 & RCC_CFGR_PPRE2_Msk对应8分频(PPRE2位为101),正确的4分频配置值应为0x04。
  • 系统时钟切换位错误:切换到PLLR作为系统时钟时,RCC->CFGR |= (0x05 & RCC_CFGR_SW_Msk)错误设置了SW位(仅低两位有效),正确的切换值应为0x03,且建议先清零原有SW位再设置。
  • 潜在风险:修改PLL配置前未显式关闭PLL,虽然默认上电PLL处于关闭状态,但显式关闭能避免异常场景下的配置失败。

修复后的代码

#include "main.h"

void SystemClockConfig(void){
    /* Enable HSI16 */
    RCC->CR |= RCC_CR_HSION;
    while(!(RCC->CR & RCC_CR_HSIRDY)){}
    
    /* Configure PWR and FLASH */
    RCC->APB1ENR1 |= RCC_APB1ENR1_PWREN;
    PWR->CR1 |= (0x01 & PWR_CR1_VOS_Msk); // 设置电压缩放等级为VOS1
    FLASH->ACR |= FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_2WS | FLASH_ACR_PRFTEN;
        
    /* Configure AHB and APB prescalers */
    RCC->CFGR &= ~RCC_CFGR_HPRE_Msk; // 清零AHB预分频位,设置为1分频
    RCC->CFGR &= ~RCC_CFGR_PPRE1_Msk; // 清零APB1预分频位,设置为1分频
    RCC->CFGR &= ~RCC_CFGR_PPRE2_Msk; // 清零APB2预分频位
    RCC->CFGR |= 0x04 << RCC_CFGR_PPRE2_Pos; // APB2 4分频
        
    /* Configure PLL: 先关闭PLL再修改配置 */
    RCC->CR &= ~RCC_CR_PLLON;
    while(RCC->CR & RCC_CR_PLLRDY){} // 等待PLL完全关闭
    
    RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLSRC_Msk; // 选择HSI16作为PLL源
    RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLM_Msk; // PLLM=1(000对应分频因子1)
    RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLN_Msk;
    RCC->PLLCFGR |= 10 << RCC_PLLCFGR_PLLN_Pos; // PLLN=10
    RCC->PLLCFGR |= RCC_PLLCFGR_PLLREN; // 使能PLLR输出
    RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLR_Msk; // PLLR=2(默认00对应分频因子2)
        
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;
    while(!(RCC->CR & RCC_CR_PLLRDY)){}
        
    /* Switch system clock to PLLR */
    RCC->CFGR &= ~RCC_CFGR_SW_Msk;
    RCC->CFGR |= RCC_CFGR_SW_PLL; // SW[1:0] = 11,选择PLLR作为系统时钟
    while((RCC->CFGR & RCC_CFGR_SWS_Msk) != RCC_CFGR_SWS_PLL){}
} 

int main(void){
    SystemClockConfig();
    
    // 后续业务代码
}

额外说明

修复后的配置最终系统时钟为:HSI16(16MHz) / PLLM(1) * PLLN(10) / PLLR(2) = 80MHz,符合STM32G474在VOS1电压等级下的时钟限制。所有寄存器位操作均采用先清零再设置的方式,避免原有位值干扰配置结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:40:32