LowPower: DeepSleep Timer Wakeup¶
1 功能概述¶
本例程演示如何使 SoC 进入 DeepSleep 状态,然后通过内部 APB HW Timer 定时将其唤醒。
2 环境准备¶
硬件设备与线材:
PAN1080 EVB 核心板与底板各一块
JLink 仿真器(用于烧录例程程序)
电流计(本文使用电流可视化测量设备 PPK2 [Nordic Power Profiler Kit II] 进行演示)
USB-TypeC 线一条(用于底板供电和查看串口打印 Log)
杜邦线数根(用于连接各个硬件设备)
硬件接线:
为确保能够准确地测量 SoC 本身的功耗,排除底板外围电路的影响,请勿将 EVB 核心板插到 EVB 底板上
使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板 USB->UART 插口相连
使用杜邦线将(根据核心板芯片的型号不同,以下两种接法二选一):
EVB 底板上的 TX0 引脚与核心板上的 P00 引脚相连, EVB 底板上的 RX0 引脚与核心板上的 P01 引脚相连(若核心板芯片为 QFN32 或 LQFP64 封装)
EVB 底板上的 TX0 引脚与核心板上的 P30 引脚相连, EVB 底板上的 RX0 引脚与核心板上的 P31 引脚相连(若核心板芯片为 QFN48 封装)
使用杜邦线将 JLink 仿真器的:
SWD_CLK 引脚与 EVB 核心板的 P46 引脚相连
SWD_DAT 引脚与 EVB 核心板的 P47 引脚相连
SWD_GND 引脚与 EVB 核心板的 GND 引脚相连
将 PPK2 硬件的:
USB DATA/POWER 接口连接至 PC USB 接口
VOUT 引脚连接至 EVB 核心板的 VBAT 引脚
GND 引脚连接至 EVB 核心板的 GND 引脚
PC 软件:
串口调试助手(UartAssist)或终端工具(SecureCRT),波特率 921600(用于接收串口打印 Log)
nRF Connect Desktop(用于配合 PPK2 测量 SoC 电流)
3 编译和烧录¶
例程位置:zephyr\samples_panchip\low_power\deepsleep_timer_wakeup
使用 ZAL 工具擦除 Flash 程序。关于 ZAL 工具的详细介绍请参考:Zephyr APP Launcher 工具介绍。
4 例程演示说明¶
PC 上打开 PPK2 Power Profiler 软件,供电电压选择 3300 mV,然后打开供电开关:
测试芯片中目前还没有程序,所以看到此时芯片耗电保持在 3mA 左右。
使用 ZAL 工具将编译后的例程烧录至芯片
烧录成功后,最好断开 JLink 与芯片的连接以防止芯片 P46 和 P47 两个引脚有漏电情况发生
从串口工具中看到如下的打印信息:
Try to load HW calibration data.. DONE. - Chip Type : 0x80 - Chip CP Version : None - Chip FT Version : 5 - Chip MAC Address : D0000C0293CA - Chip Flash UID : 31373237300A29494330FFFFFFFFFFFF - Chip Flash Size : 1024 KB *** Booting Zephyr OS build zephyr-v2.7.0-1346-g181eea9cf7ca *** Try to take wak[Uptime: 67 ms] Timer0 IRQ triggered. eup_sem.. [Uptime: 166 ms] Timer0 IRQ triggered. [Uptime: 266 ms] Timer0 IRQ triggered. [Uptime: 366 ms] Timer0 IRQ triggered. [Uptime: 466 ms] Timer0 IRQ triggered. [Uptime: 565 ms] Timer0 IRQ triggered. [Uptime: 666 ms] Timer0 IRQ triggered. [Uptime: 766 ms] Timer0 IRQ triggered. [Uptime: 865 ms] Timer0 IRQ triggered. [Uptime: 965 ms] Timer0 IRQ triggered. [Uptime: 1065 ms] Timer0 IRQ triggered. [Uptime: 1165 ms] Timer0 IRQ triggered. [Uptime: 1265 ms] Timer0 IRQ triggered. [Uptime: 1365 ms] Timer0 IRQ triggered.
此时观察芯片电流波形:
由电流波形看出芯片电流大部分时间稳定在 6uA 左右(此时芯片处于 DeepSleep 模式),然后每隔 100ms 左右被唤醒, 然后继续进入 DeepSleep 模式,并等待下次 Timer 超时唤醒,如此往复。
5 开发者说明¶
5.1 App Config 配置¶
本例程的 App Config(对应 prj.conf 文件)配置如下:
# Enable Low Power Flow
CONFIG_PM=y
CONFIG_BT_CTLR_SLEEP_CLOCK_SOURCE=1
# Enable Low Power Flow IO Debugging
# - P10: 32K Clock Output (RCL or XTL)
# - P30: Pull low when SoC is in DeepSleep Mode
# - P31: Pull low when SoC is in Sleep Mode
# - P11: Toggle to indicate wakeup delay time
# - P16: Pull high when SoC is executing systick ISR
# - NOTE: Refer to pan1080_init() in soc.c for impl
# CONFIG_PM_IO_DEBUG=y
# Disable Serial Uart & Log
# CONFIG_SERIAL=n
# CONFIG_UART_INTERRUPT_DRIVEN=n
# CONFIG_CONSOLE=n
# CONFIG_UART_CONSOLE=n
# CONFIG_PRINTK=n
# Forcely calibrate 32K RCL Clock
CONFIG_SOC_FORCE_CALIB_RCL_CLK=y
# Increase Low power LDO calibrate code (can be 0/1/2/3)
# CONFIG_SOC_INCREASE_LLDO_CALIB_CODE=1
# Enable DC/DC
CONFIG_SOC_DCDC_PAN1080=y
其中:
CONFIG_PM=y
:使能低功耗流程CONFIG_BT_CTLR_SLEEP_CLOCK_SOURCE=1
:低功耗时钟相关配置(目前必须固定配置为1)CONFIG_SOC_FORCE_CALIB_RCL_CLK=y
:在系统初始化阶段强制校准内部 32K RCL Clock 时钟(若当前使用的芯片为校准后的芯片,则此开关也可以不开以节约系统启动时间)CONFIG_SOC_INCREASE_LLDO_CALIB_CODE=1
:强制提高芯片 LLDO(Lowpower LDO)的校准档位(当芯片使用 Timer 无法唤醒或 Timer 唤醒时间不稳的时候可以尝试配置此功能)CONFIG_SOC_DCDC_PAN1080=y
:使能芯片的 DCDC 供电模式,以降低芯片动态功耗
5.2 App DeviceTree 配置¶
本例程的 App DeviceTree(对应 app.overlay 文件)配置如下:
&uart1 {
status = "disabled";
};
&clk_xtl {
/* Frequency of XTL clock, DO NOT CHANGE THIS ITEM */
clock-frequency = <32768>;
/* Enable/Disable the external 32768 Hz low speed crystal oscillator */
status = "disabled";
};
&clk_rcl {
/* Frequency of RCL clock, DO NOT CHANGE THIS ITEM */
clock-frequency = <32000>;
/* Enable/Disable the internal 32 KHz Low Speed RC */
status = "okay";
};
&dpll {
/* f(dpll_output) = f(dpll_input) / clock_div * clock_mult */
clocks = <&clk_xth>;
clock-div = <2>; /* Fixed to 2 */
clock-mult = <4>; /* Can be 3 (48MHz) or 4 (64MHz) */
status = "okay";
};
&rcc {
clock-names = "clk_system", "clk_slow";
clocks = <&dpll &clk_rcl>;
clock-frequency-system = <DT_FREQ_M(64)>;
clock-frequency-slow = <32000>;
ahb-prescaler = <1>;
apb1-prescaler = <1>;
apb2-prescaler = <1>;
};
其中:
将 uart1 的
status
属性配置为disabled
以禁止系统上电后初始化 uart1 设备,确保不会因为 uart1 的引脚配置产生 IO 漏电将 clk_xtl 的
status
属性配置为disabled
以禁用 32768Hz XTL 低速晶振(此为 SDK 默认配置)将 clk_rcl 的
status
属性配置为okay
以打开 32kHz RCL 内部低速时钟(此为 SDK 默认配置)将 dpll 的
clock-mult
属性配置为4
以将 DPLL 时钟输出配置为 64MHz(此为 SDK 默认配置)将 rcc 的:
clocks
属性的第 1 项(clk_system)配置为dpll
以将系统高速时钟(AHB 总线时钟)源选择为 DPLL 时钟(此为 SDK 默认配置)clocks
属性的第 2 项(clk_slow)配置为clk_rcl
以使系统使用 32kHz RCL 内部低速时钟(此为 SDK 默认配置)clock-frequency-slow
属性配置为32000
以告诉系统当前使用的低速时钟频率为 32000 Hz(此为 SDK 默认配置)
5.3 程序代码¶
请参考例程代码中的相关注释以获取详细解释。
6 RAM/Flash资源使用情况¶
Memory region Used Size Region Size %age Used
FLASH: 19600 B 384 KB 4.98%
SRAM: 7048 B 64 KB 10.75%