STM32F767ZI无法配置超过48MHz频率的问题求助
解决STM32 RCC配置54MHz时核心锁死问题
你的问题核心是高频时钟下未配置闪存等待周期(FLASH Latency),这是STM32调整时钟时的典型坑——当系统时钟超过芯片默认的FLASH访问速度阈值时,必须手动调整FLASH的等待周期,否则会触发总线访问错误,导致核心硬锁死,进而出现RTT无法连接的报错。
问题分析
以你的时钟配置为例:
假设外接HSE为8MHz,经PLLM=4分频后得到2MHz输入,PLLN=108倍频输出216MHz,再通过PLLP=4分频得到54MHz系统时钟。
对于多数STM32型号(如F1系列),系统时钟超过48MHz时,FLASH需要设置2个等待周期(2WS);而48MHz的配置刚好卡在1WS的阈值内,无需额外配置即可正常运行,但54MHz必须调整等待周期才能匹配闪存的访问速度。
解决方案
在切换系统时钟到PLL之前,先配置FLASH的等待周期,具体代码修改如下:
// 配置FLASH等待周期为2WS(需根据你使用的芯片手册确认具体值) flash.acr.modify(|_, w| w.latency().bits(2)); // 等待配置生效 while flash.acr.read().latency().bits() != 2 {} // 后续执行原有的PLL配置和系统时钟切换代码 rcc.cr.modify(|_, w| w.pllon().on()); while rcc.cr.read().pllrdy().is_not_ready() {} println!("Pll ready"); rcc.cfgr.modify(|_, w| w.sw().pll()); while !rcc.cfgr.read().sws().is_pll() {} println!("pll selected");
额外检查项
- 总线时钟合法性:确认APB1/APB2的时钟不超过芯片规格(比如多数STM32的APB1最大允许36MHz),你的54MHz系统时钟搭配APB1预分频DIV2后,APB1时钟为27MHz,符合要求,但要确保代码中确实正确设置了分频:
rcc.cfgr.modify(|_, w| w.ppre1().div2());
- PLL参数合规性:核对芯片手册中PLLM/PLLN/PLLP的取值范围,确保你的配置没有超出芯片硬件支持的范围。
内容的提问来源于stack exchange,提问作者Raul Alimbekov
相关产品推荐
相关产品推荐

