低功耗

文档指引


FAQ1 板子关机功耗怎么调试

1. 关机接口

pm_shutdown();  // 在 app_pm.c 中有调用

2. 不同系列芯片关机模式对比

芯片系列

关机模式

典型功耗

IO保持

唤醒源

SF32LF56x / SF32LF58x

Standby

~16uA

所有IO保持输出

AON唤醒源

SF32LB52x / SF32LB55x

Hibernate

~4uA

仅唤醒口保持

PMUC唤醒源

3. 关机功耗检查步骤

  • 检查硬件LDO

    • 确认是否有长供电的LDO

    • 检查电源网络设计

  • 检查长供电外设功耗

    • G-Sensor、PPG、GPS、数字PA等

    • 关机前需配置进入低功耗模式

  • 检查IO配置

    • 唤醒脚必须配置上拉/下拉(内部或外部均可)

  • Standby关机注意事项

    • 确认关机前所有IO配置是否正确


FAQ2 板子待机功耗怎么调试

1. 低功耗说明

  • 系统空闲时会自动进入待机模式

  • menuconifg打开 pm_debug 宏后,通过串口日志 [pm] 打印确认系统唤醒和睡眠状态

日志格式

含义

[pm]S: mode,gtime

进入睡眠,mode=2表示LIGHT,4表示STANDBY;gtime单位32768Hz

[pm]W: gtime

退出睡眠,gtime单位32768Hz

[pm]WSR:0xXXX

唤醒原因(按寄存器位含义解析,或查看对应的 hpsys_aon.h / lpsys_aon.h

  • Pin脚配置文件:bsp_power.cbsp_pinmux.cbsp_lcd_tp.c

2. 关键函数

// 睡眠前配置,建议调试时所有IO在这里处理
BSP_IO_Power_Down(CORE_ID_HCPU, true);

// 唤醒后恢复
BSP_Power_Up(true);

BSP_IO_Power_Down(coreid, is_deep_sleep)coreid 用于指定 HCPU/LCPU,is_deep_sleep 表示是否为深睡眠路径;BSP_Power_Up(is_deep_sleep) 的参数需与对应恢复路径保持一致。

3. 术语

  • 底电流:最低稳态电流

  • 平均电流:工作周期内的平均功耗

4. 确认底电流

  • 默认代码关掉BLE广播的串口命令:ble_ctrl 0

  • 默认代码关掉BT的串口命令:bt_cm close

  • 关掉所有处于 activated 状态的定时器:先用 list_timer 查询状态,然后在代码里注释对应定时器的 start / stop

  • 确认所有外设,哪些待机时是关电,哪些是不关电的。 关电与不关电,对应外设的所有io口要配置的状态是不同

5. 确认平均电流增量

  • 底电流确认好后,逐个打开BLE、BT、定时器,观察平均电流增量,即可计算出BLE广播、BT、定时器任务分别的功耗

  • 平均功耗的调节手段:BLE/BT发射功率、广播周期、定时器周期、算法执行时间、传感器采样速度

6. 可以从mcu电源上来判断芯片是否有进入睡眠

  • 测量mcu的电源,睡眠/唤醒电源电压会有变化

  • BUCK(0/0.9~1.3V变化),对应lcpu供电走BUCK的关机/睡眠/唤醒状态

  • VDD_VOUT1(0.65~0.9/1.12V变化),对应hcpu睡眠/唤醒状态

  • VDD_VOUT2(休眠状态变化较缓慢,唤醒时会接近VDD_VOUT1)对应lcpu睡眠/唤醒状态

  • VDD_RET,在休眠和正常状态电压会有变化


FAQ3 IO口怎么配置不漏电

1. 唤醒引脚配置

  • 唤醒引脚必须有稳定的电平(软件或硬件拉高/拉低,一定要二选一配置一个),因内部有专门的RTC唤醒电路设计。

  • 唤醒引脚在哪里,怎么确认?

  • 找硬件/从芯片手册里确认,带#WKUP_PIN标识的都是唤醒脚

// 有外部硬件上/下拉的,不需要软件再配置。睡眠/唤醒都保持NOPULL就行
HAL_PIN_Set(PAD_PA44, GPIO_A44, PIN_NOPULL, 1);    // 配置PA44为GPIO
HAL_PIN_Set(PAD_PA44, I2C1_SCL, PIN_NOPULL, 1);  // 配置PA44为I2C1_SCL
// adc采样脚,保持模拟输入就行,正常硬件设计都是有外部分压后(外部分压,相当于有下拉在了),在接入adc脚的
HAL_PIN_Set_Analog(PAD_PA32, 1);                  // #GPADC 模拟输入
// 没有外部硬件上/下拉的,需要软件配置
HAL_PIN_Set(PAD_PA44, GPIO_A44, PIN_PULLDOWN, 1);    // 配置PA44为GPIO,并且内部下拉
HAL_PIN_Set(PAD_PA44, I2C1_SCL, PIN_PULLUP, 1);  // 配置PA44为I2C1_SCL,并且内部上拉

2. 输出使能引脚配置

// 正确配置:无上下拉,仅控制输出
HAL_PIN_Set(PAD_PA00, GPIO_A0, PIN_NOPULL, 1);    // 无内部上下拉
BSP_GPIO_Set(0, 0, 1);                           // 输出低电平

3. 有问题的配置(会导致漏电)

错误配置

现象

原因

PIN_PULLUP + 输出0

漏电

上拉电阻与输出低电平冲突

PIN_PULLDOWN + 输出1

漏电

下拉电阻与输出高电平冲突

外部上拉 + 输出0

漏电

外部上拉电流流向输出端

外部下拉 + 输出1

漏电

输出电流流向外部下拉

4. 外设电源关闭后的引脚处理

// 关闭外设电源后,通信引脚需配置为高阻(#WKUP_PIN 有外部上下拉可以这么配置,没有就不行,会漏电)
HAL_PIN_Set_Analog(PAD_PA00, 1);  // 配置PA00为高阻态

// 或配置为无上下拉 + 输出0
HAL_PIN_Set(PAD_PA00, GPIO_A0, PIN_NOPULL, 1); // PA00配置为GPIO,无内部上下拉
BSP_GPIO_Set(0, 0, 1);                        // GPIO_A0输出低电平

// 或配置为下拉 + 输出0
HAL_PIN_Set(PAD_PA00, GPIO_A0, PIN_PULLDOWN, 1); // PA00配置为GPIO,内部下拉
BSP_GPIO_Set(0, 0, 1); 

5. 外设电源不掉电的通信IO处理方式

// 可配置为高阻,唤醒时需恢复
HAL_PIN_Set_Analog(PAD_PA00, 1);  // 配置PA00为高阻态

// 或保持通信模式,需确认是否有外部上拉
HAL_PIN_Set(PAD_PA00, I2C1_SCL, PIN_NOPULL, 1); // PA00保持I2C1 SCL模式,无内部上下拉

FAQ4 为什么不睡眠

  • 按照文档检查后未发现异常,通常是因为修改了默认睡眠流程导致系统不睡眠。

// 检查 bf0_pm.c 文件中的 sifli_sleep 函数
rt_kprintf("[pm]S:%d,%d\n", mode, start_time); // 确认是否能执行到此(56x、55x、58x大小核都会执行)

FAQ5 硬件上怎么测量是哪个io口漏电了?

  • 万用表点一遍所有io口,只要不是0V或者3.3V/1.8V(看硬件设计的io供电电平是多少)。那这个io口就是漏电了

  • 有VDDIOA,有VDDIOB,多个io供电的,可以拆分下是哪一路VDDIO在漏电。VDDIOA对应PA脚,VDDIOB对应PB脚