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

NDK 低功耗开发指南

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

1 低功耗模式

低功耗模式介绍如下表所示:

模式名称

进入

唤醒

1.2V区时钟

时钟

1.2V供电

STANDBY_M0

Sleep_mode = 3, Buck_en_ctrl=0, Buck_bp_ctrl=0, Flashldo_bp_en_ctrl =0, Flashldo_lp_en_en_ctrl =0,WFI

P00,P01,P02,BOD/LVR(可选,需保证慢时钟开启),PIN RESET

全部关闭

全部关闭

断电

STANDBY_M1

Sleep_mode = 2, ldo_pwr_ctrl = 0, ldol_ pwr ctrl = 0/1, cpu pwr ctrl = 0/1, sram0/1 pwr ctrl = 0/1, ll_ram pwr ctrl=0/1, phy_ram pwr _ctrl=0/1, Buck_en_ctrl=0, Buck_bp_ctrl=0, Flashldo_bp_en_ctrl =0, Flashldo_lp_en_en_ctrl =0,WFI

所有GPIO(边沿去抖),SLPTMR,WDT,BOD/LVR(可选), PIN RESET

CLK32K, 其他全部关闭

慢时钟

LPLDOL/H :LL_RAM(可选),PHY_RAM/PHY_REGS(可选),SRAM0/1(可选),decrypt_ram(可选,cpu模块不保电,没办法做到只保少部分寄存器)LPLDOL/H:asnactrl_l(rcc的寄存器)GPIOWDTBOD,LVR

DEEPSLEEP

Sleep_mode = 1, ldol_power_ctrl = 0/1, Buck_en_ctrl=0, Buck_bp_ctrl=0, Flashldo_bp_en_ctrl =0/1, Flashldo_lp_en_en_ctrl =1/0,WFI

所有GPIO,SLPTMR,WDT,TIMER0/1/2,BOD/LVR(可选),PIN RESET

CLK32K,其他全部关闭

慢时钟

LPLDOL/H:其他数字模块,LPLDOL/H:WakeupGPIO,WDT,Timer0/1/2,(需要测试,确认如何安全使用)

SLEEP

Sleep_mode = 0, WFI

所有外设中断,BOD/LVR(可选),PIN RESET

CLK32K,CPU_CLK关闭,RCH、XTH、DPLL根据软件配置选择打开

慢时钟快时钟

HP_LDO供电

2 开发流程

2.1 低功耗使用流程

2.1.1 Sleep模式

  • 进入流程:

  1. 配置sleep_mode为sleep模式

  2. 唤醒源配置

  3. 设置flash dp_en为0

  4. 设置CPU SLEEPDEEP寄存器为0;地址:0xE000ED10

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

  6. __WFI();

  • 退出流程:

  1. 唤醒源产生中断;

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

  • 备注:

  1. 支持m0调试模式,不支持riscv调试模式

2.1.2 Deepsleep模式

进入流程:

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

  2. Power Switch

    模式1(推荐)

    模式2

    模式3

    lpldoh_en

    1

    1

    0

    lpldol_en

    1

    0

    1

    Ldo_pwr_ctrl

    1

    1

    1

    Ldol_pwr_ctrl

    0

    1

    1

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

    1(ram可配)

    1(ram可配)

    1(ram可配)

    Lpldoh_iso_en

    1(配置0待测试)

    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或者模式3,上述唤醒源都可以唤醒系统。BOD,LVR唤醒需要开启32K时钟。

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

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

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

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

  8. 设置CPU SLEEPDEEP寄存器为1;地址:0xE000ED10

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

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

  11. _WFI();

退出流程:

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

  2. 清除相应flag

备注:

  1. 支持m0调试模式(低功耗期间会丢失),不支持riscv调试模式

  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. 模式1(推荐,需测试)

    模式2

    模式3

    lpldoh_en

    1

    1

    0

    lpldol_en

    1

    0

    1

    Ldo_pwr_ctrl

    0

    0

    0

    Ldol_pwr_ctrl

    0

    1

    1

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

    1(可配)

    1(可配)

    1(可配)

    Lpldoh_iso_en

    1

    1

    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;地址:0xE000ED10

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

  10. _WFI();

退出流程:

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

  2. 清除相应flag

备注:

  1. 不支持m0和riscv调试模式

  2. 支持m0的cpu retention功能(现场恢复),不支持riscv的cpu retention功能

  3. 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;地址:0xE000ED10

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

  7. _WFI();

退出流程:

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

  2. 清除相应flag

2.2 参考相关例程

当前SDK中提供了一些低功耗相关的例程,涵盖了章节1所述的所有低功耗模式等。

例程位置:03_MCU\mcu_samples\LP。

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. 如果flash运行在4线enhance模式,进入功耗前需要退出enhance模式。

  2. 低功耗模式下供电分两部分LPLDOL和LPLDOH,其中LPLDOL给sram供电,电压范围从0.4~0.9v(未校准芯片有差异),LPLDOH给always on区域部分供电,供电范围0.5~1.2v(未校准芯片有差异),通常在进入低功耗在保证唤醒正常情况下尽量降低两个电压,常温下LPLDOL/H可设置未0/1。

  3. 为防止LPLDOH在电源抖动时出现不能唤醒的情况,增加了一个LPLDOH_VREF_TRIM_AON(LP_LPLDO[23:21])控制位,设置值的作用是弥补电源抖动,稳定电压,同时设置完成此值(例如设置为2,LPLDOH电压0.7v)后再想拉低LPLDOH至0.6v是不能完成的,此属于正常现象。

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

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