STM32L476RG硬件RNG配置中PLLSAI1无法锁定的问题求助
STM32L476RG硬件RNG配置中PLLSAI1无法锁定的问题求助
看起来你遇到的PLLSAI1无法锁定的问题,根源在于VCO工作频率超出了STM32L4允许的范围,同时代码里还有几处寄存器位配置的细节错误,我来帮你逐一梳理:
一、核心问题:VCO频率低于最低阈值
STM32L4系列的PLLSAI1 VCO(压控振荡器)有严格的工作频率范围:
- 当
PLLSAI1VCOSEL位(RCC_PLLSAI1CFGR的位24,默认值0)为0时,VCO必须工作在192MHz - 432MHz之间 - 如果VCO输出低于192MHz,PLL无法完成相位锁定,导致
PLLSAI1RDY位永远不会置1
你当前的配置计算:
- HSI=16MHz,代码里
PLLSAI1M设为2(通过0b10 << 0),所以PLL输入频率PLLin = 16MHz / 2 = 8MHz PLLSAI1N=12,所以VCO输出频率VCOout = 8MHz *12 =96MHz,远低于192MHz的最低要求,这就是PLL锁死的直接原因!
二、其他配置错误
PLLSAI1SRC位位置错误
你代码里用(0b10 << 0)试图设置PLL源为HSI,但这完全不对:- STM32L4的
PLLSAI1SRC字段是RCC_PLLSAI1CFGR的位22-23,而位0-3是PLLSAI1M(分频系数M) - 幸运的是,
PLLSAI1SRC默认值是00(对应HSI),所以这个错误暂时没雪上加霜,但写法不规范,应该用官方定义的宏。
- STM32L4的
PLLSAI1Q分频系数逻辑错误
你需要CLK48输出为48MHz,当前配置PLLSAI1Q=0b00对应分频系数Q=2,即使PLL锁定,PLLSAI1Q输出会是96MHz/2=48MHz,但因为VCO频率不达标,PLL根本无法锁定。正确的参数应该先保证VCO在有效范围内,再反向推导Q值。
三、修正后的完整配置代码
volatile uint32_t random_number; int main(void) { // 1. 使能HSI并等待稳定 RCC->CR |= RCC_CR_HSION; while (!(RCC->CR & RCC_CR_HSIRDY)); // 2. 关闭PLLSAI1并等待就绪位清零 RCC->CR &= ~RCC_CR_PLLSAI1ON; while (RCC->CR & RCC_CR_PLLSAI1RDY); // 3. 配置PLLSAI1参数: // - PLL源=HSI (PLLSAI1SRC=00) // - M=1 (PLLin=16MHz/1=16MHz,符合1-16MHz输入要求) // - N=12 (VCOout=16*12=192MHz,刚好达到最低VCO阈值) // - Q=4 (Q_bits=01,分频后输出192/4=48MHz,满足CLK48需求) // - 使能Q输出 RCC->PLLSAI1CFGR = (1U << RCC_PLLSAI1CFGR_PLLSAI1M_Pos) | // M=1 (12U << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) | // N=12 (0b01 << RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) |// Q=4 RCC_PLLSAI1CFGR_PLLSAI1QEN | // 使能Q输出 (0b00 << RCC_PLLSAI1CFGR_PLLSAI1SRC_Pos); // 源=HSI // 4. 使能PLLSAI1并等待锁定 RCC->CR |= RCC_CR_PLLSAI1ON; while (!(RCC->CR & RCC_CR_PLLSAI1RDY)); // 现在应该能正常通过 // 5. 将CLK48(RNG时钟)源设置为PLLSAI1Q RCC->CCIPR &= ~RCC_CCIPR_CLK48SEL_Msk; RCC->CCIPR |= (0b10 << RCC_CCIPR_CLK48SEL_Pos); // CLK48 = PLLSAI1Q // 6. 使能RNG并启动 RCC->AHB2ENR |= RCC_AHB2ENR_RNGEN; RNG->CR |= RNG_CR_RNGEN; while (1) { // 检查RNG时钟错误 if (RNG->SR & RNG_SR_CEIS) { RNG->CR &= ~RNG_CR_RNGEN; RNG->CR |= RNG_CR_RNGEN; } // 读取随机数 if (RNG->SR & RNG_SR_DRDY) { random_number = RNG->DR; } } }
四、关键参数验证
修正后的参数计算:
- HSI=16MHz → M=1 → PLLin=16MHz
- N=12 → VCOout=16*12=192MHz(符合192-432MHz范围)
- Q=4 → PLLSAI1Q输出=192/4=48MHz(正好是CLK48需要的频率)
五、额外注意事项
- 确保你的调试器没有干扰时钟配置(比如不要在调试时手动修改RCC寄存器)
- 可以在调试时查看
RCC->PLLSAI1CFGR的实际值,确认所有位都配置正确 - 如果还是有问题,可以检查HSI的实际频率是否正常(比如读取
RCC->CR的HSIRDY位确实置1)
内容来源于stack exchange
相关产品推荐
相关产品推荐

