本帖最后由 创天蓝 于 2026-10-9 19:47 编辑
STM32L496 低功耗时钟树怎么选?19 组实测告诉你一句话结论:用内部 RC 时钟,CPU密集任务频率开高,干完就睡;IO密集任务降低主频,保持时钟域精简,减少外设时钟常开开销。
测试方法程序是一个典型的周期性任务,RTC 定时唤醒,干一段固定计算量的活,然后回到 Stop 模式:
LSE 32.768kHz 全程运行,19 组测试只改变唤醒后的系统时钟来源和频率。LED 在波形上打标记,用来切分唤醒段和工作段。
低功耗分析仪上一轮完整的波形长这样:平时趴在 2.3uA,唤醒后电流抬起来,干完活掉回去。
对比最费的那组,形状一样,但"台子"明显更高:
发现 1:固定计算量的 CPU 密集任务,主频越高总能耗越低直觉上频率高电流大,应该更费电。实测正好相反:
原因是能耗 = 电流 × 时间。计算量固定时,频率翻倍,耗时减半,但电流涨不到两倍,因为芯片有一块和频率无关的底电流(稳压器、Flash、外设)。频率越高,这块底电流"计时"越短。画成面积一眼就明白:
MSI 32MHz 的工作段实测:5.33mA 跑 1.67s。
这就是低功耗设计常说的 Race to Sleep:快点干完,快点睡觉。
有一个例外:HSI→PLL 32M(2.63uAh)只比 HSI 16M 直出(2.65uAh)省一点点,PLL 自身的电流基本抵掉了升频的收益。HSI 要拉到 64M 才明显占优。
发现 2:同样的频率,时钟来源差很多HCLK 都是 8MHz,CPU 干活一样快,能耗却能差到 2.4 倍:
两个坑:
- HSE 比 MSI 贵。 同样 8MHz 直出,HSE 工作电流 1.97mA,MSI 只要 1.41mA,晶振驱动电路本身就要耗电。
- HSI 介于两者之间。 同频下 HSI 每个点都比 MSI 费电(8MHz 多 26%,32MHz 多 6.5%),但都比 HSE 省。
- 先倍频再分频最浪费。 PLL 64M÷8 要 3.31mA,比 HSE 直出多 68%。分频只降了 CPU 频率,PLL 自己仍在 64MHz 下运行。需要多少频率,就让 PLL 直接输出多少。
发现 3:唤醒速度 MSI 最快,但对本程序影响不大MSI 和 HSI 都是内部 RC,唤醒后很快可用;HSE 要等晶振起振,PLL 要等锁定。MSI 直出最快(100~320us),HSI 次之(370~730us),HSE 相关的配置都在 1.2ms 以上:
放到分析仪上看差别很直观。MSI 32MHz 唤醒只要 100us:
HSE→PLL 64M÷8 要 4.1ms,中间一大段在等时钟稳定:
不过唤醒能耗只有 0.1~1.4nAh,工作段是 2.46uAh 起,差了三个数量级。只有工作任务很短(毫秒级)时,唤醒速度才值得优化。
发现 4:休眠电流和主时钟无关19 组全部是 2.3uA。进入 Stop 后高速时钟全关,只剩 LSE 和 RTC,主时钟怎么配都不影响睡眠。
选型建议1. 首选 MSI。 不用外部晶振,唤醒快、电流低。开启 LSE 后打开 MSIPLLEN,MSI 会被 LSE 自动校准,UART 等外设够用。MSI 32MHz 直出和最优值只差 0.4%,不用 PLL,工作峰值电流 5.33mA,只有 HSI→PLL 64M(10.59mA)的一半,对纽扣电池这类内阻大的电源更友好。
2. 在允许范围内把 HCLK 拉高,让任务尽快做完再睡。需要 64MHz 算力时,用 HSI→PLL 比 HSE→PLL 更省(2.46 vs 2.57uAh)。
3. 确实需要高精度时钟才用 HSE,并让 PLL 直接输出目标频率,不要"高配低用"。
4. 还能更省: HCLK ≤ 26MHz 时可把内核电压切到 Range 2(本次未测)。
5. 任务类型决定频率策略。 本文 19 组都是固定计算量的 CPU 密集任务,高主频省电的前提是 CPU 一直在算。IO 密集型任务的时间花在等外设上,升主频缩短不了这段等待,工作段电流照旧在涨。这类任务值得临时把主频切到外设速率附近,本文没有这组实测数据,需要按任务类型自己拉一张"任务类型 × 时钟组合"的能耗表,逐类找到最优组合再固定下来。
附录:完整实测数据| 组合 | HCLK | 休眠电流 | 唤醒电流 | 唤醒耗时 | 唤醒能耗 | 工作电流 | 工作耗时 | 工作能耗 | | MSI 8MHz | 8MHz | 2.3uA | 1.71mA | 320us | 151pAh | 1.41mA | 6622ms | 2.62uAh | | MSI 16MHz | 16MHz | 2.3uA | 3.08mA | 170us | 145pAh | 2.74mA | 3316ms | 2.52uAh | | MSI 32MHz | 32MHz | 2.3uA | 5.18mA | 100us | 143pAh | 5.33mA | 1671ms | 2.47uAh | | MSI 4M → PLL 32M ÷4 | 8MHz | 2.3uA | 509.86uA | 1990us | 281pAh | 2.06mA | 6704ms | 3.84uAh | | MSI 4M → PLL 32M ÷2 | 16MHz | 2.3uA | 725.38uA | 1020us | 205pAh | 3.23mA | 3351ms | 3.01uAh | | MSI 4M → PLL 32M ÷1 | 32MHz | 2.3uA | 1.11mA | 550us | 170pAh | 5.33mA | 1658ms | 2.46uAh | | HSE 8MHz 直出 | 8MHz | 2.3uA | 3.11mA | 1210us | 1.11nAh | 1.97mA | 6768ms | 3.70uAh | | HSE 8M → PLL 8M ÷1 | 8MHz | 2.3uA | 3.31mA | 1270us | 1.17nAh | 2.16mA | 6753ms | 4.05uAh | | HSE 8M → PLL 16M ÷1 | 16MHz | 2.3uA | 3.31mA | 1230us | 1.13nAh | 3.43mA | 3366ms | 3.21uAh | | HSE 8M → PLL 32M ÷1 | 32MHz | 2.3uA | 3.29mA | 1240us | 1.13nAh | 5.94mA | 1665ms | 2.75uAh | | HSE 8M → PLL 32M ÷4 | 8MHz | 2.3uA | 1.95mA | 2260us | 1.22nAh | 2.62mA | 6766ms | 4.93uAh | | HSE 8M → PLL 64M ÷8 | 8MHz | 2.3uA | 1.20mA | 4100us | 1.37nAh | 3.31mA | 6762ms | 6.22uAh | | HSE 8M → PLL 64M ÷4 | 16MHz | 2.3uA | 1.91mA | 2190us | 1.16nAh | 4.49mA | 3354ms | 4.19uAh | | HSE 8M → PLL 64M ÷2 | 32MHz | 2.3uA | 2.56mA | 1520us | 1.08nAh | 6.85mA | 1670ms | 3.18uAh | | HSE 8M → PLL 64M ÷1 | 64MHz | 2.3uA | 3.18mA | 1250us | 1.10nAh | 11.11mA | 831ms | 2.57uAh | | HSI 16M ÷2 | 8MHz | 2.3uA | 898uA | 730us | 182.2pAh | 1.78mA | 6701ms | 3.31uAh | | HSI 16MHz 直出 | 16MHz | 2.3uA | 1.11mA | 370us | 114.3pAh | 2.85mA | 3358ms | 2.65uAh | | HSI 16M → PLL 32M ÷1 | 32MHz | 2.3uA | 1.22mA | 410us | 139.4pAh | 5.66mA | 1674ms | 2.63uAh | | HSI 16M → PLL 64M ÷1 | 64MHz | 2.3uA | 952uA | 460us | 121.7pAh | 10.59mA | 837ms | 2.46uAh |
前三名相差约 0.4%,每组只测了一次,可能在测量误差以内,可视为打平。
|