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

Low Power

1 功能概述

本例程默认演示 Deepsleep 模式 的进入与唤醒:

  • 使用 LP_EnterDeepSleep() 进入 Deepsleep

  • 例程代码中提供了 GPIO 唤醒口、SleepTimer(32k) 唤醒 和 WDT(看门狗)唤醒 的配置示例

2 环境准备

  • 硬件设备与线材:

    • PAN271x EVB 核心板底板各一块

    • JLink 仿真器(用于烧录例程程序)

    • USB-TypeC 线一条(用于底板供电和查看串口打印 Log)

    • 杜邦线数根或跳线帽数个(用于连接各个硬件设备)

    • 逻辑分析仪,用于抓取debug io状态

  • 硬件接线:

    • 将 EVB 核心板插到底板上

    • 连接串口转USB调试模块:

      • 使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板 USB->UART 插口相连

      • 使用杜邦线或跳线帽将 EVB 底板 J8 排针对 (P06 & TXD) 和 J9 排针对 (P05 & RXD) 分别短接起来

    • 连接 Jlink,使用杜邦线将 JLink 仿真器的:

      • SWD_CLK 引脚与 EVB 底板的 P00 排针相连

      • SWD_DAT 引脚与 EVB 底板的 P01 排针相连

      • SWD_GND 引脚与 EVB 底板的 GND 排针相连

  • PC 软件:

    • 串口调试助手(UartAssist)或终端工具(SecureCRT),波特率 115200(用于串口交互)

3 编译和烧录

例程位置:<PAN271x-DK>\01_SDK\samples\drivers\lowpower

双击 Keil Project 文件打开工程进行编译烧录。

4 例程演示说明

4.1 可选唤醒源:GPIO 唤醒口

例程中提供了 LP_WakeUpPinConfig(),用于把某个 GPIO 配置成上升沿唤醒源。若要启用 GPIO 唤醒:

  1. 取消 main 循环中如下语句的注释:

    LP_WakeUpPinConfig(P1, GPIO_Pin_6);   /* 配置P1.6为唤醒口 */
    
  2. 将对应引脚接到可产生上升沿的外部信号。

唤醒后会进入对应端口的 GPIO 中断服务函数(例程实现了 GPIO1_IRQHandler),并打印:

P1 interrupt

4.2 可选唤醒源:SleepTimer(32k) 定时唤醒

例程中提供了 SleepTimer 的配置示例,用于在 Deepsleep 下按 32k 时钟计数定时唤醒:

LP_SetUsrSleepTimer(32000 * 3, 1);   /* 设置睡眠时间为3秒(约) */
LP_EnableDeepsleepTimer1();          /* 使能睡眠定时器1作为唤醒源 */

当 SleepTimer 触发时,会进入 SLPTMR1_IRQHandler,并打印:

slptmr1 int

4.3 可选唤醒源: WDT(看门狗)唤醒

  1. 打开看门狗配置:

    /* 配置WDT唤醒功能:关闭看门狗复位,打开唤醒功能 */
    SYS_UnlockReg();
    WDT_Open(WDT_TIMEOUT_2POW14, WDT_RESET_DELAY_1025CLK, FALSE, TRUE);
    WDT_EnableInt();
    NVIC_EnableIRQ(WDT_IRQn);
    SYS_LockReg();
    
  2. 进入 Deepsleep 并等待 WDT 唤醒:

    例程在循环中进入 Deepsleep,WDT 超时后会把芯片从 Deepsleep 唤醒。 可以参考如下写法:

    while (true)
    {
        /* 低功耗前可按需关闭UART RX数字通路降低漏电(按实际RX引脚调整) */
        GPIO_DisableDigitalPath(P0, GPIO_Pin_6);
        LP_EnterDeepSleep();
        GPIO_EnableDigitalPath(P0, GPIO_Pin_6);
    
        /* 唤醒后刷新WDT计数,避免很快再次超时 */
        WDT_ResetCounter();
        SYS_delay_10nop(100);		// 延迟66us
    }
    
  3. 唤醒后现象与中断处理:

    • 当 WDT 超时发生,会进入 WDT_IRQHandler(),例程会打印:

      WDT interrupt
      
    • 为避免中断/唤醒标志残留导致重复进入中断,例程在 WDT_IRQHandler() 中会清除:

      • Timeout Interrupt Flag

      • Timeout Flag

      • Timeout Wakeup Flag

注意事项:

  • WDT_Open(..., enableReset=FALSE, enableWakeup=TRUE) 这种配置是“只唤醒不复位”。如果把 enableReset 配成 TRUE,WDT 超时将导致复位而不是按当前流程继续执行。

  • 如果修改了 WDT 超时时间(WDT_TIMEOUT_xxx),记得同步评估实际唤醒周期;周期越长,便于观察但响应会更慢。

  • WDT_ResetCounter()喂狗完毕后,至少要等待66us以上,才能再次进入低功耗模式。建议先喂狗再进行其他操作后进入低功耗模式,其他操作要保证在66us以上,这样CPU可以手动空转等待66us。

4.4 主要 API 说明

  • LP_EnterDeepSleep():进入 Deepsleep 模式。

  • WDT_Open(timeout, resetDelay, enableReset, enableWakeup):配置 WDT。

    • 例程将 enableReset 置为 FALSE(不复位),将 enableWakeup 置为 TRUE(作为唤醒源)。

  • LP_WakeUpPinConfig(GPIO_T *Port, GPIO_PinDef pin):配置GPIO唤醒源。

  • LP_SetUsrSleepTimer(sleepTime, idx):设置用户睡眠定时器比较值(单位为 32k 时钟周期)。

  • LP_EnableDeepsleepTimer1():使能 SleepTimer1,并打开中断与唤醒能力。

  • GPIO_DisableDigitalPath()/GPIO_EnableDigitalPath():关闭/恢复数字输入通路,常用于降低低功耗漏电。

4.5 低功耗调试建议

  • 若目标是评估低功耗电流,建议断开不必要的外设连接(如逻辑分析仪、某些调试接口),并按板卡电路实际情况关闭相关引脚的数字通路/上下拉。

  • 进入低功耗前可关闭串口接收数字通路,防止漏电(根据接收串口引脚更改)。例如例程默认 UART0_RX 为 P0.6,进入低功耗前调用 GPIO_DisableDigitalPath(P0, GPIO_Pin_6),唤醒后再恢复 GPIO_EnableDigitalPath(P0, GPIO_Pin_6)

  • 例程中对下载口相关引脚(P0.0/P0.1)关闭数字通路与上拉,是为了降低待机漏电。