Nano100 的功耗数据在规格书里写得很清楚,掉电模式保持 RAM 只要 1μA,RTC 开着 2.5μA,运行功耗 200μA/MHz。但实际项目里,很多人把芯片焊上去一测,待机电流跑到几十微安甚至上百微安,跟规格书差了一个数量级。问题不在芯片,在外围电路和 GPIO 状态没管好。
先搞清楚电流从哪漏掉的
Nano100 进入掉电模式后,CPU 停了,RAM 保持住了,但GPIO 的状态是保持不变的。如果某个引脚在掉电前输出高电平,外面又接了一个对地电阻,那这个引脚就会持续输出电流。一个引脚漏 100μA,十个引脚就是 1mA,电池几天就耗光了。
排查方法是进入掉电模式前,把所有没用到的引脚配成准双向模式并输出高电平,或者配成输入模式并上拉。新唐的 BSP 里可以这样批量处理:
c
// 进入掉电模式前,配置所有未使用引脚
void GPIO_PowerDownConfig(void)
{
// 以 PA 口为例,未使用的引脚设为输入上拉
PA->MODE = 0x00000000; // 全部设为输入模式
PA->PULLUP = 0xFFFFFFFF; // 全部使能上拉
// 已使用但输出高电平的引脚,检查外部电路
// 如果有对地负载,改成输出低电平
}
已使用的引脚也要逐个检查。比如 LED 控制引脚,如果外部是“引脚输出高电平点亮 LED,LED 另一端接地”,那掉电前必须把引脚拉低,否则 LED 一直微亮,电流全耗在这。
时钟源的选择直接影响功耗
Nano100 的运行功耗和时钟频率成正比。200μA/MHz 意味着跑 42MHz 时运行电流约 8.4mA,跑 12MHz 时只有 2.4mA。如果任务不重,降频运行比全速跑再频繁休眠更省电。
但降频有个下限。Nano100 的 HIRC 可以配到 4MHz 以下,但 UART 波特率会受影响。如果要用 115200 波特率,系统时钟至少得 12MHz 以上才能保证分频精度。折中方案是用 HIRC 12MHz 作为主时钟,需要高速处理时切到 PLL 升频,处理完再切回来。
c
// 动态切换时钟频率
void CLK_SetLowSpeed(void)
{
// 切到 HIRC 12MHz
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV0_HCLK(1));
}
void CLK_SetHighSpeed(void)
{
// 切到 PLL 42MHz
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV0_HCLK(1));
}
任务间隙把频率降下来,需要算力时再升上去,平均功耗比一直跑高频低不少。
外设时钟要随手关
Nano100 的每个外设都有独立的时钟门控,不用的时候关掉能省电。很多人初始化时把所有外设时钟都开了,后面只用其中几个,没用的那些一直在耗电。
c
// 只使能需要的外设时钟
CLK_EnableModuleClock(UART0_MODULE);
CLK_EnableModuleClock(TIMER0_MODULE);
CLK_EnableModuleClock(ADC_MODULE);
// 不用的外设时钟不要开,比如:
// CLK_EnableModuleClock(SPI0_MODULE); // 没用到 SPI 就别开
ADC 是耗电大户,采样完成后及时关掉。UART 如果只是偶尔发数据,发完也可以关掉时钟,需要时再开。
掉电模式的实际配置
Nano100 的低功耗模式分几种,选对了才能达到预期电流。空闲模式只是停 CPU,外设还在跑,电流在毫安级。掉电模式停掉大部分时钟,只留 LIRC 或 LXT 给 RTC 和唤醒逻辑用,电流才能降到微安级。
c
void Enter_PowerDown(void)
{
// 配置唤醒源,比如 RTC 定时唤醒
RTC_EnableInt(RTC_INT_TICK_Msk);
// 关闭不需要的外设时钟
CLK_DisableModuleClock(ADC_MODULE);
// 配置 GPIO 状态
GPIO_PowerDownConfig();
// 进入掉电模式
CLK_PowerDown();
// 唤醒后从这里继续执行,先恢复系统时钟
SYS_Init();
}
唤醒后第一件事是恢复系统时钟,掉电模式下 HIRC 停了,直接跑代码会出问题。SYS_Init() 里重新配置 PLL 和时钟分频。
电池寿命估算
假设用一颗 1000mAh 的锂电池,设备每 10 秒唤醒一次,每次醒着工作 50ms,工作电流 5mA,其余时间掉电待机 2μA。
醒着的时间占比是 50ms / 10s = 0.5%,平均工作电流 5mA × 0.005 = 25μA。加上待机电流 2μA,总平均电流约 27μA。1000mAh 除以 27μA,理论续航约 42000 小时,接近 4.8 年。
但这是理想值。实际还要算上 LDO 的静态电流、传感器的待机功耗、电池自放电。LDO 选静态电流 1μA 以下的型号,传感器不用时彻底断电,这些细节加起来可能让实际续航打对折。所以规格书上的 μA 级数字是起点,不是终点。 |
|