STM32 IAP跳转后APP卡死?深入解析HAL_RCC_OscConfig时钟配置冲突
最近在调试STM32的IAP+APP双程序架构时,遇到了一个棘手的问题:从Bootloader跳转到应用程序后,程序在HAL_RCC_OscConfig函数中卡死或返回错误。这个问题看似简单,实则涉及STM32时钟系统的底层机制。本文将带你深入理解这个"二次初始化陷阱",并提供一套完整的解决方案。
1. 问题现象与根源分析
当你在IAP程序中成功初始化了PLL,然后跳转到APP程序再次尝试初始化PLL时,系统可能会卡死在HAL_RCC_OscConfig函数中。这种现象在STM32F4系列上尤为常见,但在F1系列上可能表现不同。
关键问题根源在于STM32参考手册中的这段描述:
"PLL can be configured only when it is disabled. Once the PLL is enabled, its parameters cannot be changed. To modify the PLL configuration, first disable the PLL, then wait for PLLRDY to be cleared before configuring it again."
简单来说,PLL一旦启用,其配置就被锁定,除非先禁用它。这就是为什么在IAP中已经初始化PLL后,APP中再次初始化会失败。
2. 官方解决方案解析
ST官方HAL库中其实已经考虑到了这种情况,他们的解决思路可以概括为:
- 先将时钟源切换为内部时钟(HSI)
- 初始化锁相环(PLL)
- 将时钟源切换回外部时钟源(HSE)
- 禁用不再使用的内部高速时钟(HSI)
这种方法的巧妙之处在于通过临时切换到HSI,为PLL的重新配置创造了条件。下面我们详细解析每个步
466




被折叠的 条评论
为什么被折叠?



