CH583 内置有电源管理单元 PMU。系统电源从 VDD33 输入,通过内置的多个 LDO 电压调整器为系 统的 FlashROM、系统的数字电路(包括内核和 USB 等)和系统的模拟电路(包括高频振荡器、PLL、 ADC 和 RF 收发器等)提供所需的电源。GPIO 和 FlashROM 的电源从 VIO33 输入。 正常工作时的电源供电分为两种方式:直接电源和 DC-DC 转换。在正常工作之外,CH583 提供了 4 种低功耗模式:空闲模式、暂停模式、睡眠模式、下电模式。 上电后默认不启用 DC-DC,而是提供直通电源,其电压纹波较小。为了降低正常运行时的系统功 耗,可以选择启用 DC-DC 提升电源能耗利用率,工作电流通常将下降到直通方式的 60%左右。 为了降低睡眠时的系统功耗,可以选择关闭系统主 LDO,切换成由系统内置的超低功耗 ULP-LDO 提供辅助电源。当系统进入睡眠或下电模式时,除了电源管理和 RTC 寄存器等常供电单元外,系统的 高 2KB 和低 30KB 的 SRAM、内核及所有的外设皆可选择是否维持供电,LSE/LSI 可选择是否开启。

在系统复位后,微控制器处于正常运行状态。当 MCU 不需要运行时,可以选择适当的低功耗模式 来节省功耗。用户需要根据最低电源消耗、最快启动时间和可用唤醒事件等条件,选定一个合适的低 功耗模式。 芯片提供以下 4 种主要的低功耗模式:

1.空闲模式(Idle) 所有外设保持正常供电,内核停止运行,时钟系统运转。检测到唤醒事件后,可以立即唤醒。

2.暂停模式(Halt) 在空闲模式的基础上,时钟系统停止。检测到唤醒事件后,首先时钟运转,然后唤醒内核运行。

3.睡眠模式(Sleep): 主 LDO 关闭,由超低功耗 ULP-LDO 维持 PMU、内核和基本外设供电,LSE 或 LSI 可以选择是否开 启,RAM2K、RAM30K、USB 和 RF 配置可以选择是否维持供电。检测到唤醒事件后,首先主 LDO 开 启,然后时钟运转,最后唤醒内核,程序继续运行,需要时可以重新设置到更高主频。

4.下电模式(Shutdown): 在睡眠模式的基础上,关闭了内核和基本外设以及 USB 和 RF 配置,LSE 或 LSI 可以选择是否开 启,RAM2K、RAM30K 可以选择是否维持供电。检测到唤醒事件后,PMU 将执行 GRWSM 复位,软件 可根据复位标志 RB_RESET_FLAG 和可选的 RAM 中的保持数据区分于 RPOR。

程序配置可参考EVT中PM例程:

IDLE模式:

#define IDLE_MODE      1
#define HALT_MODE      0
#define SLEEP_MODE     0
#define SHUTDOWN_MODE  0

int main()
{
    SetSysClock(CLK_SOURCE_PLL_32MHz);//配置主频为60M

    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);//将io配置为上拉输入,以防io漏电
    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);//将io配置为上拉输入,以防io漏电

    DebugInit();//串口打印初始化
    PRINT("Start @ChipID=%02x\n", R8_CHIP_ID);
//    DelayMs(200);

#if 1
    /* 配置唤醒源为 GPIO - PA5 */
    GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);//配置PA5为上拉输入
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒
    PFIC_EnableIRQ(GPIO_A_IRQn);//使能中断服务函数
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);//使能GPIO唤醒
#endif

#if IDLE_MODE
    PRINT("IDLE mode sleep \n");
//    DelayMs(1);
    LowPower_Idle();//配置为IDLE模式
    PRINT("wake.. \n");
    DelayMs(500);
#endif

    while(1);
}

__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void GPIOA_IRQHandler(void)
{
   GPIOA_ClearITFlagBit(GPIO_Pin_5);
}

HALT模式:

#if HALT_MODE
    PRINT("Halt mode sleep \n");
    DelayMs(2);
    LowPower_Halt();
    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    DelayMs(2);
    PRINT("wake.. \n");
    DelayMs(500);
#endif

SLEEP模式:

#if SLEEP_MODE
    PRINT("sleep mode sleep \n");
    DelayMs(2);
    // 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码。
    LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //只保留30+2K SRAM 供电
    HSECFG_Current(HSE_RCur_100);                 // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    DelayMs(5);
    PRINT("wake.. \n");
    DelayMs(500);
#endif

SHUTDOWN模式:

#if SHUTDOWN_MODE
    PRINT("shut down mode sleep \n");
    DelayMs(2);
    LowPower_Shutdown(0); //全部断电,唤醒后复位
    /*
     此模式唤醒后会执行复位,所以下面代码不会运行,
     注意要确保系统睡下去再唤醒才是唤醒复位,否则有可能变成IDLE等级唤醒
     */
    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    PRINT("wake.. \n");
    DelayMs(500);
#endif
posted on 2024-04-03 08:16  WCH蓝牙应用分享  阅读(356)  评论(0编辑  收藏  举报