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

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锁死的直接原因!

二、其他配置错误

  1. PLLSAI1SRC位位置错误
    你代码里用(0b10 << 0)试图设置PLL源为HSI,但这完全不对:

    • STM32L4的PLLSAI1SRC字段是RCC_PLLSAI1CFGR的位22-23,而位0-3是PLLSAI1M(分频系数M)
    • 幸运的是,PLLSAI1SRC默认值是00(对应HSI),所以这个错误暂时没雪上加霜,但写法不规范,应该用官方定义的宏。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:53:08