当前文档版本为 NDK-v0.8.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

NDK 低功耗开发指南

本文主要通过一些示例,介绍低功耗各个模式、使用的方法以及可能遇到的问题。

1 低功耗模式

芯片电源结构简图:

image

芯片定义了 4 种低功耗模式:

  1. Sleep 模式

    • 芯片供电与 Active 状态下相同,CPU 时钟停止,所有其他时钟均处于开启状态

    • 唤醒源支持所有外设中断、BOD、LVR

  2. DeepSleep 模式

    • 芯片供电:

      • DeepSleep Mode 1:HPLDO(1.2v)关闭,LPLDOL(0.4v)开启,LPLDOH(0.7v)开启,开关 sw0 闭合,开关 sw1 断开,开关 sw2 ~ sw6 可根据需要选择闭合或断开,芯片功耗约 3 ~ 4 uA

      • DeepSleep Mode 2:HPLDO(1.2v)关闭,LPLDOH(0.7v)开启,开关 sw0 闭合,开关 sw1 闭合,开关 sw2 ~ sw6 可根据需要选择闭合或断开,芯片功耗约 6 ~ 8 uA

    • 芯片时钟:高速时钟关闭、32K 低速时钟可根据需要选择是否开启

    • 唤醒源:所有 GPIO 引脚中断、SleepTimer、Timer0/1/2(仅限 DeepSleep Mode 2)、BOD、LVR

  3. Standby Mode 1 模式

    • 芯片供电:HPLDO(1.2v)关闭,LPLDOL(0.4v)开启,LPLDOH(0.7v)开启,开关 sw0 断开,开关 sw1 断开,开关 sw2 ~ sw6 可根据需要选择闭合或断开,芯片功耗约 1 ~ 2 uA

    • 芯片时钟:高速时钟关闭、32K 低速时钟可根据需要选择是否开启

    • 唤醒源:所有 GPIO 引脚中断、SleepTimer、BOD、LVR

  4. Standby Mode 0 模式

    • 芯片供电:所有内部 LDO 均关闭,芯片功耗约 300 nA

    • 芯片时钟:所有时钟均关闭

    • 唤醒源:GPIO P00/P01/P02 电平唤醒

2 开发流程

2.1 低功耗使用流程

2.1.1 Sleep模式

  • 进入流程:

  1. 配置 sleep_mode 为 sleep 模式

  2. 唤醒源配置

  3. 设置flash dp_en为0

  4. 设置CPU SLEEPDEEP寄存器为0

  5. 考虑安全,建议进行一次手动3V同步操作

  6. __WFI();

  • 退出流程:

  1. 唤醒源产生中断;

  2. 处理中断,清除中断源;

2.1.2 Deepsleep模式

进入流程:

  1. 配置sleep_mode为deepsleep模式,配置各电压域的power switch,配置rcl_en_ctrl,xtl_pwr_ctrl,Buck和flashldo的配置建议使用driver默认

  2. Power Switch

    模式1

    模式2

    lpldoh_en

    1

    1

    lpldol_en

    1

    0

    Ldo_pwr_ctrl

    1

    1

    Ldol_pwr_ctrl

    0

    1

    Peri_pwr_ctrl(cpu/ll_sram/phy_sram/sram0/sram1)

    1(ram可配)

    1(ram可配)

    Lpldoh_iso_en

    1(配置0待测试)

    0

  3. 唤醒源配置:所有GPIO,SLPTMR,WDT,TIMER0/1/2,BOD/LVR(可选),PIN RESET。对于模式1,如果Lpldoh_iso_en配置为1,则不支持TIMER0/1/2唤醒;如果Lpldoh_iso_en配置为0,则支持TIMER0/1/2唤醒和PWM输出(需要测试是否有漏电)。对于模式2,上述唤醒源都可以唤醒系统。BOD,LVR唤醒需要开启32K时钟。

  4. 对于模式1,如果Lpldoh_iso_en配置为1,不支持PWM输出;如果Lpldoh_iso_en配置为0,则支持PWM输出(需要测试是否有漏电)。对于模式2, PWM可以输出

  5. Flash dp设置为1,并退出enhance模式。配置合适的dp,和rdp时间

  6. 建议cpu地址重映射功能开启,映射地址为ram保电区域,可加快唤醒后,程序执行速度

  7. 设置CPU SLEEPDEEP寄存器为1

  8. Flash控制器退出增强型模式;

  9. _WFI();

退出流程:

  1. 唤醒源唤醒,产生lp中断或者唤醒源相对应的中断

  2. 清除相应flag

备注:

  1. 此状态下 SWD 功能无效(无法调试或烧录程序,需要唤醒后操作)

  2. gpio唤醒电平,至少需要保持一个完整的32K时钟周期。如果需要读取的gpio的中断,需要7个32K时钟周期(需要dly2的延时决定);如果32K时钟关闭,则唤醒需要的时间更久,和32K时钟的启动时间相关

2.1.3 Standby_m1模式

进入流程:

  1. 配置sleep_mode为standby_m1模式,配置各电压域的power switch,配置rcl_en_ctrl,xtl_pwr_ctrl,Buck和flashldo的配置建议使用driver默认

  2. lpldoh_en

    1

    lpldol_en

    1

    Ldo_pwr_ctrl

    0

    Ldol_pwr_ctrl

    0

    Peri_pwr_ctrl(cpu/ll_sram/phy_sram/sram0/sram1)

    1(可配)

    Lpldoh_iso_en

    1

  3. 唤醒源配置:所有GPIO,SLPTMR,WDT,BOD/LVR(可选),PIN RESET。BOD,LVR唤醒需要开启32K时钟。

  4. flash如果使用4线模式,建议开启dp模式,flash 两线切换四线的时间特别长,一般会有8ms;如果flash使用2线模式,不建议开启dp模式,flash直接掉电处理。

  5. 建议cpu地址重映射功能开启,映射地址为ram保电区域,可加快唤醒后,程序执行速度

  6. 根据需求,决定是否开启cpu保电功能,寄存器LP_FL_CTRL[4]。可硬件恢复现场,代码实现有特定需求,参见说明部分

  7. Dly_time2需要根据测试结果重新配置,默认值比较大

  8. 设置CPU SLEEPDEEP寄存器为1

  9. _WFI();

退出流程:

  1. 唤醒源唤醒,产生lp中断以及唤醒源相对应的中断

  2. 清除相应flag

备注:

  1. 支持 cpu core 寄存器 retention 功能

  2. gpio唤醒电平,至少需要保持一个完整的32K时钟周期。如果需要读取的gpio的中断,需要7个32K时钟周期(需要dly2的延时决定);如果32K时钟关闭,则唤醒需要的时间更久,和32K时钟的启动时间相关

2.1.4 Standby_m0模式

进入流程:

  1. 配置sleep_mode为standby_m0模式,配置rcl_en_ctrl,xtl_pwr_ctrl

  2. 唤醒源配置:所有P00,P01,P02, BOD/LVR(可选),PIN RESET。

  3. Flash dp设置为0

  4. Dly_time1根据需要决定是否配置,如果不在意m0的唤醒时间不建议去修改。此处的时间测试遍历会比较多,设置的值不好控制

  5. 设置CPU SLEEPDEEP寄存器为1

  6. _WFI();

退出流程:

  1. 唤醒源唤醒,产生lp中断以及唤醒源相对应的中断

  2. 清除相应flag

2.2 参考相关例程

SDK 中提供了诸多演示芯片低功耗的例程:

  • 裸机例程位置:<PAN10XX-DK>\03_MCU\mcu_samples\LowPower

  • 带OS例程位置:<PAN10XX-DK>\01_SDK\nimble\samples\low_power

低功耗例程的详细说明请参考对应例程的文档。

2.3 Standby_m1休眠唤醒

以standby m1模式,cpu retention and cpu continue run模式为基础介绍各个时间阶段mcu的动作。

阶段

说明

时间(us)

备注

进入休眠

从软件发送休眠指令至硬件完全休眠的时间

236

硬件唤醒启动

唤醒源触发后硬件完全启动的时间

278

Standby M1 retention模式

continue run,唤醒至rx ready时间

465

此模式下软件初始化和RF初始化步骤可以省略

TX/RX(max 59B)

收发最大payload的时间,根据传输速率与字节数计算得出

1888

此处按最大数据计算

总计

休眠唤醒至tx完成/rx完成的时间

2867

休眠时间

image

唤醒时间

image

软件运行至RF ready时间

image

RF 接收32Byte时间

image

3 其他说明

  1. 低功耗模式下供电分两部分LPLDOL和LPLDOH,其中LPLDOL给sram供电,电压为 0.4v 左右,LPLDOH给需要稍高一些电压的模块供电,供电电压 0.7v 左右。

  2. DeepSleep模式下外设timer0/1/2作为唤醒以及PWM在低功耗下输出需要将deepsleep低功耗模式设置为模式2,即dp_mode=LP_DEEPSLEEP_MODE2。

  3. Standby M1 cpu retention 模式唤醒后外设部分及RF MAC层寄存器需要重新初始化,PHY、保电的sram、时钟等不需要重新初始化。