开发者配置(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 专用,不可修改。
WAKEUP_AP :唤醒 KM4
WAKEUP_NP :唤醒 KR4
WAKEUP_NULL :禁用该唤醒源
例如设置 {WAKE_SRC_UART0, WAKEUP_AP},则表示 UART0 要唤醒 KM4;
设置 {WAKE_SRC_UART0, WAKEUP_NP},则表示 UART0 要唤醒 KR4。唤醒掩码应该设置为用户运行应用的 CPU,保持中断和唤醒源设置都是同一个 CPU。
备注
如果选择唤醒 KM4,则 KR4 也会被唤醒。
SDK 中已经设定好唤醒掩码的唤醒源,不可修改。例如
{WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_NP}是 Wi-Fi 专用,不可修改。
WAKEUP_AP :唤醒 KM4
WAKEUP_NP :唤醒 KR4
WAKEUP_NULL :禁用该唤醒源
例如设置 {WAKE_SRC_UART0, WAKEUP_AP},则表示 UART0 要唤醒 KM4;
设置 {WAKE_SRC_UART0, WAKEUP_NP},则表示 UART0 要唤醒 KR4。唤醒掩码应该设置为用户运行应用的 CPU,保持中断和唤醒源设置都是同一个 CPU。
备注
如果选择唤醒 KM4,则 KR4 也会被唤醒。
SDK 中已经设定好唤醒掩码的唤醒源,不可修改。例如
{WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_NP}是 Wi-Fi 专用,不可修改。
WAKEUP_AP :唤醒 KM4
WAKEUP_NP :唤醒 KR4
WAKEUP_NULL :禁用该唤醒源
例如设置 {WAKE_SRC_UART0, WAKEUP_AP},则表示 UART0 要唤醒 KM4;
设置 {WAKE_SRC_UART0, WAKEUP_NP},则表示 UART0 要唤醒 KR4。唤醒掩码应该设置为用户运行应用的 CPU,保持中断和唤醒源设置都是同一个 CPU。
备注
如果选择唤醒 KM4,则 KR4 也会被唤醒。
SDK 中已经设定好唤醒掩码的唤醒源,不可修改。例如
{WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_NP}是 Wi-Fi 专用,不可修改。
WAKEUP_AP :唤醒 KM4
WAKEUP_NP :唤醒 KR4
WAKEUP_NULL :禁用该唤醒源
例如设置 {WAKE_SRC_UART0, WAKEUP_AP},则表示 UART0 要唤醒 KM4;
设置 {WAKE_SRC_UART0, WAKEUP_NP},则表示 UART0 要唤醒 KR4。唤醒掩码应该设置为用户运行应用的 CPU,保持中断和唤醒源设置都是同一个 CPU。
备注
如果选择唤醒 KM4,则 KR4 也会被唤醒。
SDK 中已经设定好唤醒掩码的唤醒源,不可修改。例如
{WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_NP}是 Wi-Fi 专用,不可修改。
WAKEUP_AP :唤醒 CA32
WAKEUP_NP :唤醒 KM4
WAKEUP_LP :唤醒 KM0
WAKEUP_NULL :禁用该唤醒源
例如设置 {WAKE_SRC_UART0, WAKEUP_AP},则表示 UART0 要唤醒 CA32;
设置 {WAKE_SRC_UART0, WAKEUP_LP},则表示 UART0 要唤醒 KM0。唤醒掩码应该设置为用户运行应用的 CPU,保持中断和唤醒源设置都是同一个 CPU。
备注
如果选择唤醒 KM4,则 KM0 也会被唤醒;如果选择唤醒 CA32,则 KM4 和 KM0 都会被唤醒。
SDK 中已经设定好唤醒掩码的唤醒源,不可修改。例如
{WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_LP}是 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 |
配置原则如下:
使用 Raw API 开发时,以下配置原则适用于 UART 及 LOGUART:
时钟选择:休眠前调用
RCC_PeriphClockSource_UART_ROM()选择时钟源若选 OSC2M,需设定
keep_OSC4M_on = TRUE。若选 XTAL,需设定
xtal_mode_in_sleep = XTAL_LPS_With_40M。
电压设置:需设置为
sleep_to_08V = TRUE,保证 OSC4M 或 XTAL 正常工作。
使用 Mbed API 开发时,以下配置原则 仅适用于 UART :
时钟选择:休眠前调用
serial_baud(),根据 UART 波特率和低功耗设置自动决定当波特率小于等于 115200 baud/s 且
.LOW_POWER_RX_ENABLE = ENABLE,自动选择 OSC2M,需设定keep_OSC4M_on = TRUE。如果波特率大于 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, }, ... };
电压设置:休眠电压需要设置为
sleep_to_08V = TRUE,保证 OSC4M 或 XTAL 正常工作。
备注
休眠时开启 XTAL,功耗将显著增大。
使用 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 detail */
};
参数名 |
含义 |
参数说明 |
|---|---|---|
keep_OSC4M_on |
休眠时 OSC4M 是否开启 |
TRUE:保持开启;FALSE:关闭 |
xtal_mode_in_sleep |
休眠时 XTAL 的工作模式 |
XTAL_OFF:关闭晶振 |
XTAL_LPS:低功耗模式维持 40MHz。 |
配置原则如下:
使用 Raw API 开发时,以下配置原则适用于 UART 及 LOGUART:
时钟选择:休眠前调用
RCC_PeriphClockSource_UART_ROM()选择时钟源若选 OSC2M,需设定
keep_OSC4M_on = TRUE。若选 XTAL,需设定
xtal_mode_in_sleep = XTAL_LPS。若选 XTAL/2,,需设定
xtal_mode_in_sleep = XTAL_LPS。
使用 Mbed API 开发时,以下配置原则 仅适用于 UART :
时钟选择:休眠前调用
serial_baud(),根据 UART 波特率和低功耗设置自动决定当波特率小于等于 115200 baud/s 且
.LOW_POWER_RX_ENABLE = ENABLE,自动选择 OSC2M,需设定keep_OSC4M_on = TRUE。如果波特率大于 115200 baud/s 或者
.LOW_POWER_RX_ENABLE = DISABLE,自动选择 XTAL,需设定xtal_mode_in_sleep = XTAL_LPS。
UARTCFG_TypeDef uart_config[4] = { /* UART0 */ { .LOW_POWER_RX_ENABLE = DISABLE, /*Enable low power RX*/ }, /* UART1 */ { .LOW_POWER_RX_ENABLE = DISABLE, }, ... };
备注
休眠时开启 XTAL,功耗将显著增大。
使用 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 detail */
};
参数名 |
含义 |
参数说明 |
|---|---|---|
keep_OSC4M_on |
休眠时 OSC4M 是否开启 |
TRUE:保持开启;FALSE:关闭 |
xtal_mode_in_sleep |
休眠时 XTAL 的工作模式 |
XTAL_OFF:关闭晶振 |
XTAL_LPS:低功耗模式维持 40MHz。 |
配置原则如下:
使用 Raw API 开发时,以下配置原则适用于 UART 及 LOGUART:
时钟选择:休眠前调用
RCC_PeriphClockSource_UART_ROM()选择时钟源若选 OSC2M,需设定
keep_OSC4M_on = TRUE。若选 XTAL,需设定
xtal_mode_in_sleep = XTAL_LPS。若选 XTAL/2,,需设定
xtal_mode_in_sleep = XTAL_LPS。
使用 Mbed API 开发时,以下配置原则 仅适用于 UART :
时钟选择:休眠前调用
serial_baud(),根据 UART 波特率和低功耗设置自动决定当波特率小于等于 115200 baud/s 且
.LOW_POWER_RX_ENABLE = ENABLE,自动选择 OSC2M,需设定keep_OSC4M_on = TRUE。如果波特率大于 115200 baud/s 或者
.LOW_POWER_RX_ENABLE = DISABLE,自动选择 XTAL,需设定xtal_mode_in_sleep = XTAL_LPS。
UARTCFG_TypeDef uart_config[4] = { /* UART0 */ { .LOW_POWER_RX_ENABLE = DISABLE, /*Enable low power RX*/ }, /* UART1 */ { .LOW_POWER_RX_ENABLE = DISABLE, }, ... };
备注
休眠时开启 XTAL,功耗将显著增大。
使用 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 detail */
};
参数名 |
含义 |
参数说明 |
|---|---|---|
keep_OSC4M_on |
休眠时 OSC4M 是否开启 |
TRUE:保持开启;FALSE:关闭 |
xtal_mode_in_sleep |
休眠时 XTAL 的工作模式 |
XTAL_OFF:关闭晶振 |
XTAL_LPS:低功耗模式维持 40MHz。 |
配置原则如下:
使用 Raw API 开发时,以下配置原则适用于 UART 及 LOGUART:
时钟选择:休眠前调用
RCC_PeriphClockSource_UART_ROM()选择时钟源若选 OSC2M,需设定
keep_OSC4M_on = TRUE。若选 XTAL,需设定
xtal_mode_in_sleep = XTAL_LPS。若选 XTAL/2,,需设定
xtal_mode_in_sleep = XTAL_LPS。
使用 Mbed API 开发时,以下配置原则 仅适用于 UART :
时钟选择:休眠前调用
serial_baud(),根据 UART 波特率和低功耗设置自动决定当波特率小于等于 115200 baud/s 且
.LOW_POWER_RX_ENABLE = ENABLE,自动选择 OSC2M,需设定keep_OSC4M_on = TRUE。如果波特率大于 115200 baud/s 或者
.LOW_POWER_RX_ENABLE = DISABLE,自动选择 XTAL,需设定xtal_mode_in_sleep = XTAL_LPS。
UARTCFG_TypeDef uart_config[4] = { /* UART0 */ { .LOW_POWER_RX_ENABLE = DISABLE, /*Enable low power RX*/ }, /* UART1 */ { .LOW_POWER_RX_ENABLE = DISABLE, }, ... };
备注
休眠时开启 XTAL,功耗将显著增大。
使用 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 detail */
};
参数名 |
含义 |
参数说明 |
|---|---|---|
keep_OSC4M_on |
休眠时 OSC4M 是否开启 |
TRUE:保持开启;FALSE:关闭 |
xtal_mode_in_sleep |
休眠时 XTAL 的工作模式 |
XTAL_OFF:关闭晶振 |
XTAL_LPS:低功耗模式维持 40MHz。 |
配置原则如下:
使用 Raw API 开发时,以下配置原则适用于 UART 及 LOGUART:
时钟选择:休眠前调用
RCC_PeriphClockSource_UART_ROM()选择时钟源若选 OSC2M,需设定
keep_OSC4M_on = TRUE。若选 XTAL,需设定
xtal_mode_in_sleep = XTAL_LPS。若选 XTAL/2,,需设定
xtal_mode_in_sleep = XTAL_LPS。
使用 Mbed API 开发时,以下配置原则 仅适用于 UART :
时钟选择:休眠前调用
serial_baud(),根据 UART 波特率和低功耗设置自动决定当波特率小于等于 115200 baud/s 且
.LOW_POWER_RX_ENABLE = ENABLE,自动选择 OSC2M,需设定keep_OSC4M_on = TRUE。如果波特率大于 115200 baud/s 或者
.LOW_POWER_RX_ENABLE = DISABLE,自动选择 XTAL,需设定xtal_mode_in_sleep = XTAL_LPS。
UARTCFG_TypeDef uart_config[4] = { /* UART0 */ { .LOW_POWER_RX_ENABLE = DISABLE, /*Enable low power RX*/ }, /* UART1 */ { .LOW_POWER_RX_ENABLE = DISABLE, }, ... };
备注
休眠时开启 XTAL,功耗将显著增大。
使用 UART 或者 LOGUART 作为唤醒源时,需要修改休眠时的电压和时钟源。
PSCFG_TypeDef ps_config = {
.km0_pg_enable = FALSE,
.km0_pll_off = TRUE,
.km0_audio_vad_on = FALSE,
.km0_config_psram = TRUE, /* if device enter sleep mode or not, false for keep active */
.km0_sleep_withM4 = TRUE,
.keep_OSC4M_on = FALSE,
.xtal_mode_in_sleep = XTAL_OFF,
.swr_mode_in_sleep = SWR_PFM,
};
其中可配置参数如下:
参数名 |
含义 |
参数说明 |
|---|---|---|
keep_OSC4M_on |
休眠时 OSC4M 是否开启 |
TRUE:保持开启;FALSE:关闭 |
xtal_mode_in_sleep |
休眠时 XTAL 的工作模式 |
XTAL_OFF:关闭晶振 |
XTAL_LPS:低功耗模式维持 40MHz。 |
其余参数修改请联系 RealTek 获取技术支持。
配置原则如下:
使用 Raw API 开发时,以下配置原则适用于 UART 及 LOGUART:
时钟选择:休眠前调用
RCC_PeriphClockSource_UART_ROM()选择时钟源若选 OSC2M,需设定
keep_OSC4M_on = TRUE。若选 XTAL,需设定
xtal_mode_in_sleep = XTAL_LPS。若选 XTAL 2M,需设定
xtal_mode_in_sleep = XTAL_LPS。
使用 Mbed API 开发时,以下配置原则 仅适用于 UART :
时钟选择:休眠前调用
serial_baud(),根据 UART 波特率和低功耗设置自动决定当波特率小于等于 115200 baud/s 且
.LOW_POWER_RX_ENABLE = ENABLE,自动选择 OSC2M,需设定keep_OSC4M_on = TRUE。如果波特率大于 115200 baud/s 或者
.LOW_POWER_RX_ENABLE = DISABLE,自动选择 XTAL,需设定xtal_mode_in_sleep = XTAL_LPS。
UARTCFG_TypeDef uart_config[4] = { /* UART0 */ { .LOW_POWER_RX_ENABLE = DISABLE, /*Enable low power RX*/ }, /* UART1 */ { .LOW_POWER_RX_ENABLE = DISABLE, }, ... };
备注
休眠时开启 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。