
手里这块 F101S3 开发板标称主频只有 300MHz 左右但我在把 PLL 配置和 PSRAM 时序重新调过之后硬是让它稳定跑在了 348MHz。这个数字听起来不算夸张但如果你清楚 PSRAM 这一类存储器在 MCU 里的地位就会知道这个频率意味着内存带宽直接往上抬了一截对跑 GUI 刷屏、做音频缓冲、甚至跑轻量级神经网络都有肉眼可见的收益。这篇文章就围绕 F101S3 这颗带 PSRAM 的 MCU 展开聊聊我为什么折腾超频、348MHz 这个频率是怎么算出来的、实际改哪些寄存器以及最关键的——超频之后稳定性怎么验证出问题了怎么排查。如果你手上也有类似的 PSRAM 方案或者正准备给自己的板子压榨点性能这篇内容可以帮你少走不少弯路。1. F101S3 与 PSRAM这套组合到底解决了什么问题1.1 F101S3 是一颗什么样的芯片F101S3 是面向低成本人机交互和边缘计算场景的一颗 MCU集成度比较高内核、Flash、PSRAM 全部封装在一颗芯片里适合做小尺寸的屏幕驱动板、智能家居面板、语音识别前端之类的产品。它最大的特点是内置了 PSRAM容量从几 MB 到十几 MB 不等跑 GUI 时可以把帧缓冲、图片资源、字库都丢进 PSRAM不用像传统 MCU 那样天天想着怎么省 Flash、怎么压缩显存。这颗芯片出厂默认频率通常是 300MHz 左右内部有独立的 PLL 可以给 CPU 和存储控制器提供不同频率。很多人拿到手就直接用默认配置但如果你愿意花点时间去调 PLL 分频和 PSRAM 时序把频率往上推到 348MHz 并不是什么玄学关键是要理解超频到底在超什么。需要特别说明的是F101S3 不是那种可以随便加电压狂飙的桌面 CPUMCU 的超频更多是在原有时钟树和时序参数里“抠”出余量。348MHz 这个值通常是外部晶振频率和 PLL 配置共同作用的结果不会超过芯片内部总线的承受范围太多。1.2 为什么 MCU 会集成 PSRAM而不是直接用 SRAM 或 DRAM这是很多人第一次接触 PSRAM 时的疑问既然要内存为什么不用 SRAMSRAM 速度快、接口简单但成本高、面积大一颗几百 KB 的 SRAM 就能吃掉不少芯片成本和功耗。DRAM 容量大、单位成本低但需要刷新、需要地址复用控制器复杂信号完整性要求也高对一颗讲究 BOM 成本的 MCU 来说并不友好。PSRAM 走的是中间路线存储单元本质上是 DRAM 结构所以单位容量成本比 SRAM 低很多但它内置了刷新逻辑对外接口做成类 SRAM 的并行接口不需要外部控制器去管刷新。对 MCU 来说挂一颗 PSRAM 就像挂一颗 SRAM 一样方便却能用更低成本获得大容量内存。F101S3 把 PSRAM 直接封装进芯片省去了外部走线和 PCB 布局的麻烦也让 CPU 可以通过内存映射方式直接访问 PSRAM而不需要走 SPI 之类的外设接口。这也是它能用来刷大尺寸屏幕、跑复杂 UI 的基础。2. PSRAM、DRAM、DDR、SRAM 到底有什么区别2.1 存储原理和成本曲线要搞懂 PSRAM 超频先得把这几种存储器的关系理清楚。很多人会把 DRAM 和 DDR 混为一谈实际上 DDR 只是 DRAM 的一种接口标准核心单元还是 DRAM只是数据传输方式改成了双沿采样。PSRAM 的核心单元同样是 DRAM区别在于它把刷新电路封装在了内部并且对外提供类似 SRAM 的接口协议。从成本角度看单位容量价格大致是 SRAM PSRAM DRAMDDR 因为接口复杂、控制器成本高实际上还需要额外的 PCB 走线和终端电阻所以系统级成本不一定比 PSRAM 低。MCU 选择 PSRAM就是想在成本和性能之间找一个平衡点。2.2 性能差异与应用场景从访问延迟来看SRAM 最快通常能做到几十纳秒级别适合做 CPU 的紧耦合内存PSRAM 次之但胜在容量大适合做帧缓冲、音频 Buffer、堆内存DRAM 和 DDR 在带宽上能做得很高但延迟和控制器复杂度都更高通常用在应用处理器或者需要大内存的场合。简单说F101S3 这种 MCU 用 PSRAM是因为它的工作集不需要 DDR 那么大但 SRAM 又装不下。比如跑一个 480x320 的 RGB 屏幕16 位色深光一帧缓冲就要 300KB 左右普通 MCU 的 SRAM 根本放不下用外部 SPI Flash 又太慢这时候 PSRAM 就成了最合理的选择。2.3 为什么 PSRAM 能超频它的极限在哪PSRAM 的存储单元虽然是 DRAM 结构但因为它内部有独立的刷新和时序控制逻辑实际能跑多快很大程度取决于外部接口时序和芯片内部 PLL 的输出质量而不是单纯受 DRAM 核心频率限制。这也是为什么 PSRAM 能被超频的原因之一出厂频率往往留有安全余量而余量就藏在时序参数里。超频 PSRAM 时真正需要关心的是读写周期时间、片选信号建立保持时间、写恢复时间这几个关键参数。频率一旦超过芯片内部电路能稳定工作的范围表现出来就是随机数据错误、偶发死机、刷屏花屏。所以超频不是简单改个 PLL 乘法系数就完事必须配合时序参数的调整和压力测试。3. 348MHz 超频的关键路径与参数计算3.1 超频的目标内核、总线还是 PSRAM 控制器开始动手之前必须先搞清楚一个概念348MHz 到底是指哪个频率。对 F101S3 这类芯片来说CPU 内核、系统总线、PSRAM 控制器可能共享一个 PLL也可能各有各的时钟域。常见做法是 PLL 输出一个基础频率然后通过分频器分别给 CPU 和 AHB/AXI 总线提供时钟。我这次超频的目标是让 PSRAM 控制器的工作频率尽量高同时保证 CPU 内核能在这个频率下稳定运行。因为 F101S3 的 PSRAM 是内存映射访问的控制器频率直接决定了内存带宽上限。如果把 CPU 超上去了但总线分频没跟上效果会大打折扣。在修改配置之前我建议你先读一下芯片参考手册里的时钟树章节找到 PLL 的输入源、倍频范围、输出通道以及 PSRAM 控制器在哪个总线域下面。这一步看不懂后面调参数就是瞎调。3.2 PLL 如何算出 348MHz我的板子上外部晶振是 24MHz默认配置下 PLL 输出 300MHz。348MHz 这个值并不是随便拍的而是 24MHz 经过倍频和分频得出的一个相对整齐的结果具体计算路径是外部晶振 24MHzPLL 倍频系数设置 29整数倍频模式PLL 后分频器设置为 2二分频最终输出24 × 29 / 2 348MHz当然不同芯片、不同 SDK 的 PLL 配置方式可能不太一样有些支持小数分频有些支持倍频链上有多个分频点。你只要记住一个原则算完之后务必要保证 PLL 输出频率在芯片数据手册规定的最大范围内同时给 PSRAM 控制器提供一个合理的整数分频不要让分频比太小导致时序余量不足。348MHz 这个频率下PSRAM 如果以 16 bit 位宽工作理论带宽大约是 348 × 2 696MB/s如果内部是 32 bit 位宽带宽就直接翻倍到 1.39GB/s。当然理论带宽不等于实际带宽但超频带来的提升是实打实的。3.3 与 PSRAM 时序相关的寄存器调整光把频率提上去是不够的PSRAM 控制器必须按 PSRAM 芯片的时序规格来配置读写时序。F101S3 的 SDK 里一般会有一组时序寄存器包括读写建立时间、读保持时间、写恢复时间、片选时序等频率提高后同样一个时钟周期对应的时间变短了所以原来按 300MHz 调的边界值可能需要放宽。我自己常用的调整思路是先把频率目标设好然后按 PSRAM 数据手册里的典型时序参数计算一个理论最小周期数加上一到两个时钟周期的余量作为初值然后开始跑压力测试再逐步收紧时序。如果测试报错就退回上一组参数。这里要强调一点修改时序参数后一定要重新初始化 PSRAM 控制器而不是热改寄存器。很多 MCU 的热改会导致总线状态错乱轻则数据异常重则直接死机。4. 实操从默认频率到 348MHz 的完整流程4.1 工具链与开发环境准备我用的开发环境是 VS Code GCC 交叉编译链配合厂商提供的 SDK。芯片调试接口是 SWD用 DAPLink 连接烧录和串口日志都走同一个 USB。超频前先确认三件事确认当前 SDK 版本能支持修改 PLL 配置准备一个烧录器的救砖方案比如按住 BOOT 键上电给串口日志留足输出缓冲方便观察启动信息。这里强烈建议先给原厂固件做一次完整备份。我之前折腾超频时有一次把 PSRAM 时序调得太激进芯片直接起不来。如果没有备份固件和恢复烧录流程就只能靠运气了。4.2 改 PLL 配置我的 SDK 里时钟初始化代码在system_clock.c文件里默认配置是一个结构体数组包含 PLL 输入源、倍频系数、分频系数。改成 348MHz 的配置大概长这样// system_clock.c 部分代码 static const pll_config_t pll_348mhz { .input_source CLK_SRC_XTAL_24M, .pll_mult 29, .pll_div 2, .cpu_div 1, .bus_div 1, .psram_div 1, }; void system_clock_init(void) { // 先切到内部 RC 时钟避免 PLL 切换过程中系统无时钟 clk_switch(CLK_SRC_RC_48M); pll_config(pll_348mhz); pll_start(); while (!pll_lock_status()) { // 等待 PLL 锁定 } clk_switch(CLK_SRC_PLL_348M); }注意pll_div和cpu_div这些参数要根据你的 SDK 实际字段来填这里只是示意。有一点非常关键切换时钟源之前一定先把中断和 DMA 暂停否则切换瞬间的时钟毛刺可能导致外设状态异常。改完代码后先不要急着跑业务逻辑用最简单的 GPIO 翻转程序验证系统时钟是否真的变成了 348MHz。用示波器或者逻辑分析仪测 GPIO 翻转频率比直接看打印日志可靠得多。4.3 时序与电压调整PLL 配置通过后业务逻辑跑在 PSRAM 里可能出现随机死机。我遇到的情况是刷屏偶尔花屏频率大概几分钟一次。这时候就需要去调 PSRAM 控制器时序了。SDK 中 PSRAM 初始化代码一般在psram_init.c里面有类似下面的时序配置结构体psram_timing_t timing { .read_latency 7, .write_recovery 3, .cs_setup 2, .cs_hold 2, .turnaround 2, };在 300MHz 频率下这套时序可能没问题但频率升到 348MHz同样的周期数对应的时间变短了读延迟可能不够就会出现偶发数据错乱。我最终调定的参数是read_latency 8write_recovery 3其他不变。如果芯片允许调整 PSRAM 供电电压适当升压可以增加时序余量但 MCU 集成方案一般没有独立 PSRAM 电源所以这一项通常做不了。不要为了超频去乱改核心电压MCU 不是桌面 CPU耐压余量很小搞不好就永久损坏。4.4 带宽与稳定性验证时序调完不等于结束必须跑压力测试。我一般跑三类测试第一类是内存读写自检类似 PC 上的 memtest。在 PSRAM 里分配一块大缓冲写固定 pattern 再读回比对覆盖全地址空间。我写了一个简单的测试循环用伪随机数填充和校验持续跑半小时以上。第二类是应用负载测试。对 F101S3 来说最典型的就是 GUI 刷屏测试连续刷新全屏图片、滚动文字、播放简单动画同时观察有没有花屏、撕裂、卡顿。第三类是 CPU 高负载下的稳定性测试让 CPU 持续做浮点运算或加密哈希运算同时频繁访问 PSRAM。这个测试能暴露总线仲裁和时序余量不足的问题。我实际测试下来348MHz 频率下如果只调 PLL 不调时序平均每 3~5 分钟就会出一个内存校验错误加上时序放宽之后连续跑 12 小时内存测试和 GUI 压测都稳定通过。如果你测出来还是不稳定建议优先看散热和供电纹波超频对电源质量非常敏感。5. 常见问题与排查技巧实录5.1 超频后系统起不来怎么办这是最常遇到的问题也是最容易让人心跳加速的问题。改完 PLL 后代码烧进去板上电后串口毫无输出调试器也连不上。大概率是 PLL 配置到了芯片不支持的频率或者 PSRAM 初始化时序太紧导致内部异常。我的处理步骤是先按住 BOOT 键上电进入系统引导模式重新烧录一份恢复固件然后用最小化代码验证问题只保留时钟初始化和串口日志把 PSRAM 初始化去掉最后逐步加回 PSRAM 配置定位是 PLL 的问题还是时序的问题。这里要提醒一句进 BOOT 模式烧录时如果芯片代码从 PSRAM 启动而 PSRAM 初始化在 boot ROM 里也有配置那你修改的程序可能根本没有生效。这时候要检查工程里的链接脚本和启动文件确认是从 Flash 还是从 PSRAM 运行。5.2 卸载 uxtu 后仍在超频问题出在哪我在调试超频方案的时候用过一个叫 uxtu 的辅助工具它可以在运行时动态修改时钟配置省去反复编译烧录的折腾。但后来我发现一个有意思的现象即使我把 uxtu 卸载了系统开机后依然运行在 348MHz。这说明超频配置并不只存在于 uxtu 这个工具里而是被写入了启动链路的某个持久化位置。常见的有三种可能第一uxtu 在超频时把配置写到了 Flash 的配置分区或 OTP 区域第二系统的 bootloader比如 U-Boot 或厂商引导程序读取了环境变量或设备树里的频率参数第三应用固件本身的启动代码里就写死了超频逻辑和 uxtu 无关。排查思路是从启动顺序往上捋先看 bootloader 日志里的 PLL 输出值再检查设备树或环境变量里有没有clock-frequency之类的字段。F101S3 这类嵌入式平台的超频“卸载工具但频率没变”是非常典型的现象核心原因是时钟配置的存储位置不在应用层而在引导层。5.3 稳定性问题定位是内核频率过高还是 PSRAM 时序太紧如果系统能启动但跑一段时间就挂定位起来比直接起不来更头疼。我整理了一个简单的排查表格现象可能原因处理方向随机死机无规律CPU 内核频率过高或供电不足降低 CPU 频率检查电源纹波刷屏花屏、颜色错乱PSRAM 读时序偏紧增大 read_latency写入数据后读回错误PSRAM 写恢复时间不足增大 write_recovery高频段偶发错误低频正常信号完整性问题检查 PCB 走线调整 IO 驱动强度温度升高后开始宕机超频余量太小温度漂移增加时序余量改善散热这类问题的排查技巧是“一次只改一个变量”。我见过太多人想一次把所有参数调到最优结果出了问题根本不知道是哪一步引起的。正确做法是保持其他参数不变每次只调整一个参数然后用压力测试验证记录稳定和不稳定的边界值。6. 写在最后关于超频的一点个人体会F101S3 超到 348MHz 这件事技术难度其实不高真正考验人的是稳定性的把握。超频能带来实打实的性能提升但这个提升是建立在对时钟树、存储时序、电源质量的深入理解之上的。如果你只是照着别人帖子改几个数字而不去理解背后的计算和原理一旦换个板子、换个批次的芯片可能就会翻车。我在调完这波超频之后最大的收获不是那 48MHz 的提升而是搞明白了 PSRAM 这种存储器在 MCU 体系里的位置理解了 PLL 和时序参数如何共同决定一颗芯片的实际性能边界。这种理解比单纯跑高分有意义得多。如果你也想折腾建议从微调时序开始逐步尝试每次改完都认真跑一轮压力测试把稳定边界记下来。这样既安全又能真正提升对芯片底层机制的理解。