开发者配置(Usrcfg)
本节介绍 Sleep 和 Deep Sleep 两种睡眠模式的唤醒源配置方法。
配置流程
Sleep 配置流程
一个唤醒源如果要从 Sleep 唤醒系统,其自身一定要正确初始化,并且需要触发对应的唤醒事件。配置唤醒源将系统从 Sleep 唤醒,请遵循如下步骤:
初始化对应唤醒源,并注册其中断处理函数
根据 唤醒源配置 配置唤醒源的唤醒掩码
根据 时钟和电压配置 检查是否需要额外配置 clock 和 power 状态
通过
pmu_set_sleep_type()设置睡眠类型为 CG 还是 PG(默认休眠类型是 PG)释放 Sleep wakelock,等待系统进入 Sleep 模式
Sleep 时,唤醒源中断产生,唤醒系统,并执行对应的中断处理函数
小技巧
在步骤 1 注册完成之后,可以在系统 Active 时触发中断,检查是否能够正确进入到对应的中断处理函数,以确保唤醒源被正确初始化。
示例代码可参考 Sleep 示例。
Deep Sleep 配置流程
一个唤醒源如果要从 Deep Sleep 唤醒系统,需遵循以下步骤:
初始化对应唤醒源,无须设置唤醒掩码等额外参数
释放 Sleep wakelock 和 Deep Sleep wakelock,等待系统进入 Deep Sleep 模式
系统唤醒以后,需根据唤醒事件处理对应唤醒源唤醒后的行为
示例代码可参考 Deep Sleep 示例。
小技巧
从 Deep Sleep 唤醒后,由于 CPU 重新上电,睡眠前注册的中断都已丢失。用户可通过 SOCPS_AONWakeReason() 获取唤醒事件,根据 唤醒事件注册对应的中断进行处理。
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 专用,不可修改。
WAKEUP_AP :唤醒 KM4TZ
WAKEUP_NP :唤醒 KM4NS
WAKEUP_NULL :禁用该唤醒源
例如设置 {WAKE_SRC_UART0, WAKEUP_AP},则表示 UART0 要唤醒 KM4TZ;
设置 {WAKE_SRC_UART0, WAKEUP_NP},则表示 UART0 要唤醒 KM4NS。唤醒掩码应该设置为用户运行应用的 CPU,保持中断和唤醒源设置都是同一个 CPU。
备注
如果选择唤醒 KM4TZ,则 KM4NS 也会被唤醒。
SDK 中已经设定好唤醒掩码的唤醒源,不可修改。例如
{WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_NP}是 Wi-Fi 专用,不可修改。
小技巧
除修改 sleep_wevent_config[] 外,用户还可以通过 SOCPS_SetAPWakeEvent() 、 SOCPS_SetNPWakeEvent() 等 API 修改唤醒源配置。
时钟和电压配置
某些唤醒源需要在休眠时配置 OSC、XTAL 以及 MCU Core 电压等参数才能工作,可通过 ps_config[] 结构体进行配置。
使用 UART 或者 LOGUART 作为唤醒源时,需要修改休眠时的电压和时钟源。可配置参数如下:
struct 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 */
.sleep_to_08V = FALSE, /* default sleep to 0.7V, set this option to TRUE will sleep to 0.8V */
};
参数 |
含义 |
参数说明 |
|---|---|---|
|
休眠时 OSC4M 是否开启 |
|
|
休眠时 XTAL 的工作模式 |
|
|
休眠时 MCU Core 电压 |
|
配置原则如下:
使用 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[3] = { /* 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 作为唤醒源时,需要修改休眠时的时钟源。可配置参数如下:
struct 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 */
};
参数 |
含义 |
参数说明 |
|---|---|---|
|
休眠时 OSC4M 是否开启 |
|
|
休眠时 XTAL 的工作模式 |
|
配置原则如下:
使用 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 作为唤醒源时,需要修改休眠时的时钟源。可配置参数如下:
struct 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 */
};
参数 |
含义 |
参数说明 |
|---|---|---|
|
休眠时 OSC4M 是否开启 |
|
|
休眠时 XTAL 的工作模式 |
|
配置原则如下:
使用 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 作为唤醒源时,需要修改休眠时的时钟源。可配置参数如下:
struct 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 */
};
参数 |
含义 |
参数说明 |
|---|---|---|
|
休眠时 OSC4M 是否开启 |
|
|
休眠时 XTAL 的工作模式 |
|
配置原则如下:
使用 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 作为唤醒源时,需要修改休眠时的时钟源。可配置参数如下:
struct 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 */
};
参数 |
含义 |
参数说明 |
|---|---|---|
|
休眠时 OSC4M 是否开启 |
|
|
休眠时 XTAL 的工作模式 |
|
配置原则如下:
使用 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 作为唤醒源时,需要修改休眠时的时钟源。可配置参数如下:
struct PSCFG_TypeDef ps_config = {
.km0_audio_vad_on = FALSE,
.keep_osc4m_on = FALSE, /* keep OSC4M off or on during sleep */
.xtal_mode_in_sleep = XTAL_OFF, /* set xtal mode during sleep mode */
};
参数 |
含义 |
参数说明 |
|---|---|---|
|
休眠时 OSC4M 是否开启 |
|
|
休眠时 XTAL 的工作模式 |
|
其余参数修改请联系 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,功耗将显著增大。
使用 UART 或者 LOGUART 作为唤醒源时,需要修改休眠时的电压和时钟源。可配置参数如下:
struct PSCFG_TypeDef ps_config = {
.keep_osc4m_on = FALSE, /* keep OSC4M off or on during sleep */
.xtal_mode_in_sleep = XTAL_OFF, /* set xtal mode during sleep mode */
.sleep_to_08V = FALSE, /* default sleep to 0.7V, set this option to TRUE will sleep to 0.8V */
};
参数 |
含义 |
参数说明 |
|---|---|---|
|
休眠时 OSC4M 是否开启 |
|
|
休眠时 XTAL 的工作模式 |
|
|
休眠时 MCU Core 电压 |
|
配置原则如下:
使用 Raw API 开发时,以下配置原则适用于 UART 及 LOGUART:
时钟选择:休眠前调用
RCC_PeriphClockSourceSet()选择时钟源:若选 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时,自动选择 OSC4M,需设定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,功耗将显著增大。
Deep Sleep 唤醒源配置
唤醒源
以下唤醒源支持从 Deep Sleep 模式唤醒系统:
AON Timer
RTC
BOR
PWR_DOWN
AON Wakepin
参数配置
Deep Sleep 唤醒源不仅可以将系统从 Deep Sleep 模式唤醒,也可以将系统从 Sleep 模式唤醒。Deep Sleep 时无须配置 Sleep 唤醒掩码、电压等参数。
唤醒引脚配置
唤醒引脚是一组特殊的 GPIO,既可以在 Deep Sleep 模式下唤醒,也可以在 Sleep 模式下唤醒。
在 Sleep 模式下,唤醒引脚对应的引脚可以复用为 GPIO 功能,设置为 GPIO 唤醒,也可以选择作为唤醒引脚功能唤醒。
示例代码可参考 唤醒引脚示例。