IC:

概述

本章主要介绍在开发过程中需要重点关注和按需修改的各种配置文件。

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 时钟设置流程

  1. 确认 ameba_bootcfg.c 文件中 Boot_SocClk_Info_IdxSocClk_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
    
  2. 由于 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

  3. 必要时,参考以下方法来修改 SoC 时钟:

    • Boot_SocClk_Info_Idx 修改为 [0, sizeof(SocClk_Info)] 范围内的值,然后在 SocClk_Info[Boot_SocClk_Info_Idx] 中自定义时钟配置信息。

    备注

    请充分考虑硬件的限制,避免设置非法的时钟配置参数。

  4. 重新编译工程,并下载新的固件

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_SpeedFlash_ReadMode 或者 Data_Flash_SpeedData_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 才可以访问。

备注

ameba_intfcfg

本节介绍了外设引脚分配,即将芯片的物理引脚与各种外设功能进行对应。

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},
   ...
};

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()

ameba_wificfg

wifi_user_conf