概述
本章主要介绍在开发过程中需要重点关注和按需修改的各种配置文件。
ameba_bootcfg
本节介绍与启动相关的配置,包括 SoC 时钟切换和启动日志。
github source code
KM4 在 BootRom 阶段以 200MHz 运行,并在 bootloader 阶段切换至更高频率。
修改 SoC 时钟时存在以下限制:
项目 |
频率 |
核心电压 |
---|---|---|
PLL |
300MHz ~ 688.128MHz |
|
KM0 |
≤105MHz |
0.9V |
KM0 |
≤115MHz |
1.0V |
KM4 |
≤262MHz |
0.9V |
KM4 |
≤345MHz |
1.0V |
备注
SDK 中默认 Flash 是 3.3V 供电,初始化时会默认将 Flash 切换到不超过 104MHz 限制的最高速率。
宽压 IC 中,Flash 的工作频率上限,应遵循 1.65V~2.3V 供电区间的速率限制,可以参考 ameba_flashcfg 降速或者找 realtek 寻找帮助。
SoC & PSRAM 时钟设置流程
确认
ameba_bootcfg.c
文件中Boot_SocClk_Info_Idx
和SocClk_Info[]
的值。1// for km4, max 345MHz under 1.0v, max 262MHz under 0.9v 2// for km0, max 115MHz under 1.0v, max 105MHz under 0.9v 3// PLL can be 300MHz~688.128MHz 4// KM4_CKD range is [1, 8], KM0_CKD range is [1, 16] or USEXTAL 5const SocClk_Info_TypeDef SocClk_Info[] = { 6 /* PLL_CLK, Vol_Type, KM4_CKD, KM0_CKD, PSRAMC_CKD*/ 7 /* This group is to reduce the impact of PSRAM on RF, the frequency is specially selected */ 8 {PLL_524M, CORE_VOL_0P9, CLKDIV(2), CLKDIV(5), CLKDIV(2)}, // For SiP Psram 9 {PLL_392M, CORE_VOL_0P9, CLKDIV(2), CLKDIV(4), CLKDIV(1)}, // For SiP Psram 10 {PLL_334M, CORE_VOL_1P0, CLKDIV(1), CLKDIV(3), CLKDIV(1)}, // For SiP Psram 11 /* This group is to reduce the impact of Flash on RF, the frequency is specially selected. 12 Single die use the same settings. */ 13 {PLL_512M, CORE_VOL_0P9, CLKDIV(2), CLKDIV(5), CLKDIV(2)}, // For SiP Flash or single die (No Psram) 14 {PLL_400M, CORE_VOL_0P9, CLKDIV(2), CLKDIV(4), CLKDIV(1)}, // For SiP Flash or single die (No Psram) 15 {PLL_334M, CORE_VOL_1P0, CLKDIV(1), CLKDIV(3), CLKDIV(1)}, // For SiP Flash or single die (No Psram) 16 /* The following frequency settings are not adjustable */ 17 {PLL_480M, CORE_VOL_0P9, CLKDIV(2), CLKDIV(5), CLKDIV(2)}, // 48M for usb, both For SiP Psram / SiP Flash / single die 18 {PLL_677P376M, CORE_VOL_1P0, CLKDIV(2), CLKDIV(6), CLKDIV(2)}, // Audio 19 {PLL_688P128M, CORE_VOL_1P0, CLKDIV(2), CLKDIV(6), CLKDIV(2)}, // Audio 20}; 21 22/** 23* @brif SocClk_Info select. One of Valid_Boot_Idx_for_SiP_Psram or Valid_Boot_Idx_for_No_Psram depend on different chip types 24* Boot_SocClk_Info_Idx is [0, sizeof(SocClk_Info)), Soc will set socclk by SocClk_Info[Boot_SocClk_Info_Idx] 25*/ 26#ifdef CONFIG_USB_DEVICE_EN 27u8 Boot_SocClk_Info_Idx = 6; /* Make sure the PLL_CLK for USB is an integer multiple of 48MHz */ 28#else 29u8 Boot_SocClk_Info_Idx = 6; /* 480M has an acceptable impact on the RF performance of SiP Psram and SiP Flash */ 30#endif
由于 PSRAM 或 Flash 的部分频率会干扰 RF,
bootloaderbootloader_km4.c
文件中的BOOT_ChipInfo_ClkInfoIdx()
函数只允许Boot_SocClk_Info_Idx
表示的索引在SocClk_Info
数组内。备注
不建议修改
SocClk_Info
,如果需要SocClk_Info
之外的频率组合,需要确认该配置是否会影响 RF 性能。u32 BOOT_ChipInfo_ClkInfoIdx(void) { /* PSRAM die is wb955 which can run up to 200MHz */ ... return Boot_SocClk_Info_Idx; }
Bootloader 将根据
SocClk_Info[Boot_SocClk_Info_Idx]
的定义来配置 SoC 电压和时钟,PSRAMC (PSRAM 时钟的两倍) 速率也将随 SoC 时钟同步调整,其余模块时钟将由软件根据其最大运行速度自动设置为合理值,以Boot_SocClk_Info_Idx
的值是 0 和 4 为例:PSRAM type
PSRAM speed
SocClk_Info[x]
Clock Info
无 PSRAM
SocClk_Info[4]
PLL: 400MHz
KM4: PLL/2
KM0: PLL/4
有 PSRAM
≤200MHz
SocClk_Info[0]
PLL: 524MHz
KM4: PLL/2
KM0: PLL/5
PSRAMC: PLL/2
必要时,参考以下方法来修改 SoC 时钟:
将
Boot_SocClk_Info_Idx
修改为[0, sizeof(SocClk_Info)]
范围内的值,然后在SocClk_Info[Boot_SocClk_Info_Idx]
中自定义时钟配置信息。
备注
请充分考虑硬件的限制,避免设置非法的时钟配置参数。
重新编译工程,并下载新的固件
Boot_Agg_En
Boot_Agg_En
参数需配合 Trace Tool 使用,用于分类输出来自不同核的启动日志。可通过设置 Boot_Agg_EN
来启用该功能。
/**
* @brief Loguart AGG enable or disable
* FALSE: disable
* TRUE: enable
*/
u8 Boot_Agg_En = FALSE;
备注
更多详细信息请参考 Trace Tool。
github source code
KM4 在 BootRom 阶段以 150MHz 运行,并在 bootloader 阶段切换至更高频率。
修改 SoC 时钟时存在以下限制:
时钟 |
频率 |
核心电压 |
---|---|---|
PLLM |
330MHz ~ 660MHz |
|
PLLD |
330MHz ~ 660MHz |
|
KM4/KR4 |
≤300MHz |
0.9V |
KM4/KR4 |
≤400MHz |
1.0V |
SoC & PSRAM 时钟设置流程
(可选)确认内置 PSRAM 器件的速率限制(若不明确具体参数)
参考
bootloaderbootloader_km4.c
文件中的BOOT_ChipInfo_PSRAMType()
函数,打印PSRAM_CLK_LIMIT_GET(ChipInfo_PSRAMType())
的值,可以从 OTP 中读取内置 PSRAM 的速率限制参考芯片的规格书,了解内置 PSRAM 的速率限制
确认 Boot_SocClk_Info_Idx 的值,以及
ameba_bootcfg.c
文件中的时钟信息。1// for kr4/km4, max 400MHz under 1.0v, max 200MHz under 0.9v 2// for dsp, max 500MHz under 1.0v, max 400MHz under 0.9v 3// CPUPLL(PLLM)/DSPPLL(PLLD) can be 330MHz~660MHz 4// All CLKDIV range is [1, 16] 5SocClk_Info_TypeDef SocClk_Info[] = { 6 /* PLLM_CLK, PLLD_CLK, Vol_Type, CPU_CKD, PSRAMC_CKD */ 7 {PLL_600M, PLL_500M, CORE_VOL_0P9, CLKDIV(3) | ISPLLM, CLKDIV(2) | ISPLLM}, /* 0.9V, PSRAM-166M */ 8 {PLL_600M, PLL_500M, CORE_VOL_1P0, CLKDIV(3) | ISPLLM, CLKDIV(2) | ISPLLM}, /* 1.0V, PSRAM-166M */ 9 {PLL_400M, PLL_500M, CORE_VOL_1P0, CLKDIV(2) | ISPLLM, CLKDIV(1) | ISPLLM}, /* 1.0V, PSRAM-200M */ 10 {PLL_480M, PLL_500M, CORE_VOL_1P0, CLKDIV(2) | ISPLLM, CLKDIV(1) | ISPLLD}, /* 1.0V, PSRAM-250M */ 11}; 12 13/** 14* @brif SocClk_Info select 15* Boot_SocClk_Info_Idx valid value is [0, 3] and 0xFF 16* when Boot_SocClk_Info_Idx is 0xFF, set socclk by chipinfo Automatically 17* when Boot_SocClk_Info_Idx is [0, 3], set socclk by SocClk_Info[Boot_SocClk_Info_Idx] 18*/ 19u8 Boot_SocClk_Info_Idx = 0xFF;
如果 Boot_SocClk_Info_Idx 为 0xFF(默认),bootloader 将根据内置 PSRAM 类型自动设置 SoC 时钟。
如果 Boot_SocClk_Info_Idx 不是 0xFF,bootloader 将根据
SocClk_Info[Boot_SocClk_Info_Idx]
的定义来配置 SoC 时钟。
例如,如果 Boot_SocClk_Info_Idx 为
0
,PSRAM 的最高运行频率为 166MHz,bootloader 将采用SocClk_Info[0]
进行配置, 即 KM4/KR4 的时钟频率等于 PLLM 频率的 1/3,PSRAMC (PSRAM 时钟的两倍) 速率也将设置为 PLLM 频率的 1/2,其余模块时钟将由软件根据其最大运行速度自动设置为合理值。PSRAM 类型
PSRAM 速度
SocClk_Info[x]
时钟信息
无 PSRAM
SocClk_Info[0]
PLLM: 600MHz
PLLD: 500MHz
KM4/KR4: PLLM/3
有 PSRAM
≤166MHz
SocClk_Info[1]
PLLM: 600MHz
PLLD: 500MHz
KM4/KR4: PLLM/3
PSRAMC: PLLM/2
≤200MHz
SocClk_Info[2]
PLLM: 400MHz
PLLD: 500MHz
KM4/KR4: PLLM/2
PSRAMC: PLLM
必要时,参考以下方法来修改 SoC 时钟:
保持
Boot_SocClk_Info_Idx
为0xFF
,仅修改SocClk_Info[x]
中的时钟参数,即可设置 PLLM/PLLD 和 CPU 的时钟。将
Boot_SocClk_Info_Idx
修改为[0, sizeof(SocClk_Info)]
范围内的值,然后在SocClk_Info[Boot_SocClk_Info_Idx]
中自定义时钟配置信息。
备注
请充分考虑硬件的限制,避免设置非法的时钟配置参数。
如果不需要 PLLD,可以将其禁用。
重新编译工程,并下载新的固件
Boot_Agg_En
Boot_Agg_En
参数需配合 Trace Tool 使用,用于分类输出来自不同核的启动日志。可通过设置 Boot_Agg_EN
来启用该功能。
/**
* @brief Loguart AGG enable or disable
* FALSE: disable
* TRUE: enable
*/
u8 Boot_Agg_En = FALSE;
备注
更多详细信息请参考 Trace Tool。
github source code
KM4 在 BootRom 阶段以 150MHz 运行,并在 bootloader 阶段切换至更高频率。
修改 SoC 时钟时存在以下限制:
时钟 |
频率 |
核心电压 |
说明 |
---|---|---|---|
PLLM |
330MHz ~ 660MHz |
||
PLLD |
330MHz ~ 660MHz |
不能超过 DSP 的最大时钟频率 |
|
KM4/KR4 |
≤300MHz |
0.9V |
|
KM4/KR4 |
≤400MHz |
1.0V |
|
DSP |
≤400MHz |
0.9V |
同 PLLD |
DSP |
≤500MHz |
1.0V |
同 PLLD |
SoC & PSRAM 时钟设置流程
(可选)确认内置 PSRAM 器件的速率限制(若不明确具体参数)
参考
bootloaderbootloader_km4.c
文件中的BOOT_ChipInfo_PSRAMType()
函数,打印PSRAM_CLK_LIMIT_GET(ChipInfo_PSRAMType())
的值,可以从 OTP 中读取内置 PSRAM 的速率限制参考芯片的规格书,了解内置 PSRAM 的速率限制
确认 Boot_SocClk_Info_Idx 的值,以及
ameba_bootcfg.c
文件中的时钟信息。1// for kr4/km4, max 400MHz under 1.0v, max 200MHz under 0.9v 2// for dsp, max 500MHz under 1.0v, max 400MHz under 0.9v 3// CPUPLL(PLLM)/DSPPLL(PLLD) can be 330MHz~660MHz 4// All CLKDIV range is [1, 16] 5SocClk_Info_TypeDef SocClk_Info[] = { 6 /* PLLM_CLK, PLLD_CLK, Vol_Type, CPU_CKD, PSRAMC_CKD */ 7 {PLL_600M, PLL_500M, CORE_VOL_0P9, CLKDIV(3) | ISPLLM, CLKDIV(2) | ISPLLM}, /* 0.9V, PSRAM-166M */ 8 {PLL_600M, PLL_500M, CORE_VOL_1P0, CLKDIV(3) | ISPLLM, CLKDIV(2) | ISPLLM}, /* 1.0V, PSRAM-166M */ 9 {PLL_400M, PLL_500M, CORE_VOL_1P0, CLKDIV(2) | ISPLLM, CLKDIV(1) | ISPLLM}, /* 1.0V, PSRAM-200M */ 10 {PLL_480M, PLL_500M, CORE_VOL_1P0, CLKDIV(2) | ISPLLM, CLKDIV(1) | ISPLLD}, /* 1.0V, PSRAM-250M */ 11}; 12 13/** 14* @brif SocClk_Info select 15* Boot_SocClk_Info_Idx valid value is [0, 3] and 0xFF 16* when Boot_SocClk_Info_Idx is 0xFF, set socclk by chipinfo Automatically 17* when Boot_SocClk_Info_Idx is [0, 3], set socclk by SocClk_Info[Boot_SocClk_Info_Idx] 18*/ 19u8 Boot_SocClk_Info_Idx = 0xFF;
如果 Boot_SocClk_Info_Idx 为 0xFF(默认),bootloader 将根据内置 PSRAM 类型自动设置 SoC 时钟。
如果 Boot_SocClk_Info_Idx 不是 0xFF,bootloader 将根据
SocClk_Info[Boot_SocClk_Info_Idx]
的定义来配置 SoC 时钟。
例如,如果 Boot_SocClk_Info_Idx 为
0
,PSRAM 的最高运行频率为 166MHz,bootloader 将采用SocClk_Info[0]
进行配置,即 KM4/KR4 的时钟频率等于 PLLM 频率的 1/3,PSRAMC (PSRAM 时钟的两倍) 速率也将设置为 PLLM 频率的 1/2,其余模块时钟将由软件根据其最大运行速度自动设置为合理值。PSRAM 类型
PSRAM 速度
SocClk_Info[x]
时钟信息
有 PSRAM
≤250MHz
SocClk_Info[3]
PLLM: 480MHz
PLLD: 500MHz
KM4/KR4: PLLM/2
PSRAMC: PLLD
DSP: PLLD
必要时,参考以下方法来修改 SoC 时钟:
保持
Boot_SocClk_Info_Idx
为0xFF
,仅修改SocClk_Info[x]
中的时钟参数,即可设置 PLLM/PLLD 和 CPU 的时钟。将
Boot_SocClk_Info_Idx
修改为[0, sizeof(SocClk_Info)]
范围内的值,然后在SocClk_Info[Boot_SocClk_Info_Idx]
中自定义时钟配置信息。
备注
请充分考虑硬件的限制,避免设置非法的时钟配置参数。
重新编译工程,并下载新的固件
Boot_Agg_En
Boot_Agg_En
参数需配合 Trace Tool 使用,用于分类输出来自不同核的启动日志。可通过设置 Boot_Agg_EN
来启用该功能。
/**
* @brief Loguart AGG enable or disable
* FALSE: disable
* TRUE: enable
*/
u8 Boot_Agg_En = FALSE;
备注
更多详细信息请参考 Trace Tool。
github source code
KM4 在 BootRom 阶段以 150MHz 运行,并在 bootloader 阶段切换至更高频率。
修改 SoC 时钟时存在以下限制:
时钟 |
频率 |
核心电压 |
说明 |
---|---|---|---|
PLLM |
330MHz ~ 660MHz |
||
PLLD |
330MHz ~ 660MHz |
不能超过 DSP 的最大时钟频率 |
|
KM4/KR4 |
≤300MHz |
0.9V |
|
KM4/KR4 |
≤400MHz |
1.0V |
|
DSP |
≤400MHz |
0.9V |
同 PLLD |
DSP |
≤500MHz |
1.0V |
同 PLLD |
SoC & PSRAM 时钟设置流程
(可选)确认内置 PSRAM 器件的速率限制(若不明确具体参数)
参考
bootloaderbootloader_km4.c
文件中的BOOT_ChipInfo_PSRAMType()
函数,打印PSRAM_CLK_LIMIT_GET(ChipInfo_PSRAMType())
的值,可以从 OTP 中读取内置 PSRAM 的速率限制参考芯片的规格书,了解内置 PSRAM 的速率限制
确认 Boot_SocClk_Info_Idx 的值,以及
ameba_bootcfg.c
文件中的时钟信息。1// for kr4/km4, max 400MHz under 1.0v, max 200MHz under 0.9v 2// for dsp, max 500MHz under 1.0v, max 400MHz under 0.9v 3// CPUPLL(PLLM)/DSPPLL(PLLD) can be 330MHz~660MHz 4// All CLKDIV range is [1, 16] 5SocClk_Info_TypeDef SocClk_Info[] = { 6 /* PLLM_CLK, PLLD_CLK, Vol_Type, CPU_CKD, PSRAMC_CKD */ 7 {PLL_600M, PLL_500M, CORE_VOL_0P9, CLKDIV(3) | ISPLLM, CLKDIV(2) | ISPLLM}, /* 0.9V, PSRAM-166M */ 8 {PLL_600M, PLL_500M, CORE_VOL_1P0, CLKDIV(3) | ISPLLM, CLKDIV(2) | ISPLLM}, /* 1.0V, PSRAM-166M */ 9 {PLL_400M, PLL_500M, CORE_VOL_1P0, CLKDIV(2) | ISPLLM, CLKDIV(1) | ISPLLM}, /* 1.0V, PSRAM-200M */ 10 {PLL_480M, PLL_500M, CORE_VOL_1P0, CLKDIV(2) | ISPLLM, CLKDIV(1) | ISPLLD}, /* 1.0V, PSRAM-250M */ 11}; 12 13/** 14* @brif SocClk_Info select 15* Boot_SocClk_Info_Idx valid value is [0, 3] and 0xFF 16* when Boot_SocClk_Info_Idx is 0xFF, set socclk by chipinfo Automatically 17* when Boot_SocClk_Info_Idx is [0, 3], set socclk by SocClk_Info[Boot_SocClk_Info_Idx] 18*/ 19u8 Boot_SocClk_Info_Idx = 0xFF;
如果 Boot_SocClk_Info_Idx 为 0xFF(默认),bootloader 将根据内置 PSRAM 类型自动设置 SoC 时钟。
如果 Boot_SocClk_Info_Idx 不是 0xFF,bootloader 将根据
SocClk_Info[Boot_SocClk_Info_Idx]
的定义来配置 SoC 时钟。
例如,如果 Boot_SocClk_Info_Idx 为
0
,PSRAM 的最高运行频率为 166MHz,bootloader 将采用SocClk_Info[0]
进行配置,即 KM4/KR4 的时钟频率等于 PLLM 频率的 1/3,PSRAMC (PSRAM 时钟的两倍) 速率也将设置为 PLLM 频率的 1/2,其余模块时钟将由软件根据其最大运行速度自动设置为合理值。PSRAM 类型
PSRAM 速度
SocClk_Info[x]
时钟信息
有 PSRAM
≤250MHz
SocClk_Info[3]
PLLM: 480MHz
PLLD: 500MHz
KM4/KR4: PLLM/2
PSRAMC: PLLD
DSP: PLLD
必要时,参考以下方法来修改 SoC 时钟:
保持
Boot_SocClk_Info_Idx
为0xFF
,仅修改SocClk_Info[x]
中的时钟参数,即可设置 PLLM/PLLD 和 CPU 的时钟。将
Boot_SocClk_Info_Idx
修改为[0, sizeof(SocClk_Info)]
范围内的值,然后在SocClk_Info[Boot_SocClk_Info_Idx]
中自定义时钟配置信息。
备注
请充分考虑硬件的限制,避免设置非法的时钟配置参数。
重新编译工程,并下载新的固件
Boot_Agg_En
Boot_Agg_En
参数需配合 Trace Tool 使用,用于分类输出来自不同核的启动日志。可通过设置 Boot_Agg_EN
来启用该功能。
/**
* @brief Loguart AGG enable or disable
* FALSE: disable
* TRUE: enable
*/
u8 Boot_Agg_En = FALSE;
备注
更多详细信息请参考 Trace Tool。
github source code
KM4 在 BootRom 阶段以 200MHz 运行,并在 bootloader 阶段切换至更高频率。
修改 SoC 时钟时存在以下限制:
时钟 |
频率 |
核心电压 |
说明 |
---|---|---|---|
NPPLL |
800MHz ~ 1.0GHz |
||
APPLL |
1.0GHz ~ 1.6GHz |
不能超过 CA32 的最大时钟频率 |
|
KM4 |
≤250MHz |
0.9V |
|
KM4 |
≤333MHz |
1.0V |
|
CA32 |
≤920MHz |
0.9V |
|
CA32 |
≤1200MHz |
1.0V |
当 Memory Type 是 ddr 时,上限是 1320MHz |
SoC & PSRAM 时钟设置流程
确认
ameba_bootcfg.c
文件中SocClk_Info[]
的值。1// for km4, max 333MHz under 1.0v, max 250MHz under 0.9v 2// for AP, max 1200MHz under 1.0v, max 920MHz under 0.9v 3// NP PLL can be 800MHz~1000MHz 4SocClk_Info_TypeDef SocClk_Info[1] = { 5 /* NPPLL_CLK, APPLL_Clk, Vol_Type, KM4_CPU_CKD, AP_CPU_CKD */ 6 {NPPLL_1000M, APPLL_1200M, VOL_10, CLKDIV(3), CLKDIV(1) | ISAPPLL}, //best porformance 7 // {NPPLL_920M, APPLL_NULL, VOL_09, CLKDIV(4), CLKDIV(1) | ISNPPLL}, 8};
Bootloader 将根据
SocClk_Info[0]
的定义来配置 SoC 电压和时钟,其余模块时钟将由软件根据其最大运行速度自动设置为合理值:KM4 Clock: NPPLL / SocClk_Info[0].KM4_CPU_CKD
CA32 Clock: 如果 SocClk_Info[0].AP_CPU_CKD 为 ISAPPLL,则 CA32 Clock = APPLL / SocClk_Info[0].AP_CPU_CKD,否则 CA32 Clock = NPPLL / SocClk_Info[0].AP_CPU_CKD
必要时,在
SocClk_Info
中自定义时钟配置信息。备注
请充分考虑硬件的限制,避免设置非法的时钟配置参数。
重新编译工程,并下载新的固件
Boot_Agg_En
Boot_Agg_En
参数需配合 Trace Tool 使用,用于分类输出来自不同核的启动日志。可通过设置 Boot_Agg_EN
来启用该功能。
/**
* @brief Loguart AGG enable or disable
* FALSE: disable
* TRUE: enable
*/
u8 Boot_Agg_En = FALSE;
备注
更多详细信息请参考 Trace Tool。
github source code
KM4TZ 在 BootRom 阶段以 200MHz 运行,并在 bootloader 阶段切换至更高频率。
修改 SoC 时钟时存在以下限制:
时钟 |
频率 |
核心电压 |
---|---|---|
USBPLL |
≤500MHz |
|
SYSPLL |
600MHz ~ 1.0GHz |
|
CPU |
≤266.7MHz |
0.9V |
CPU |
≤333.34MHz |
1.0V |
SoC 时钟设置流程
确认
ameba_bootcfg.c
文件中SocClk_Info[]
的值。1SocClk_Info_TypeDef SocClk_Info[1] = { 2 /* USBPLL_CLK, SYSPLL_CLK, Vol_Type, CPU_CKD*/ 3#if defined CLKCFG_0P9_NO_SYSPLL 4 /* 1. Low power consumption scenario. (CPU clk: 240Mhz) */ 5 {PLL_960M, PLL_NONE, CORE_VOL_0P9, CLKDIV(4) | IS_USB_PLL}, 6#elif defined CLKCFG_0P9_RMII_USB 7 /* 2. Use RMII or/and USB peripherals. (CPU clk: 240Mhz) */ 8 {PLL_960M, PLL_400M, CORE_VOL_0P9, CLKDIV(4) | IS_USB_PLL}, 9#elif defined CLKCFG_0P9_AUDIO98P304M_USB 10 /* 3. Use Audio or/and USB peripherals. (CPU clk: 240Mhz) */ 11 {PLL_960M, PLL_393P216M, CORE_VOL_0P9, CLKDIV(4) | IS_USB_PLL}, 12#elif defined CLKCFG_0P9_AUDIO45P1584M_USB 13 /* 4. Use Audio or/and RMII peripherals. (CPU clk: 240Mhz) */ 14 {PLL_960M, PLL_361P2672M, CORE_VOL_0P9, CLKDIV(4) | IS_USB_PLL}, 15#elif defined CLKCFG_0P9_AUDIO_RMII 16 /* 5. Use Audio or/and RMII peripherals. (CPU clk: 266.7Mhz) */ 17 {PLL_800M, PLL_393P216M, CORE_VOL_0P9, CLKDIV(3) | IS_USB_PLL}, 18#elif defined CLKCFG_1P0_RMII_USB 19 /* 6. 1P0_RMII_USB: Use RMII or/and USB peripherals. (CPU clk: 320Mhz) */ 20 {PLL_960M, PLL_400M, CORE_VOL_1P0, CLKDIV(3) | IS_USB_PLL}, 21#elif defined CLKCFG_1P0_AUDIO_USB 22 /* 7. 1P0_AUDIO_USB: Use Audio or/and USB peripherals. (CPU clk: 320Mhz) */ 23 {PLL_960M, PLL_393P216M, CORE_VOL_1P0, CLKDIV(3) | IS_USB_PLL}, 24#elif defined CLKCFG_1P0_AUDIO_RMII 25 /* 8. 1P0_AUDIO_RMII: Use Audio or/and RMII peripherals. (CPU clk: 333.3Mhz) */ 26 {PLL_1000M, PLL_393P216M, CORE_VOL_1P0, CLKDIV(3) | IS_USB_PLL}, 27#else 28#error "Incorrect clock config" 29#endif 30};
Bootloader 将根据
SocClk_Info[0]
的定义来配置 SoC 电压和时钟,其余模块时钟将由软件根据其最大运行速度自动设置为合理值:CPU Clock: 如果 SocClk_Info[0].CPU_CKD 为 IS_USB_PLL,则 CPU Clock = USBPLL / SocClk_Info[0].CPU_CKD,否则 CPU Clock = SYSPLL / SocClk_Info[0].CPU_CKD
必要时,在
SocClk_Info
中自定义时钟配置信息。备注
请充分考虑硬件的限制,避免设置非法的时钟配置参数。
如果不需要 USBPLL 或者 SYSPLL,可以将其禁用。
重新编译工程,并下载新的固件
Boot_Agg_En
Boot_Agg_En
参数需配合 Trace Tool 使用,用于分类输出来自不同核的启动日志。可通过设置 Boot_Agg_EN
来启用该功能。
/**
* @brief Loguart AGG enable or disable
* FALSE: disable
* TRUE: enable
*/
u8 Boot_Agg_En = FALSE;
备注
更多详细信息请参考 Trace Tool。
ameba_flashcfg
本节介绍与 Flash 相关的配置,包括 Flash 的速度、读取模式、布局和保护模式。
github source code
Flash_Speed
SPIC 在 BootRom 阶段的频率是 XTAL(40MHz),并在 Bootloader 阶段切换至更高频率。
Flash 运行速率为 SPIC 控制器速率的一半,SPIC 控制器的速率默认由 PLL 分频得到,但是必须低于 SPIC_CLK_LIMIT
(208MHz)。
如需降低 Flash 的运行速率,请修改 Flash_Speed
(对应 SPIC0)或 Data_Flash_Speed
(对应 SPIC1)的值,即 PLL 的分频系数。
const u16 Flash_Speed = CLKDIV(2);
const u16 Data_Flash_Speed = CLKDIV(2);
备注
参阅 ameba_bootcfg 获取更多关于 PLL 的信息。
Flash 最高时钟频率为
SPIC_CLK_LIMIT/2
。初始化流程将自动检测配置频率是否超过此上限。初始化时已经将 Flash 设为为最佳性能,所以不建议修改
Flash_Speed
和Flash_ReadMode
或者Data_Flash_Speed
和Data_Flash_ReadMode
。
Flash_ReadMode
SPIC 在 BootRom 阶段工作在 1IO 模式,并在 Bootloader 阶段切换至 Flash_ReadMode
的值指定的模式(默认 4IO),若当前配置的读取模式不支持,系统将自动尝试其他模式,直至找到适合的模式。
Flash_Layout
SDK 中的默认 Flash 布局详见章节 Flash 布局。如需修改 Flash 布局,请参考章节 Flash 布局修改。
启用 Flash 保护
更多关于此功能的详细信息,请参考章节 Flash 写保护机制。
github source code
Flash_Speed
SPIC 在 BootRom 阶段的频率是 XTAL(40MHz),并在 Bootloader 阶段切换至更高频率。
Flash 运行速率为 SPIC 控制器速率的一半,SPIC 控制器的速率默认由 PLLM 分频得到,但是必须低于 SPIC_CLK_LIMIT
(208MHz)。
如需降低 Flash 的运行速率,请修改 Flash_Speed
的值,即 PLLM 的分频系数。
const u16 Flash_Speed = 0xFF;
备注
参阅 ameba_bootcfg 获取更多关于 PLLM 的信息。
Flash 最高时钟频率为
SPIC_CLK_LIMIT/2
。初始化流程将自动检测配置频率是否超过此上限。
Flash_ReadMode
SPIC 在 BootRom 阶段工作在 1IO 模式,并在 Bootloader 阶段切换至 Flash_ReadMode
的值指定的模式(默认 4IO),若当前配置的读取模式不支持,系统将自动尝试其他模式,直至找到适合的模式。
Flash_Layout
SDK 中的默认 Flash 布局详见章节 Flash 布局。如需修改 Flash 布局,请参考章节 Flash 布局修改。
启用 Flash 保护
更多关于此功能的详细信息,请参考章节 Flash 写保护机制。
github source code
Flash_Speed
SPIC 在 BootRom 阶段的频率是 XTAL(40MHz),并在 Bootloader 阶段切换至更高频率。
Flash 运行速率为 SPIC 控制器速率的一半,SPIC 控制器的速率默认由 PLLM 分频得到,但是必须低于 SPIC_CLK_LIMIT
(208MHz)。
如需降低 Flash 的运行速率,请修改 Flash_Speed
的值,即 PLLM 的分频系数。
const u16 Flash_Speed = 0xFF;
备注
参阅 ameba_bootcfg 获取更多关于 PLLM 的信息。
Flash 最高时钟频率为
SPIC_CLK_LIMIT/2
。初始化流程将自动检测配置频率是否超过此上限。
Flash_ReadMode
SPIC 在 BootRom 阶段工作在 1IO 模式,并在 Bootloader 阶段切换至 Flash_ReadMode
的值指定的模式(默认 4IO),若当前配置的读取模式不支持,系统将自动尝试其他模式,直至找到适合的模式。
Flash_Layout
SDK 中的默认 Flash 布局详见章节 Flash 布局。如需修改 Flash 布局,请参考章节 Flash 布局修改。
启用 Flash 保护
更多关于此功能的详细信息,请参考章节 Flash 写保护机制。
github source code
Flash_Speed
SPIC 在 BootRom 阶段的频率是 XTAL(40MHz),并在 Bootloader 阶段切换至更高频率。
Flash 运行速率为 SPIC 控制器速率的一半,SPIC 控制器的速率默认由 PLLM 分频得到,但是必须低于 SPIC_CLK_LIMIT
(208MHz)。
如需降低 Flash 的运行速率,请修改 Flash_Speed
的值,即 PLLM 的分频系数。
const u16 Flash_Speed = 0xFF;
备注
参阅 ameba_bootcfg 获取更多关于 PLLM 的信息。
Flash 最高时钟频率为
SPIC_CLK_LIMIT/2
。初始化流程将自动检测配置频率是否超过此上限。
Flash_ReadMode
SPIC 在 BootRom 阶段工作在 1IO 模式,并在 Bootloader 阶段切换至 Flash_ReadMode
的值指定的模式(默认 4IO),若当前配置的读取模式不支持,系统将自动尝试其他模式,直至找到适合的模式。
Flash_Layout
SDK 中的默认 Flash 布局详见章节 Flash 布局。如需修改 Flash 布局,请参考章节 Flash 布局修改。
启用 Flash 保护
更多关于此功能的详细信息,请参考章节 Flash 写保护机制。
github source code
Flash_Speed
SPIC 在 BootRom 阶段的频率是 XTAL(40MHz),并在 Bootloader 阶段切换至更高频率。
Flash 运行速率为 SPIC 控制器速率的一半,SPIC 控制器的速率默认由 NPPLL 分频得到,但是必须低于 SPIC_CLK_LIMIT
(208MHz)。
如需降低 Flash 的运行速率,请修改 Flash_Speed
的值,即 NPPLL 的分频系数。
const u16 Flash_Speed = 0x7FF;
备注
参阅 ameba_bootcfg 获取更多关于 NPPLL 的信息。
Flash 最高时钟频率为
SPIC_CLK_LIMIT/2
。初始化流程将自动检测配置频率是否超过此上限。
Flash_ReadMode
SPIC 在 BootRom 阶段工作在 1IO 模式,并在 Bootloader 阶段切换至 Flash_ReadMode
的值指定的模式(默认 4IO),若当前配置的读取模式不支持,系统将自动尝试其他模式,直至找到适合的模式。
Flash_Layout
SDK 中的默认 Flash 布局详见章节 Flash 布局。如需修改 Flash 布局,请参考章节 Flash 布局修改。
启用 Flash 保护
更多关于此功能的详细信息,请参考章节 Flash 写保护机制。
github source code
Flash_Speed
SPIC 在 BootRom 阶段的频率是 XTAL(40MHz),并在 Bootloader 阶段切换至更高频率。
Flash 运行速率为 SPIC 控制器速率的一半,SPIC 控制器的速率默认由 PLL 分频得到,但是必须低于 SPIC_CLK_LIMIT
(208MHz)。
备注
Flash 最高时钟频率为
SPIC_CLK_LIMIT/2
。初始化流程将自动检测配置频率是否超过此上限。初始化时已经将 Flash 设为为最佳性能,所以不建议修改
Flash_Speed
和Flash_ReadMode
或者Data_Flash_Speed
和Data_Flash_ReadMode
。
Flash_ReadMode
SPIC 在 BootRom 阶段工作在 1IO 模式,并在 Bootloader 阶段切换至 Flash_ReadMode
的值指定的模式(默认 4IO),若当前配置的读取模式不支持,系统将自动尝试其他模式,直至找到适合的模式。
Flash_Layout
SDK 中的默认 Flash 布局详见章节 Flash 布局。如需修改 Flash 布局,请参考章节 Flash 布局修改。
启用 Flash 保护
更多关于此功能的详细信息,请参考章节 Flash 写保护机制。
ameba_boot_trustzonecfg
本节介绍了 TrustZone 相关的配置,主要是支持 Secure 功能的芯片中 MPC 和 SAU 的配置。如果芯片不支持 Secure 功能,则该配置文件将被忽略。
github source code
sau_config
用户可以通过修改 sau_config
的值来配置 KM4 的安全属性,在设定的区间 [Start, End] 之内,用户可以将 NSC
设置为 0 或 1,以指定该区域是否为非安全区域。
如果
NSC
设置为 1,则该区域将被视为安全代码,即 Non-secure Callable (NSC);如果
NSC
设置为 0,则该区域将被视为非安全代码,Non-secure KM4 将可以访问该区域。没有设置的区域,将被视为安全代码,Secure KM4 可以访问。
mpc1_config
用户可以通过修改 mpc1_config
的值来配置 SRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc2_config
用户可以通过修改 mpc2_config
的值来配置 PSRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
备注
如果芯片支持 安全固件保护(RDP) 功能,则该文件将被编译并链接到 Bootloader 中;如果芯片不支持 安全固件保护(RDP) 功能,则该文件将被忽略。
可以参考 TrustZone 安全区域大小调整方法 修改
ameba_boot_trustzonecfg.c
。
github source code
sau_config
用户可以通过修改 sau_config
的值来配置 KM4 的安全属性,在设定的区间 [Start, End] 之内,用户可以将 NSC
设置为 0 或 1,以指定该区域是否为非安全区域。
如果
NSC
设置为 1,则该区域将被视为安全代码,即 Non-secure Callable (NSC);如果
NSC
设置为 0,则该区域将被视为非安全代码,Non-secure KM4 将可以访问该区域。没有设置的区域,将被视为安全代码,Secure KM4 可以访问。
mpc1_config
用户可以通过修改 mpc1_config
的值来配置 hs_sram0(0x20000000~0x20040000) 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc2_config
用户可以通过修改 mpc2_config
的值来配置 hs_sram1(0x20040000~0x20080000) 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc3_config
用户可以通过修改 mpc3_config
的值来配置 PSRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
备注
如果芯片支持 安全固件保护(RDP) 功能,则该文件将被编译并链接到 Bootloader 中;如果芯片不支持 安全固件保护(RDP) 功能,则该文件将被忽略。
可以参考 TrustZone 安全区域大小调整方法 修改
ameba_boot_trustzonecfg.c
。
github source code
sau_config
用户可以通过修改 sau_config
的值来配置 KM4 的安全属性,在设定的区间 [Start, End] 之内,用户可以将 NSC
设置为 0 或 1,以指定该区域是否为非安全区域。
如果
NSC
设置为 1,则该区域将被视为安全代码,即 Non-secure Callable (NSC);如果
NSC
设置为 0,则该区域将被视为非安全代码,Non-secure KM4 将可以访问该区域。没有设置的区域,将被视为安全代码,Secure KM4 可以访问。
mpc1_config
用户可以通过修改 mpc1_config
的值来配置 hs_sram0(0x20000000~0x20040000) 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc2_config
用户可以通过修改 mpc2_config
的值来配置 hs_sram1(0x20040000~0x20080000) 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc3_config
用户可以通过修改 mpc3_config
的值来配置 PSRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
备注
如果芯片支持 安全固件保护(RDP) 功能,则该文件将被编译并链接到 Bootloader 中;如果芯片不支持 安全固件保护(RDP) 功能,则该文件将被忽略。
可以参考 TrustZone 安全区域大小调整方法 修改
ameba_boot_trustzonecfg.c
。
github source code
sau_config
用户可以通过修改 sau_config
的值来配置 KM4 的安全属性,在设定的区间 [Start, End] 之内,用户可以将 NSC
设置为 0 或 1,以指定该区域是否为非安全区域。
如果
NSC
设置为 1,则该区域将被视为安全代码,即 Non-secure Callable (NSC);如果
NSC
设置为 0,则该区域将被视为非安全代码,Non-secure KM4 将可以访问该区域。没有设置的区域,将被视为安全代码,Secure KM4 可以访问。
mpc1_config
用户可以通过修改 mpc1_config
的值来配置 hs_sram0(0x20000000~0x20040000) 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc2_config
用户可以通过修改 mpc2_config
的值来配置 hs_sram1(0x20040000~0x20080000) 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc3_config
用户可以通过修改 mpc3_config
的值来配置 PSRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
备注
如果芯片支持 安全固件保护(RDP) 功能,则该文件将被编译并链接到 Bootloader 中;如果芯片不支持 安全固件保护(RDP) 功能,则该文件将被忽略。
可以参考 TrustZone 安全区域大小调整方法 修改
ameba_boot_trustzonecfg.c
。
github source code
sau_config
用户可以通过修改 sau_config
的值来配置 KM4 的安全属性,在设定的区间 [Start, End] 之内,用户可以将 NSC
设置为 0 或 1,以指定该区域是否为非安全区域。
如果
NSC
设置为 1,则该区域将被视为安全代码,即 Non-secure Callable (NSC);如果
NSC
设置为 0,则该区域将被视为非安全代码,Non-secure KM4 将可以访问该区域。没有设置的区域,将被视为安全代码,Secure KM4 可以访问。
mpc1_config
用户可以通过修改 mpc1_config
的值来配置 HS_SRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc2_config
用户可以通过修改 mpc2_config
的值来配置 PSRAM/DRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
备注
如果芯片支持 安全固件保护(RDP) 功能,则该文件将被编译并链接到 Bootloader 中;如果芯片不支持 安全固件保护(RDP) 功能,则该文件将被忽略。
可以参考 TrustZone 安全区域大小调整方法 修改
ameba_boot_trustzonecfg.c
。
github source code
sau_config
用户可以通过修改 sau_config
的值来配置 KM4TZ 的安全属性,在设定的区间 [Start, End] 之内,用户可以将 NSC
设置为 0 或 1,以指定该区域是否为非安全区域。
如果
NSC
设置为 1,则该区域将被视为安全代码,即 Non-secure Callable (NSC);如果
NSC
设置为 0,则该区域将被视为非安全代码,Non-secure KM4TZ 将可以访问该区域。没有设置的区域,将被视为安全代码,Secure KM4TZ 可以访问。
mpc1_config
用户可以通过修改 mpc1_config
的值来配置 Flash 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc2_config
用户可以通过修改 mpc2_config
的值来配置 SRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
mpc3_config
用户可以通过修改 mpc3_config
的值来配置 PSRAM 部分区间的安全属性:
在设定的区间 [Start, End] 之内,Non-secure Master 可以访问该区域;
没有设置的区域,只有 Secure Master 才可以访问。
ameba_intfcfg
本节介绍了外设引脚分配,即将芯片的物理引脚与各种外设功能进行对应。
github source code
sdio_config
sdio_config
数组主要用来配置 SDIO Device 的相关接口,请参考章节 :ref:`sdio_config`
。
github source code
TBD
github source code
TBD
github source code
TBD
github source code
sdioh_config
sdioh_config
数组主要用来配置 SDIO Host 的相关接口,请参考章节 :ref:`sdioh_config`
。
github source code
sdio_config
sdio_config
数组主要用来配置 SDIO Device 的相关接口,请参考章节 :ref:`sdio_config`
。
ameba_pinmapcfg
本节介绍了初始化阶段由 pinmap_init()
配置的每个引脚的上下拉状态。
github source code
pmap_func
pmap_func
数组主要用来配置每个 pin 的上下拉状态:
由
Func PU/PD
控制 SOC Active 时 pin 默认的上下拉状态,在main()
或者后续的任务中,需要根据具体 IP 的需求设置 SOC Active 时 pin 的上下拉状态;由
Slp PU/PD
控制 SOC Sleep 时的上下拉状态,如果设置不对,在睡眠时该 pin 会有漏电流产生,请根据硬件状态修改。
const PMAP_TypeDef pmap_func[] = {
//Pin Name Func PU/PD Slp PU/PD
{_PA_0, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_1, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_2, GPIO_PuPd_KEEP, GPIO_PuPd_UP},
...
};
github source code
pmap_func
pmap_func
数组主要用来配置每个 pin 的上下拉状态:
由
Func PU/PD
控制 SOC Active 时 pin 默认的上下拉状态,在main()
或者后续的任务中,需要根据具体 IP 的需求设置 SOC Active 时 pin 的上下拉状态;由
Slp PU/PD
控制 SOC Sleep 时的上下拉状态,如果设置不对,在睡眠时该 pin 会有漏电流产生,请根据硬件状态修改。
const PMAP_TypeDef pmap_func[] = {
//Pin Name Func PU/PD Slp PU/PD
{_PA_0, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_1, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_2, GPIO_PuPd_KEEP, GPIO_PuPd_UP},
...
};
github source code
pmap_func
pmap_func
数组主要用来配置每个 pin 的上下拉状态:
由
Func PU/PD
控制 SOC Active 时 pin 默认的上下拉状态,在main()
或者后续的任务中,需要根据具体 IP 的需求设置 SOC Active 时 pin 的上下拉状态;由
Slp PU/PD
控制 SOC Sleep 时的上下拉状态,如果设置不对,在睡眠时该 pin 会有漏电流产生,请根据硬件状态修改。
const PMAP_TypeDef pmap_func[] = {
//Pin Name Func PU/PD Slp PU/PD
{_PA_0, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_1, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_2, GPIO_PuPd_KEEP, GPIO_PuPd_UP},
...
};
github source code
pmap_func
pmap_func
数组主要用来配置每个 pin 的上下拉状态:
由
Func PU/PD
控制 SOC Active 时 pin 默认的上下拉状态,在main()
或者后续的任务中,需要根据具体 IP 的需求设置 SOC Active 时 pin 的上下拉状态;由
Slp PU/PD
控制 SOC Sleep 时的上下拉状态,如果设置不对,在睡眠时该 pin 会有漏电流产生,请根据硬件状态修改。
const PMAP_TypeDef pmap_func[] = {
//Pin Name Func PU/PD Slp PU/PD
{_PA_0, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_1, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_2, GPIO_PuPd_KEEP, GPIO_PuPd_UP},
...
};
github source code
pmap_func
pmap_func
数组主要用来配置每个 pin 的上下拉状态:
由
Func PU/PD
控制 SOC Active 时 pin 默认的上下拉状态,在main()
或者后续的任务中,需要根据具体 IP 的需求设置 SOC Active 时 pin 的上下拉状态;由
Slp PU/PD
控制 SOC Sleep 时的上下拉状态,如果设置不对,在睡眠时该 pin 会有漏电流产生,请根据硬件状态修改。
const PMAP_TypeDef pmap_func[] = {
//Pin Name Func PU/PD Slp PU/PD
{_PA_0, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_1, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_2, GPIO_PuPd_KEEP, GPIO_PuPd_UP},
...
};
github source code
pmap_func
pmap_func
数组主要用来配置每个 pin 的上下拉状态:
由
Func PU/PD
控制 SOC Active 时 pin 默认的上下拉状态,在main()
或者后续的任务中,需要根据具体 IP 的需求设置 SOC Active 时 pin 的上下拉状态;由
Slp PU/PD
控制 SOC Sleep 时的上下拉状态,如果设置不对,在睡眠时该 pin 会有漏电流产生,请根据硬件状态修改。
const PMAP_TypeDef pmap_func[] = {
//Pin Name Func PU/PD Slp PU/PD
{_PA_0, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_1, GPIO_PuPd_UP, GPIO_PuPd_UP},
{_PA_2, GPIO_PuPd_KEEP, GPIO_PuPd_UP},
...
};
ameba_sleepcfg
github source code
唤醒掩码设置
在睡眠模式下,某些场景仅需唤醒单个 CPU 来执行程序,唤醒掩码模块即用于实现此功能。一般情况下,除了设置唤醒掩码,还需要注册唤醒源中断,以便在唤醒时由特定的 CPU 处理。
通过设置唤醒掩码,可选择仅唤醒某个指定的 CPU。若选择 KM4,需先唤醒 KM0 并由其恢复 KM4 运行。
用户可通过修改 ameba_sleepcfg.c
中的 sleep_wevent_config[] 来选择想要唤醒的目标 CPU。
每个唤醒源的属性可设置为以下值之一:
WAKEUP_KM4:仅唤醒 KM4
WAKEUP_KM0:仅唤醒 KM0
WAKEUP_NULL:禁用该唤醒源
/* 唤醒属性可设置为 WAKEUP_NULL/WAKEUP_KM4/WAKEUP_KM0 */
WakeEvent_TypeDef sleep_wevent_config[] = {
// Module Wakeup
{WAKE_SRC_SDIO, WAKEUP_NULL},
{WAKE_SRC_AON_WAKEPIN, WAKEUP_NULL},
{WAKE_SRC_AON_TIM, WAKEUP_NULL},
{WAKE_SRC_Keyscan, 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_CTOUCH, WAKEUP_NULL},
{WAKE_SRC_I2C1, WAKEUP_NULL},
{WAKE_SRC_I2C0, WAKEUP_NULL},
{WAKE_SRC_GPIOB, WAKEUP_NULL},
{WAKE_SRC_GPIOA, WAKEUP_NULL},
{WAKE_SRC_UART_LOG, WAKEUP_NULL},
{WAKE_SRC_UART2_BT, WAKEUP_NULL},
{WAKE_SRC_UART1, WAKEUP_NULL},
{WAKE_SRC_UART0, WAKEUP_NULL},
{WAKE_SRC_pmc_timer1, WAKEUP_KM0}, /* Internal use, do not change it*/
{WAKE_SRC_pmc_timer0, WAKEUP_KM4}, /* Internal use, do not change it*/
{WAKE_SRC_Timer7, WAKEUP_NULL},
{WAKE_SRC_Timer6, WAKEUP_NULL},
{WAKE_SRC_Timer5, WAKEUP_NULL},
{WAKE_SRC_Timer4, WAKEUP_NULL},
{WAKE_SRC_IPC_KM4, WAKEUP_KM4}, /* IPC can only wake up KM4, do not change it*/
{WAKE_SRC_BT_WAKE_HOST, WAKEUP_NULL},
{WAKE_SRC_KM4_WAKE_IRQ, WAKEUP_KM0}, /* Internal use, do not change it*/
{WAKE_SRC_WIFI_FTSR_MAILBOX, WAKEUP_KM0}, /* Wi-Fi wakeup, do not change it*/
{WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_KM0}, /* Wi-Fi wakeup, do not change it*/
{0xFFFFFFFF, WAKEUP_NULL},
};
AON 唤醒引脚配置
AON 唤醒引脚是支持睡眠唤醒的外设之一。
SoC 提供两个 AON 唤醒引脚(PB30 和 PB31),需在 ameba_sleepcfg.c
中的 sleep_wakepin_config[] 中配置。
配置属性可选值如下:
DISABLE_WAKEPIN:禁用唤醒
HIGH_LEVEL_WAKEUP:GPIO 高电平触发唤醒
LOW_LEVEL_WAKEUP:GPIO 低电平触发唤醒
/* can be used by sleep mode & deep sleep mode */
/* config can be set to DISABLE_WAKEPIN/HIGH_LEVEL_WAKEUP/LOW_LEVEL_WAKEUP */
WAKEPIN_TypeDef sleep_wakepin_config[] = {
// wakepin config
{WAKEPIN_0, DISABLE_WAKEPIN}, /* WAKEPIN_0 对应 _PB_30 */
{WAKEPIN_1, DISABLE_WAKEPIN}, /* WAKEPIN_1 对应 _PB_31 */
{0xFFFFFFFF, DISABLE_WAKEPIN},
};
备注
默认情况下, sleep_wakepin_config[] 中未启用
AON_WAKEPIN_IRQ
,需用户手动激活。唤醒掩码不会在
sleep_wakepin_config[]
中被设置。如果需要将唤醒引脚用于睡眠模式,设置sleep_wevent_config[]
中的WAKE_SRC_AON_WAKEPIN
即可。
时钟和电压配置
XTAL、OSC4M 的状态及睡眠模式电压可通过 ameba_sleepcfg.c
中的 ps_config[] 配置,适用于需要在睡眠模式下保持外设时钟的场景。
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 */
};
睡眠模式配置
应用程序可通过调用函数
pmu_set_sleep_type(uint32_t type)()
设置睡眠模式为 CG 或 PG用户可通过调用函数
pmu_get_sleep_type()
获取当前 CPU 睡眠模式
备注
KM0 与 KM4 同属一个电源域,因此两者的睡眠模式相同。调用函数
pmu_set_sleep_type()
设置 KM4 的睡眠模式,KM0 将自动同步 KM4 的睡眠模式。系统默认睡眠模式为 PG。如需修改睡眠模式,必须在进入睡眠状态前调用函数
pmu_set_sleep_type()
。
github source code
唤醒掩码设置
在睡眠模式下,某些场景仅需唤醒单个 CPU 来执行程序,唤醒掩码模块即用于实现此功能。一般情况下,除了设置唤醒掩码,还需要注册唤醒源中断,以便在唤醒时由特定的 CPU 处理。
要启用特定唤醒源,需在 ameba_sleepcfg.c
的 sleep_wevent_config[] 数组中设置对应模块的状态。每个模块可设置为 WAKEUP_NULL/WAKEUP_NP/WAKEUP_AP
。
例如:如果 WAKE_SRC_AON_WAKEPIN
设置为 WAKEUP_NP
,表示当系统处于睡眠模式时,一旦发生 AON 唤醒引脚中断,NP 核将被唤醒处理事件。
/* 唤醒属性可设置为 WAKEUP_NULL/WAKEUP_NP/WAKEUP_AP/WAKEUP_DSP */
WakeEvent_TypeDef sleep_wevent_config[] = {
// Module wakeup
{WAKE_SRC_VAD, WAKEUP_NULL},
{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_AON_RTC, WAKEUP_NULL},
{WAKE_SRC_SPI1, WAKEUP_NULL},
{WAKE_SRC_SPI0, WAKEUP_NULL},
{WAKE_SRC_CTOUCH, WAKEUP_NULL},
{WAKE_SRC_GPIOB, WAKEUP_NULL},
{WAKE_SRC_GPIOA, WAKEUP_NULL},
{WAKE_SRC_UART_LOG, WAKEUP_AP},
{WAKE_SRC_UART3, WAKEUP_NULL},
{WAKE_SRC_UART2, WAKEUP_NULL},
{WAKE_SRC_UART1, WAKEUP_NULL},
{WAKE_SRC_UART0, WAKEUP_NULL},
{WAKE_SRC_Timer7, WAKEUP_NULL},
{WAKE_SRC_Timer6, WAKEUP_NULL},
{WAKE_SRC_Timer5, WAKEUP_NULL},
{WAKE_SRC_Timer4, WAKEUP_NULL},
{WAKE_SRC_Timer3, WAKEUP_NULL},
{WAKE_SRC_Timer2, WAKEUP_NULL},
{WAKE_SRC_Timer1, WAKEUP_NULL},
{WAKE_SRC_Timer0, WAKEUP_NULL},
{WAKE_SRC_WDG0, WAKEUP_NULL},
{WAKE_SRC_BT_WAKE_HOST, WAKEUP_NULL},
{WAKE_SRC_AP_WAKE, WAKEUP_NULL},
{WAKE_SRC_WIFI_FTSR_MAILBOX, WAKEUP_NP},
{WAKE_SRC_WIFI_FISR_FESR, WAKEUP_NP},
{0xFFFFFFFF, WAKEUP_NULL},
};
AON 唤醒引脚配置
AON 唤醒引脚是支持睡眠唤醒的外设之一。
SoC 提供两个 AON 唤醒引脚(PA0 and PA1),需在 ameba_sleepcfg.c
中的 sleep_wakepin_config[] 中配置。
配置属性可选值如下:
DISABLE_WAKEPIN:禁用唤醒
HIGH_LEVEL_WAKEUP:GPIO 高电平触发唤醒
LOW_LEVEL_WAKEUP:GPIO 低电平触发唤醒
/* can be used by sleep mode & deep sleep mode */
/* config can be set to DISABLE_WAKEPIN/HIGH_LEVEL_WAKEUP/LOW_LEVEL_WAKEUP */
WAKEPIN_TypeDef sleep_wakepin_config[] = {
// wakepin config
{WAKEPIN_0, DISABLE_WAKEPIN}, /* WAKEPIN_0 对应 _PA_0 */
{WAKEPIN_1, DISABLE_WAKEPIN}, /* WAKEPIN_1 对应 _PA_1 */
{0xFFFFFFFF, DISABLE_WAKEPIN},
};
备注
默认情况下, sleep_wakepin_config[] 中未启用
AON_WAKEPIN_IRQ
,需用户手动激活。唤醒掩码不会在
sleep_wakepin_config[]
中被设置。如果需要将唤醒引脚用于睡眠模式,设置sleep_wevent_config[]
中的WAKE_SRC_AON_WAKEPIN
即可。
时钟和电压配置
XTAL、OSC4M 的状态及睡眠模式电压可通过 ameba_sleepcfg.c
中的 ps_config[] 配置,适用于需要在睡眠模式下保持外设时钟的场景。
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 */
};
睡眠模式配置
应用程序可通过调用函数
pmu_set_sleep_type(uint32_t type)()
设置睡眠模式为 CG 或 PG用户可通过调用函数
pmu_get_sleep_type()
获取当前 CPU 睡眠模式
备注
KR4 与 KM4 同属一个电源域,因此两者的睡眠模式相同。调用函数
pmu_set_sleep_type()
设置 AP 的睡眠模式,NP 将自动同步 AP 的睡眠模式。系统默认睡眠模式为 PG。如需修改睡眠模式,必须在进入睡眠状态前调用函数
pmu_set_sleep_type()
。
github source code
唤醒掩码设置
在睡眠模式下,某些场景仅需唤醒单个 CPU 来执行程序,唤醒掩码模块即用于实现此功能。一般情况下,除了设置唤醒掩码,还需要注册唤醒源中断,以便在唤醒时由特定的 CPU 处理。
要启用特定唤醒源,需在 ameba_sleepcfg.c
的 sleep_wevent_config[] 数组中设置对应模块的状态。每个模块可设置为 WAKEUP_NULL/WAKEUP_NP/WAKEUP_AP/WAKEUP_DSP
。
例如:如果 WAKE_SRC_AON_WAKEPIN
设置为 WAKEUP_NP
,表示当系统处于睡眠模式时,一旦发生 AON 唤醒引脚中断,NP 核将被唤醒处理事件。
/* 唤醒属性可设置为 WAKEUP_NULL/WAKEUP_NP/WAKEUP_AP/WAKEUP_DSP */
WakeEvent_TypeDef sleep_wevent_config[] = {
// Module wakeup
{WAKE_SRC_VAD, WAKEUP_NULL},
{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_AON_RTC, WAKEUP_NULL},
{WAKE_SRC_SPI1, WAKEUP_NULL},
{WAKE_SRC_SPI0, WAKEUP_NULL},
{WAKE_SRC_CTOUCH, WAKEUP_NULL},
{WAKE_SRC_GPIOB, WAKEUP_NULL},
{WAKE_SRC_GPIOA, WAKEUP_NULL},
{WAKE_SRC_UART_LOG, WAKEUP_AP},
{WAKE_SRC_UART3, WAKEUP_NULL},
{WAKE_SRC_UART2, WAKEUP_NULL},
{WAKE_SRC_UART1, WAKEUP_NULL},
{WAKE_SRC_UART0, WAKEUP_NULL},
{WAKE_SRC_Timer7, WAKEUP_NULL},
{WAKE_SRC_Timer6, WAKEUP_NULL},
{WAKE_SRC_Timer5, WAKEUP_NULL},
{WAKE_SRC_Timer4, WAKEUP_NULL},
{WAKE_SRC_Timer3, WAKEUP_NULL},
{WAKE_SRC_Timer2, WAKEUP_NULL},
{WAKE_SRC_Timer1, WAKEUP_NULL},
{WAKE_SRC_Timer0, WAKEUP_NULL},
{WAKE_SRC_WDG0, WAKEUP_NULL},
{WAKE_SRC_BT_WAKE_HOST, WAKEUP_NULL},
{WAKE_SRC_AP_WAKE, WAKEUP_NULL},
{WAKE_SRC_WIFI_FTSR_MAILBOX, WAKEUP_NP},
{WAKE_SRC_WIFI_FISR_FESR, WAKEUP_NP},
{0xFFFFFFFF, WAKEUP_NULL},
};
AON 唤醒引脚配置
AON 唤醒引脚是支持睡眠唤醒的外设之一。
SoC 提供两个 AON 唤醒引脚(PA0 and PA1),需在 ameba_sleepcfg.c
中的 sleep_wakepin_config[] 中配置。
配置属性可选值如下:
DISABLE_WAKEPIN:禁用唤醒
HIGH_LEVEL_WAKEUP:GPIO 高电平触发唤醒
LOW_LEVEL_WAKEUP:GPIO 低电平触发唤醒
/* can be used by sleep mode & deep sleep mode */
/* config can be set to DISABLE_WAKEPIN/HIGH_LEVEL_WAKEUP/LOW_LEVEL_WAKEUP */
WAKEPIN_TypeDef sleep_wakepin_config[] = {
// wakepin config
{WAKEPIN_0, DISABLE_WAKEPIN}, /* WAKEPIN_0 对应 _PA_0 */
{WAKEPIN_1, DISABLE_WAKEPIN}, /* WAKEPIN_1 对应 _PA_1 */
{0xFFFFFFFF, DISABLE_WAKEPIN},
};
备注
默认情况下, sleep_wakepin_config[] 中未启用
AON_WAKEPIN_IRQ
,需用户手动激活。唤醒掩码不会在
sleep_wakepin_config[]
中被设置。如果需要将唤醒引脚用于睡眠模式,设置sleep_wevent_config[]
中的WAKE_SRC_AON_WAKEPIN
即可。
时钟和电压配置
XTAL、OSC4M 的状态及睡眠模式电压可通过 ameba_sleepcfg.c
中的 ps_config[] 配置,适用于需要在睡眠模式下保持外设时钟的场景。
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 */
};
睡眠模式配置
应用程序可通过调用函数
pmu_set_sleep_type(uint32_t type)()
设置睡眠模式为 CG 或 PG用户可通过调用函数
pmu_get_sleep_type()
获取当前 CPU 睡眠模式
备注
KR4 与 KM4 同属一个电源域,因此两者的睡眠模式相同。调用函数
pmu_set_sleep_type()
设置 AP 的睡眠模式,NP 将自动同步 AP 的睡眠模式。系统默认睡眠模式为 PG。如需修改睡眠模式,必须在进入睡眠状态前调用函数
pmu_set_sleep_type()
。
github source code
唤醒掩码设置
在睡眠模式下,某些场景仅需唤醒单个 CPU 来执行程序,唤醒掩码模块即用于实现此功能。一般情况下,除了设置唤醒掩码,还需要注册唤醒源中断,以便在唤醒时由特定的 CPU 处理。
要启用特定唤醒源,需在 ameba_sleepcfg.c
的 sleep_wevent_config[] 数组中设置对应模块的状态。每个模块可设置为 WAKEUP_NULL/WAKEUP_NP/WAKEUP_AP/WAKEUP_DSP
。
例如:如果 WAKE_SRC_AON_WAKEPIN
设置为 WAKEUP_NP
,表示当系统处于睡眠模式时,一旦发生 AON 唤醒引脚中断,NP 核将被唤醒处理事件。
/* 唤醒属性可设置为 WAKEUP_NULL/WAKEUP_NP/WAKEUP_AP/WAKEUP_DSP */
WakeEvent_TypeDef sleep_wevent_config[] = {
// Module wakeup
{WAKE_SRC_VAD, WAKEUP_NULL},
{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_AON_RTC, WAKEUP_NULL},
{WAKE_SRC_SPI1, WAKEUP_NULL},
{WAKE_SRC_SPI0, WAKEUP_NULL},
{WAKE_SRC_CTOUCH, WAKEUP_NULL},
{WAKE_SRC_GPIOB, WAKEUP_NULL},
{WAKE_SRC_GPIOA, WAKEUP_NULL},
{WAKE_SRC_UART_LOG, WAKEUP_AP},
{WAKE_SRC_UART3, WAKEUP_NULL},
{WAKE_SRC_UART2, WAKEUP_NULL},
{WAKE_SRC_UART1, WAKEUP_NULL},
{WAKE_SRC_UART0, WAKEUP_NULL},
{WAKE_SRC_Timer7, WAKEUP_NULL},
{WAKE_SRC_Timer6, WAKEUP_NULL},
{WAKE_SRC_Timer5, WAKEUP_NULL},
{WAKE_SRC_Timer4, WAKEUP_NULL},
{WAKE_SRC_Timer3, WAKEUP_NULL},
{WAKE_SRC_Timer2, WAKEUP_NULL},
{WAKE_SRC_Timer1, WAKEUP_NULL},
{WAKE_SRC_Timer0, WAKEUP_NULL},
{WAKE_SRC_WDG0, WAKEUP_NULL},
{WAKE_SRC_BT_WAKE_HOST, WAKEUP_NULL},
{WAKE_SRC_AP_WAKE, WAKEUP_NULL},
{WAKE_SRC_WIFI_FTSR_MAILBOX, WAKEUP_NP},
{WAKE_SRC_WIFI_FISR_FESR, WAKEUP_NP},
{0xFFFFFFFF, WAKEUP_NULL},
};
AON 唤醒引脚配置
AON 唤醒引脚是支持睡眠唤醒的外设之一。
SoC 提供两个 AON 唤醒引脚(PA0 and PA1),需在 ameba_sleepcfg.c
中的 sleep_wakepin_config[] 中配置。
配置属性可选值如下:
DISABLE_WAKEPIN:禁用唤醒
HIGH_LEVEL_WAKEUP:GPIO 高电平触发唤醒
LOW_LEVEL_WAKEUP:GPIO 低电平触发唤醒
/* can be used by sleep mode & deep sleep mode */
/* config can be set to DISABLE_WAKEPIN/HIGH_LEVEL_WAKEUP/LOW_LEVEL_WAKEUP */
WAKEPIN_TypeDef sleep_wakepin_config[] = {
// wakepin config
{WAKEPIN_0, DISABLE_WAKEPIN}, /* WAKEPIN_0 对应 _PA_0 */
{WAKEPIN_1, DISABLE_WAKEPIN}, /* WAKEPIN_1 对应 _PA_1 */
{0xFFFFFFFF, DISABLE_WAKEPIN},
};
备注
默认情况下, sleep_wakepin_config[] 中未启用
AON_WAKEPIN_IRQ
,需用户手动激活。唤醒掩码不会在
sleep_wakepin_config[]
中被设置。如果需要将唤醒引脚用于睡眠模式,设置sleep_wevent_config[]
中的WAKE_SRC_AON_WAKEPIN
即可。
时钟和电压配置
XTAL、OSC4M 的状态及睡眠模式电压可通过 ameba_sleepcfg.c
中的 ps_config[] 配置,适用于需要在睡眠模式下保持外设时钟的场景。
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 */
};
睡眠模式配置
应用程序可通过调用函数
pmu_set_sleep_type(uint32_t type)()
设置睡眠模式为 CG 或 PG用户可通过调用函数
pmu_get_sleep_type()
获取当前 CPU 睡眠模式
备注
KR4 与 KM4 同属一个电源域,因此两者的睡眠模式相同。调用函数
pmu_set_sleep_type()
设置 AP 的睡眠模式,NP 将自动同步 AP 的睡眠模式。系统默认睡眠模式为 PG。如需修改睡眠模式,必须在进入睡眠状态前调用函数
pmu_set_sleep_type()
。
github source code
唤醒掩码设置
在睡眠模式下,某些场景仅需唤醒单个 CPU 来执行程序,唤醒掩码模块即用于实现此功能。一般情况下,除了设置唤醒掩码,还需要注册唤醒源中断,以便在唤醒时由特定的 CPU 处理。
通过设置唤醒掩码,可选择仅唤醒某个指定的 CPU。若选择 KM4,需先唤醒 KM0 并由其恢复 KM4 运行。
用户可通过修改 ameba_sleepcfg.c
中的 sleep_wevent_config[] 来选择想要唤醒的目标 CPU。
每个唤醒源的属性可设置为以下值之一:
WAKEUP_KM4:仅唤醒 KM4
WAKEUP_KM0:仅唤醒 KM0
WAKEUP_NULL:禁用该唤醒源
/* 唤醒属性可设置为 WAKEUP_NULL/WAKEUP_LP/WAKEUP_NP/WAKEUP_AP */
WakeEvent_TypeDef sleep_wevent_config[] = {
// Module wakeup
{WAKE_SRC_nFIQOUT1_OR_nIRQOUT1, WAKEUP_NULL},
{WAKE_SRC_nFIQOUT0_OR_nIRQOUT0, WAKEUP_NULL},
{WAKE_SRC_BT_WAKE_HOST, WAKEUP_NULL},
{WAKE_SRC_AON_WAKEPIN, WAKEUP_NULL},
{WAKE_SRC_UART2, WAKEUP_NULL},
{WAKE_SRC_UART1, WAKEUP_NULL},
{WAKE_SRC_UART0, WAKEUP_NULL},
{WAKE_SRC_SPI1, WAKEUP_NULL},
{WAKE_SRC_SPI0, WAKEUP_NULL},
{WAKE_SRC_IPC_AP, WAKEUP_AP}, /* do not change it */
{WAKE_SRC_IPC_NP, WAKEUP_NP}, /* do not change it*/
{WAKE_SRC_VADBT_OR_VADPC, WAKEUP_NULL},
{WAKE_SRC_PWR_DOWN, WAKEUP_LP},
{WAKE_SRC_BOR, WAKEUP_NULL},
{WAKE_SRC_ADC, WAKEUP_NULL},
{WAKE_SRC_CTOUCH, WAKEUP_NULL},
{WAKE_SRC_RTC, WAKEUP_NULL},
{WAKE_SRC_GPIOC, WAKEUP_NULL},
{WAKE_SRC_GPIOB, WAKEUP_NULL},
{WAKE_SRC_GPIOA, WAKEUP_NULL},
{WAKE_SRC_UART_LOG, WAKEUP_NULL},
{WAKE_SRC_Timer7, WAKEUP_NULL},
{WAKE_SRC_Timer6, WAKEUP_NP},
{WAKE_SRC_Timer5, WAKEUP_NULL},
{WAKE_SRC_Timer4, WAKEUP_NULL},
{WAKE_SRC_Timer3, WAKEUP_NULL},
{WAKE_SRC_Timer2, WAKEUP_NULL},
{WAKE_SRC_Timer1, WAKEUP_NULL},
{WAKE_SRC_Timer0, WAKEUP_NULL},
{WAKE_SRC_WDG0, WAKEUP_NULL},
{WAKE_SRC_AP_WAKE, WAKEUP_NULL},
{WAKE_SRC_NP_WAKE, WAKEUP_NULL},
{WAKE_SRC_AON_TIM, WAKEUP_NULL},
{WAKE_SRC_WIFI_FTSR_MAILBOX, WAKEUP_LP}, /* Wi-Fi wakeup, do not change it*/
{WAKE_SRC_WIFI_FISR_FESR, WAKEUP_LP}, /* Wi-Fi wakeup, do not change it*/
{0xFFFFFFFF, WAKEUP_NULL}, /* Table end */
};
AON 唤醒引脚配置
AON 唤醒引脚是支持睡眠唤醒的外设之一。
SoC 提供四个 AON 唤醒引脚(PB21、PB22、PB23 和 PB24),需在 ameba_sleepcfg.c
中的 sleep_wakepin_config[] 中配置。
配置属性可选值如下:
DISABLE_WAKEPIN:禁用唤醒
HIGH_LEVEL_WAKEUP:GPIO 高电平触发唤醒
LOW_LEVEL_WAKEUP:GPIO 低电平触发唤醒
/* can be used by sleep mode & deep sleep mode */
/* config can be set to DISABLE_WAKEPIN/HIGH_LEVEL_WAKEUP/LOW_LEVEL_WAKEUP */
WAKEPIN_TypeDef sleep_wakepin_config[] = {
// wakepin config
{WAKEPIN_0, DISABLE_WAKEPIN}, /* WAKEPIN_0 对应 _PB_21 */
{WAKEPIN_1, DISABLE_WAKEPIN}, /* WAKEPIN_1 对应 _PB_22 */
{WAKEPIN_2, DISABLE_WAKEPIN}, /* WAKEPIN_2 对应 _PB_23 */
{WAKEPIN_3, DISABLE_WAKEPIN}, /* WAKEPIN_3 对应 _PB_24 */
{0xFFFFFFFF, DISABLE_WAKEPIN},
}
备注
PB23
和PB24
默认用于 LOGUART 的收发。如果需要将其用作深度睡眠唤醒源,请联系 Realtek。活动模式和睡眠模式的引脚通过 pinmap 控制,必要时修改ameba_pinmapcfg.c
中的 pmap_func[] 实现模式切换。默认情况下, sleep_wakepin_config[] 中未启用
AON_WAKEPIN_IRQ
,需用户手动激活。唤醒掩码不会在
sleep_wakepin_config[]
中被设置。如果需要将唤醒引脚用于睡眠模式,设置sleep_wevent_config[]
中的WAKE_SRC_AON_WAKEPIN
即可。
时钟和电压配置
XTAL、OSC4M 的状态及睡眠模式电压可通过 ameba_sleepcfg.c
中的 ps_config[] 配置,适用于需要在睡眠模式下保持外设时钟的场景。
PSCFG_TypeDef ps_config = {
.km0_tickles_debug = TRUE,/* if open WIFI FW, should close it, or beacon will lost in WOWLAN */
.km0_pll_off = TRUE,
.km0_audio_vad_on = FALSE,
#if defined(CONFIG_CLINTWOOD ) && CONFIG_CLINTWOOD
.km0_config_psram = FALSE, /* if device enter sleep mode or not, false for keep active */
.km0_sleep_withM4 = FALSE,
#else
.km0_config_psram = TRUE, /* if device enter sleep mode or not, false for keep active */
.km0_sleep_withM4 = TRUE,
#endif
.keep_OSC4M_on = FALSE,
.xtal_mode_in_sleep = XTAL_OFF,
.swr_mode_in_sleep = SWR_PFM,
};
github source code
唤醒掩码设置
在睡眠模式下,某些场景仅需唤醒单个 CPU 来执行程序,唤醒掩码模块即用于实现此功能。一般情况下,除了设置唤醒掩码,还需要注册唤醒源中断,以便在唤醒时由特定的 CPU 处理。
通过设置唤醒掩码,可选择仅唤醒某个指定的 CPU。若选择 KM4TZ(默认为应用核,AP),需先唤醒 KM4NS(默认为网络核,NP) 并由其恢复 KM4TZ 运行。
用户可通过修改 ameba_sleepcfg.c
中的 sleep_wevent_config[] 来选择想要唤醒的目标 CPU。
每个唤醒源的属性可设置为以下值之一:
WAKEUP_AP:仅唤醒 KM4TZ
WAKEUP_NP:仅唤醒 KM4NS
WAKEUP_NULL:禁用该唤醒源
/* 唤醒属性可以设置为 WAKEUP_NULL/WAKEUP_NP/WAKEUP_AP */
struct WakeEvent_TypeDef sleep_wevent_config[] = {
// Module Wakeup
{WAKE_SRC_SDIO_WIFI, WAKEUP_NULL},
{WAKE_SRC_BT_WAKE_HOST, WAKEUP_NULL},
{WAKE_SRC_BT_SCB, WAKEUP_NULL},
{WAKE_SRC_CAN1, WAKEUP_NULL},
{WAKE_SRC_CAN0, WAKEUP_NULL},
{WAKE_SRC_USB, WAKEUP_NULL},
{WAKE_SRC_SDIO_HOST, WAKEUP_NULL},
{WAKE_SRC_SDIO_BT, WAKEUP_NULL},
{WAKE_SRC_AON_WAKEPIN, WAKEUP_NULL},
{WAKE_SRC_AON_TIM, WAKEUP_NULL},
{WAKE_SRC_RMII, WAKEUP_NULL},
{WAKE_SRC_PWR_DOWN, WAKEUP_NULL},
{WAKE_SRC_BOR, WAKEUP_NULL},
{WAKE_SRC_CAPTOUCH, WAKEUP_NULL},
{WAKE_SRC_ADC, WAKEUP_NULL},
{WAKE_SRC_RTC, WAKEUP_NULL},
{WAKE_SRC_GPIOC, WAKEUP_NULL},
{WAKE_SRC_GPIOB, WAKEUP_NULL},
{WAKE_SRC_GPIOA, WAKEUP_AP},
{WAKE_SRC_UART_LOG, WAKEUP_NULL},
{WAKE_SRC_UART3, WAKEUP_NULL},
{WAKE_SRC_UART2, WAKEUP_NULL},
{WAKE_SRC_UART1, WAKEUP_NULL},
{WAKE_SRC_UART0, WAKEUP_NULL},
{WAKE_SRC_pmc_timer1, WAKEUP_NP}, /* internal usage, do not change it*/
{WAKE_SRC_pmc_timer0, WAKEUP_AP}, /* internal usage, do not change it*/
{WAKE_SRC_Timer3, WAKEUP_NULL},
{WAKE_SRC_Timer2, WAKEUP_NULL},
{WAKE_SRC_Timer1, WAKEUP_NULL},
{WAKE_SRC_Timer0, WAKEUP_NULL},
{WAKE_SRC_IWDG, WAKEUP_NULL},
{WAKE_SRC_AP_WAKE_IRQ, WAKEUP_NP},
{WAKE_SRC_WIFI_FTSR_MAILBOX_IRQ, WAKEUP_NP}, /* For WiFi wakeup, do not change it*/
{WAKE_SRC_WIFI_FISR_FESR_IRQ, WAKEUP_NP}, /* For WiFi wakeup, do not change it*/
{0xFFFFFFFF, WAKEUP_NULL}, /* Table end */
};
AON 唤醒引脚配置
AON 唤醒引脚是支持睡眠唤醒的外设之一。
SoC 提供四个 AON 唤醒引脚(PA3/PA2/PA1/PA0),需在 ameba_sleepcfg.c
中的 sleep_wakepin_config[] 中配置。
配置属性可选值如下:
DISABLE_WAKEPIN:禁用唤醒
HIGH_LEVEL_WAKEUP:GPIO 高电平触发唤醒
LOW_LEVEL_WAKEUP:GPIO 低电平触发唤醒
/* can be used by sleep mode & deep sleep mode */
/* config can be set to DISABLE_WAKEPIN/HIGH_LEVEL_WAKEUP/LOW_LEVEL_WAKEUP */
WAKEPIN_TypeDef sleep_wakepin_config[] = {
// wakepin config
{WAKEPIN_0, DISABLE_WAKEPIN}, /* WAKEPIN_0 对应 _PA_3 */
{WAKEPIN_1, DISABLE_WAKEPIN}, /* WAKEPIN_1 对应 _PA_2 */
{WAKEPIN_2, DISABLE_WAKEPIN}, /* WAKEPIN_0 对应 _PA_1 */
{WAKEPIN_3, DISABLE_WAKEPIN}, /* WAKEPIN_1 对应 _PA_0 */
{0xFFFFFFFF, DISABLE_WAKEPIN},
};
备注
默认情况下, sleep_wakepin_config[] 中未启用
AON_WAKEPIN_IRQ
,需用户手动激活。唤醒掩码不会在
sleep_wakepin_config[]
中被设置。如果需要将唤醒引脚用于睡眠模式,设置sleep_wevent_config[]
中的WAKE_SRC_AON_WAKEPIN
即可。
时钟和电压配置
XTAL、OSC4M 的状态及睡眠模式电压可通过 ameba_sleepcfg.c
中的 ps_config[] 配置,适用于需要在睡眠模式下保持外设时钟的场景。
PSCFG_TypeDef ps_config = {
.keep_osc4m_on_in_sleep = 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 */
.regu_state_in_sleep = STATE1_LDOPC_SWRPFM_07, /* Default sleep to 0.7V */
};
睡眠模式配置
应用程序可通过调用函数
pmu_set_sleep_type(uint32_t type)()
设置睡眠模式为 CG 或 PG用户可通过调用函数
pmu_get_sleep_type()
获取当前 CPU 睡眠模式
备注
KM4TZ 与 KM4NS 同属一个电源域,因此两者的睡眠模式相同。调用函数
pmu_set_sleep_type()
设置 KM4TZ 的睡眠模式,KM4NS 将自动同步 KM4TZ 的睡眠模式。系统默认睡眠模式为 PG。如需修改睡眠模式,必须在进入睡眠状态前调用函数
pmu_set_sleep_type()
。