ST意法半导体
直播中

百合子

9年用户 984经验值
擅长:控制/MCU
私信 关注
[问答]

stm32h7s78 rcc pll2时钟使能失败的原因?

使用的板卡是 STM32h7s78-dk,启动流程是 boot + flash app 的方式,boot 参考的 xip 示例,xip 时钟绑定在 hclk 上。
问题

在 app 代码中,初始化调用了 systemclock update 函数,然后对 sdmmc 进行了初始化,看到在使能 sdmmc 时钟时, pll2 相应的时钟输出位没有被成功置 1,但同样设置 ltdc 时钟没用问题。

PLL2 的时钟使能是有什么特殊的方法吗?或者说 XIP 对 PLL2 时钟源有操作?

回帖(2)

王博

2025-3-15 17:38:13
你确认下SDMMC12SEL位,到底选择哪一路作为SMMMC外设时钟。
举报

陈伟

2025-3-21 17:54:55

在STM32H7系列中,PLL2的时钟使能失败可能涉及多个因素。以下是可能的原因及解决方案:




1. XIP模式下的时钟继承问题




  • 问题描述

    如果Bootloader配置了XIP(eXecute In Place)模式,且HCLK绑定在某个时钟源(如PLL1),可能导致应用程序初始化时无法直接修改PLL2的配置。某些时钟资源可能已被Bootloader锁定。




  • 解决方法:  



    • 在应用程序中复位RCC外设(通过__HAL_RCC_DEINIT()),重新初始化时钟树。  

    • 确保Bootloader在跳转到App前释放对RCC的写保护(如解锁RCC寄存器,清除FLASH锁定位)。






2. PLL2的配置顺序错误




  • 关键点

    PLL2的配置必须遵循严格的顺序:选择时钟源 → 配置分频/倍频 → 使能PLL → 等待锁定 → 使能分频输出




  • 验证步骤:  



    1. 检查RCC_PLLCKSELR是否选择正确的PLL2时钟源(如HSE或HSI)。  

    2. 配置RCC_PLL2DIVR的分频参数(DIVM2, DIVN2, DIVP2等),确保输入/输出频率在允许范围内。  

    3. RCC_CR寄存器中置位PLL2ON并等待PLL2RDY标志置位。  

    4. 启用PLL2的分频输出(如RCC_PLL2DIVR中的DIVP2ENDIVQ2EN等)。






3. 时钟安全机制冲突




  • 可能性:  



    • 如果启用了时钟安全系统(CSS),错误的时钟切换可能导致复位。  

    • XIP模式下HCLK的稳定性要求可能限制PLL2的动态配置。




  • 解决方法:  



    • 暂时禁用CSS(__HAL_RCC_CSS_DISABLE()),测试PLL2是否能正常使能。  

    • 确保在配置PLL2时,HCLK的时钟源保持稳定(如使用HSI作为临时系统时钟)。






4. 外设时钟门控冲突




  • 问题现象

    SDMMC的时钟使能失败,但LTDC正常。可能由于SDMMC的时钟源(如PLL2_P)未正确配置。




  • 检查点:  



    • 确认RCC_DCCIPR寄存器中,SDMMC的时钟源(SDMMCSEL)已设置为PLL2的输出(如0x2对应PLL2_P)。  

    • 检查RCC_APB4ENRSDMMCEN位是否置位,使能SDMMC外设时钟。






5. 电源配置问题




  • 关键点

    STM32H7的时钟配置依赖电源模式(VOS)。如果VOS级别不足,PLL2可能无法运行在高频。




  • 解决方法

    在初始化时钟前,设置合适的VOS等级(如VOS0支持最高频率):  


    HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0);





6. 硬件连接与固件库兼容性




  • 可能性:  



    • 开发板上的外部晶振(HSE)未正确焊接或频率不匹配。  

    • 使用的HAL/LL库版本存在已知Bug。




  • 验证方法:  



    • 检查HSE是否正常起振(通过RCC_CR中的HSERDY标志)。  

    • 参考ST官方例程(如STM32H7S78-DK的XIP或SDMMC示例),对比配置差异。






调试建议




  1. 寄存器级检查

    使用调试器查看以下寄存器值:  



    • RCC_CR(确认PLL2ONPLL2RDY状态)  

    • RCC_PLL2DIVR(分频参数是否合理)  

    • RCC_DCCIPR(SDMMC时钟源选择)  




  2. 最小化测试

    注释掉SDMMC初始化代码,单独测试PLL2的使能流程,确认问题是否由外设配置引发。




  3. 参考官方代码

    对比ST提供的SystemClock_Config()函数(如HSE→PLL2→SDMMC路径),确保参数一致。






通过以上步骤,应能定位PLL2使能失败的根本原因。建议优先检查Bootloader与App之间的时钟继承关系及寄存器配置冲突。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分