低功耗

文档指引


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();

// 唤醒后恢复
BSP_Power_Up();

3. 术语

  • 底电流:最低稳态电流

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

4. 确认底电流

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

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

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

5. 确认平均电流增量

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

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


FAQ3 IO口怎么配置不漏电

1. 唤醒引脚配置

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

// 有外部硬件上/下拉的,不需要软件再配置
HAL_PIN_Set(PAD_PA44, GPIO_A44, PIN_PULLUP, 1);    // 配置PA44为GPIO,内部上拉
HAL_PIN_Set(PAD_PA44, I2C1_SCL, PIN_PULLDOWN, 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. 外设电源关闭后的引脚处理

// 关闭外设电源后,通信引脚需配置为高阻
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输出低电平

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大小核都会执行)