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