STM32L496 低功耗时钟树怎么选?19 组实测告诉你

一句话结论:用内部 RC 时钟,CPU密集任务频率开高,干完就睡;IO密集任务降低主频,保持时钟域精简,减少外设时钟常开开销。

能耗排行

测试方法

程序是一个典型的周期性任务,RTC 定时唤醒,干一段固定计算量的活,然后回到 Stop 模式:

流程示意

LSE 32.768kHz 全程运行,19 组测试只改变唤醒后的系统时钟来源和频率。LED 在波形上打标记,用来切分唤醒段和工作段。

低功耗分析仪上一轮完整的波形长这样:平时趴在 2.3uA,唤醒后电流抬起来,干完活掉回去。

MSI 8MHz 整轮波形

对比最费的那组,形状一样,但"台子"明显更高:

HSE PLL64M÷8 整轮波形

发现 1:固定计算量的 CPU 密集任务,主频越高总能耗越低

直觉上频率高电流大,应该更费电。实测正好相反:

频率与能耗

原因是能耗 = 电流 × 时间。计算量固定时,频率翻倍,耗时减半,但电流涨不到两倍,因为芯片有一块和频率无关的底电流(稳压器、Flash、外设)。频率越高,这块底电流"计时"越短。画成面积一眼就明白:

面积对比

MSI 32MHz 的工作段实测:5.33mA 跑 1.67s。

MSI 32MHz 工作段

这就是低功耗设计常说的 Race to Sleep:快点干完,快点睡觉。

有一个例外:HSI→PLL 32M(2.63uAh)只比 HSI 16M 直出(2.65uAh)省一点点,PLL 自身的电流基本抵掉了升频的收益。HSI 要拉到 64M 才明显占优。

发现 2:同样的频率,时钟来源差很多

HCLK 都是 8MHz,CPU 干活一样快,能耗却能差到 2.4 倍:

同频对比

两个坑:

发现 3:唤醒速度 MSI 最快,但对本程序影响不大

MSI 和 HSI 都是内部 RC,唤醒后很快可用;HSE 要等晶振起振,PLL 要等锁定。MSI 直出最快(100320us),HSI 次之(370730us),HSE 相关的配置都在 1.2ms 以上:

唤醒耗时

放到分析仪上看差别很直观。MSI 32MHz 唤醒只要 100us:

MSI 32MHz 唤醒

HSE→PLL 64M÷8 要 4.1ms,中间一大段在等时钟稳定:

HSE PLL64M÷8 唤醒

不过唤醒能耗只有 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%,每组只测了一次,可能在测量误差以内,可视为打平。