IC:

支持的芯片

Ameba SoC

RTL8721Dx

RTL8726E

RTL8720E

RTL8730E

支持状态

Y

Y

Y

Y

概述

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

ameba_bootcfg

本节介绍与启动相关的配置,包括 SoC 时钟切换和启动日志。

KM4 在 BootRom 阶段以 200MHz 运行,并在 bootloader 阶段切换至更高频率。​​

修改 SoC 时钟时存在以下限制:

项目

Cut

频率

核心电压

PLL

300MHz ~ 600MHz

KM0

A-Cut

≤115MHz

KM4

A-Cut

≤260MHz

0.9V

KM4

A-Cut

≤345MHz

1.0V

备注

宽压(1.65V~3.6V) IC 中,Flash的工作频率上限,应遵循 1.65V~2.3V 供电区间的速率限制。

SoC & PSRAM 时钟设置流程

  1. 确认 ameba_bootcfg.c 文件中 Boot_SocClk_Info_IdxSocClk_Info[] 的值。

    // For KM4, max. 345MHz under 1.0V, max. 260MHz under 0.9V
    // For KM0, max. 115MHz under 1.0V, max. 104MHz under 0.9V
    // PLL can be 300MHz~688.128MHz
    // KM4_CKD range is [1, 8], KM0_CKD range is [1, 16] or USEXTAL
    const SocClk_Info_TypeDef SocClk_Info[] = {
       // PLL_CLK,    Vol_Type,      KM4_CKD,    KM0_CKD,     PSRAMC_CKD
       {PLL_520M,     CORE_VOL_0P9,  CLKDIV(2),       CLKDIV(5),   CLKDIV(2)},
       {PLL_331M,     CORE_VOL_1P0,  CLKDIV(1),       CLKDIV(3),   CLKDIV(1)},
       {PLL_400M,     CORE_VOL_0P9,  CLKDIV(2),       CLKDIV(4),   CLKDIV(1)},
       {PLL_480M,     CORE_VOL_0P9,  CLKDIV(2),       CLKDIV(5),   CLKDIV(2)},  // 48M for USB
       {PLL_677P376M, CORE_VOL_1P0,  CLKDIV(2),  CLKDIV(6),   CLKDIV(2)},
       {PLL_688P128M, CORE_VOL_1P0,  CLKDIV(2),  CLKDIV(6),   CLKDIV(2)},
    };
    
    /**
    * @brief SocClk_Info selection
    * Boot_SocClk_Info_Idx is [0, sizeof(SocClk_Info)), Soc will set the SoC clock by SocClk_Info[Boot_SocClk_Info_Idx]
    * /
    
    #ifdef CONFIG_USB_DEVICE_EN
    u8 Boot_SocClk_Info_Idx = 3; // Make sure the PLL_CLK for USB is an integer multiple of 48MHz
    #else
    u8 Boot_SocClk_Info_Idx = 0;
    #endif
    
  2. 确认 \bootloader\bootloader_km4.c 文件中的 BOOT_ChipInfo_ClkInfoIdx() 函数。

    u32 BOOT_ChipInfo_ClkInfoIdx(void)
    {
       /* PSRAM die is wb955 which can run up to 200MHz */
       /* Boot_SocClk_Info_Idx is valid, use user config socclk */
       return Boot_SocClk_Info_Idx;
    }
    

    Bootloader 将根据 SocClk_Info[Boot_SocClk_Info_Idx] 的定义来配置 SoC 时钟,PSRAM 速率也将随 SoC 时钟同步调整。

    PSRAM 类型

    PSRAM 速度

    SocClk_Info[x]

    时钟信息

    无 PSRAM

    SocClk_Info[0]

    • PLL:520MHz

    • KM4:260MHz

    • KM0:86.6MHz

    WB955

    ≤200MHz

    SocClk_Info[1]

    • PLL:330MHz

    • KM4:PLL/1

    • KM0:PLL/4

    • PSRAM:PLL/2

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

    • 修改 ameba_bootcfg.c 文件中的 SocClk_Info[0]

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

    备注

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

    示例

    如果希望 KM4 的运行频率为 520MHz/3,需要将 SocClk_Info[0] 中的 KM4_CKD 设置为 CLKDIV(3)

    // For KM4, max. 345MHz under 1.0V, max. 260MHz under 0.9V
    // For KM0, max. 115MHz under 1.0V, max. 104MHz under 0.9V
    // PLL can be 300MHz~688.128MHz
    // KM4_CKD range is [1, 8], KM0_CKD range is [1, 16] or USEXTAL
    const SocClk_Info_TypeDef SocClk_Info[] = {
       // PLL_CLK,    Vol_Type,      KM4_CKD,    KM0_CKD,     PSRAMC_CKD
       {PLL_520M,     CORE_VOL_0P9,  CLKDIV(2),       CLKDIV(5),   CLKDIV(2)},
       {PLL_331M,     CORE_VOL_1P0,  CLKDIV(1),       CLKDIV(3),   CLKDIV(1)},
       {PLL_400M,     CORE_VOL_0P9,  CLKDIV(2),       CLKDIV(4),   CLKDIV(1)},
       {PLL_480M,     CORE_VOL_0P9,  CLKDIV(2),       CLKDIV(5),   CLKDIV(2)},  // 48M for USB
       {PLL_677P376M, CORE_VOL_1P0,  CLKDIV(2),  CLKDIV(6),   CLKDIV(2)},
       {PLL_688P128M, CORE_VOL_1P0,  CLKDIV(2),  CLKDIV(6),   CLKDIV(2)},
    };
    

    配置结果

    • KM4 时钟频率​​:173.3MHz

    • KM0 时钟频率​​:86.6MHz

    • PSRAM 控制器时钟​​:260MHz(PSRAM 时钟的两倍)

    • 核心电压​​:0.9V

    ​其余模块时钟将由软件根据其最大运行速度自动设置为合理值。

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

ameba_flashcfg

本节介绍与 Flash 相关的配置,包括 Flash 的速度、读取模式、布局和保护模式。

Flash_Speed

Flash 运行速率为 SPI Flash 控制器速率的一半。

SPI Flash 控制器的速率默认由 PLL 分频得到,且必须低于 SPIC_CLK_LIMIT (208MHz)。

如需降低 Flash 的运行速率,请修改 Flash_Speed (对应 SPIC0)或 Data_Flash_Speed (对应 SPIC1)的值。

const u16 Flash_Speed = CLKDIV(2);
const u16 Data_Flash_Speed = CLKDIV(2);

Flash_Speed 的值

描述

Flash 波特率

CLKDIV(10)

Flash 波特率为 PLL 的 1/10

PLL/20

CLKDIV(9)

Flash 波特率为 PLL 的 1/9

PLL/18

CLKDIV(8)

Flash 波特率为 PLL 的 1/8

PLL/16

CLKDIV(7)

Flash 波特率为 PLL 的 1/7

PLL/14

CLKDIV(6)

Flash 波特率为 PLL 的 1/6

PLL/12

CLKDIV(5)

Flash 波特率为 PLL 的 1/5

PLL/10

CLKDIV(4)

Flash 波特率为 PLL 的 1/4

PLL/8

CLKDIV(3)

Flash 波特率为 PLL 的 1/3

PLL/6

CLKDIV(2)

Flash 波特率为 PLL 的 1/2

PLL/4

Flash_ReadMode

Flash_ReadMode 的值

描述

0xFFFF

地址 & 数据 4-bit 模式

0x7FFF

仅数据 4-bit 模式

0x3FFF

地址 & 数据 2-bit 模式

0x1FFF

仅数据 2-bit 模式

0x0FFF

1-bit 模式

备注

若当前配置的读取模式不支持,系统将自动尝试其他模式,直至找到适合的模式。

Flash_Layout

SDK 中的默认 Flash 布局详见章节 Flash 布局。如需修改 Flash 布局,请参考章节 Flash布局修改

启用 Flash 保护

更多关于此功能的详细信息,请参考章节 Flash写保护机制

Flash 引脚映射

更多关于引脚映射配置的详细信息,请参考 User Manual(章节:I/O Control)。

ameba_boot_trustzonecfg

TBD

ameba_pinmapcfg

TBD

ameba_sleepcfg

唤醒掩码设置

在睡眠模式下,某些场景仅需唤醒单个 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_wifi_country_code_table_usrcfg

TBD

ameba_wifi_power_table_usrcfg

TBD

ameba_wificfg

TBD