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

