开发者配置(Usrcfg)

本节内容介绍 sleep 和 deep sleep 两种睡眠模式的唤醒源配置方法。

配置流程

Sleep 配置流程

一个唤醒源如果要从 sleep 唤醒系统,其自身一定要被正确的初始化,并且对应的唤醒事件被触发。配置唤醒源将系统从 sleep 唤醒,请遵循如下步骤:

  • Step1 :初始化对应唤醒源,并注册其中断处理函数

  • Step2 :根据 唤醒源配置 配置唤醒源的唤醒掩码

  • step3 :根据 时钟和电压配置 检查是否需要额外配置 clock 和 power 状态

  • step4 :可通过 pmu_set_sleep_type() 设置睡眠类型为 CG 还是 PG(默认休眠类型是 PG)

  • step5 :释放 sleep wakelock,等待系统进入 sleep

  • Step6 :sleep 时,唤醒源中断产生,唤醒系统,并执行对应的中断处理函数

小技巧

在 step1 注册完成之后,可以在系统 active 时触发中断,检查是否能够正确进入到对应的中断处理函数,以确保唤醒源被正确初始化。

sleep 示例代码可参考 sleep example

Deep Sleep 配置流程

一个唤醒源如果要从 deep sleep 唤醒系统,需遵循以下步骤:

  • Step1:初始化对应唤醒源,无需设置唤醒掩码等额外参数

  • Step2:释放 sleep wakelock 和 deepsleep wakelock,等待系统进入 deep sleep

  • Step3:系统 wake 以后,需根据 wake event 处理对应唤醒源唤醒后的行为。

deep sleep 示例代码可参考 deep sleep example

小技巧

从 deep sleep 唤醒后,由于 CPU 重新上电,睡眠前注册的中断都已丢失。用户可通过 SOCPS_AONWakeReason() 获取 wake event,根据 event 注册对应的中断进行处理。

Sleep 唤醒源配置

用户可以修改上述文件来配置唤醒源参数,当前可用配置如下所示:

唤醒源配置

所有可用唤醒源已在数组 sleep_wevent_config[] 中列出,每一项都代表一个唤醒源配置,用户可通过修改该数组来配置唤醒源能否唤醒及唤醒的 CPU。

WakeEvent_TypeDef sleep_wevent_config[] = {
   //   Module                    Wakeup
   {WAKE_SRC_AON_WAKEPIN,         WAKEUP_NULL},
   {WAKE_SRC_AON_TIM,             WAKEUP_NULL},
   {WAKE_SRC_PWR_DOWN,            WAKEUP_NULL},
   {WAKE_SRC_BOR,                 WAKEUP_NULL},
   {WAKE_SRC_ADC,                 WAKEUP_NULL},
   {WAKE_SRC_RTC,                 WAKEUP_NULL},
   {WAKE_SRC_GPIOB,               WAKEUP_NULL},
   {WAKE_SRC_GPIOA,               WAKEUP_NULL},
   {WAKE_SRC_UART_LOG,            WAKEUP_NULL},
   {WAKE_SRC_UART1,               WAKEUP_NULL},
   {WAKE_SRC_UART0,               WAKEUP_NULL},
   {WAKE_SRC_WIFI_FISR_FESR_IRQ,      WAKEUP_NULL},  /* For WiFi wakeup, do not change it*/
   ...
   {0xFFFFFFFF,                   WAKEUP_NULL},
};

其中 WakeEvent_TypeDef 结构体定义如下所示:

typedef struct {
   u32 Module;
   enum wakeup_mask Wakeup;
} WakeEvent_TypeDef;
  • Module :唤醒源

  • Wakeup :唤醒掩码,指定要唤醒的 CPU,可选参数如下

  • WAKEUP_KM4 :唤醒 KM4

  • WAKEUP_KM0 :唤醒 KM0

  • WAKEUP_NULL :禁用该唤醒源

例如设置 {WAKE_SRC_UART0,   WAKEUP_KM4},则表示 UART0 要唤醒 KM4; 设置 {WAKE_SRC_UART0,   WAKEUP_KM0},则表示 UART0 要唤醒 KM0。唤醒掩码应该设置为用户运行应用的 CPU,保持中断和唤醒源设置都是同一个 CPU。

备注

  • 如果选择唤醒 KM4,则 KM0 也会被唤醒。

  • SDK 中已经设定好唤醒掩码的唤醒源,不可修改。例如 {WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_KM0} 是 Wi-Fi 专用,不可修改。

小技巧

除修改 sleep_wevent_config[] 外,用户还可以通过 SOCPS_SetAPWakeEvent()SOCPS_SetNPWakeEvent() 等 API 修改唤醒源配置。

时钟和电压配置

某些唤醒源需要在休眠时配置 OSC、XTAL 以及 MCU Core 电压等参数才能工作,可通过 ps_config[] 结构体进行配置。

使用 UART 或者 LOGUART 作为唤醒源时,需要修改休眠时的电压和时钟源。可配置参数如下:

PSCFG_TypeDef ps_config = {
   .keep_OSC4M_on = FALSE,        /* Keep OSC4M on or off for sleep */
   .xtal_mode_in_sleep = XTAL_OFF,    /* Set XTAL mode during sleep mode, see enum xtal_mode_sleep for details */
   .sleep_to_08V = FALSE,        /* Default sleep to 0.7V, setting this option to TRUE will sleep to 0.8V */
};
休眠相关参数

参数名

含义

参数说明

keep_OSC4M_on

休眠时 OSC4M 是否开启

TRUE:保持开启;FALSE:关闭

xtal_mode_in_sleep

休眠时 XTAL 的工作模式

XTAL_OFF:关闭晶振

XTAL_LPS_With_40M:低功耗模式维持 40MHz。

sleep_to_08V

休眠时 MCU Core 电压

FALSE:0.7V(默认);TRUE:0.8V

配置原则如下:

  1. 使用 Raw API 开发时,以下配置原则适用于 UART 及 LOGUART:

    1. 时钟选择:休眠前调用 RCC_PeriphClockSource_UART_ROM() 选择时钟源

      1. 若选 OSC2M,需设定 keep_OSC4M_on = TRUE

      2. 若选 XTAL,需设定 xtal_mode_in_sleep = XTAL_LPS_With_40M

    2. 电压设置:需设置为 sleep_to_08V = TRUE ,保证 OSC4M 或 XTAL 正常工作。

  2. 使用 Mbed API 开发时,以下配置原则 仅适用于 UART

    1. 时钟选择:休眠前调用 serial_baud(),根据 UART 波特率和低功耗设置自动决定

      1. 当波特率小于等于 115200 baud/s 且 .LOW_POWER_RX_ENABLE = ENABLE ,自动选择 OSC2M,需设定 keep_OSC4M_on = TRUE

      2. 如果波特率大于 115200 baud/s 或者 .LOW_POWER_RX_ENABLE = DISABLE ,自动选择 XTAL,需设定 xtal_mode_in_sleep = XTAL_LPS_With_40M

    UARTCFG_TypeDef uart_config[4] = {
       /* UART0 */
       {
          .LOW_POWER_RX_ENABLE = DISABLE, /*Enable low power RX*/
       },
       /* UART1 */
       {
          .LOW_POWER_RX_ENABLE = DISABLE,
       },
       ...
    };
    
    1. 电压设置:休眠电压需要设置为 sleep_to_08V = TRUE ,保证 OSC4M 或 XTAL 正常工作。

备注

休眠时开启 XTAL,功耗将显著增大。

Deep Sleep 唤醒源配置

唤醒源

以下唤醒源支持从 deep sleep 唤醒系统:

  • AON Timer

  • RTC

  • BOR

  • PWR_DOWN

  • AON Wakepin

参数配置

deep sleep 唤醒源不仅可以将系统从 deep sleep 唤醒,也可以将系统从 sleep 中唤醒。deep sleep 时无需配置 sleep 唤醒掩码、电压等参数。

wake pin 配置

wake pin 是一组特殊的 GPIO,既可以在 deepsleep 模式下唤醒,也可以在 sleep 模式下唤醒。 在 sleep 模式下,wake pin 对应的 pin 可以复用成 GPIO 功能,设置为 GPIO 唤醒,也可以选择作为 wake pin 功能唤醒。 wake pin 示例代码可参考 wake pin example