低功耗¶
文档指引¶
睡眠唤醒流程:请参见 低功耗开发指南
详细调试流程:请参见 Low Power 应用指南
系统没有进入睡眠:请参见 为什么没有进入睡眠模式
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]打印确认系统唤醒和睡眠状态
日志格式 |
含义 |
|---|---|
|
进入睡眠,mode=2表示LIGHT,4表示STANDBY;gtime单位32768Hz |
|
退出睡眠,gtime单位32768Hz |
|
唤醒原因(按寄存器位含义解析,或查看对应的 |
Pin脚配置文件:
bsp_power.c、bsp_pinmux.c、bsp_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. 有问题的配置(会导致漏电)¶
错误配置 |
现象 |
原因 |
|---|---|---|
|
漏电 |
上拉电阻与输出低电平冲突 |
|
漏电 |
下拉电阻与输出高电平冲突 |
外部上拉 + 输出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大小核都会执行)