--- created: 2024-04-26 tags: - 代码块 - "#RTC" - RISC_V - ldo - dcdc - 电源 - 国产化 - mcu --- CH58x与[[CH57x]]部分封装兼容,从已够的评估板可知,CH571F、CH573F及CH582F封装兼容。 # 低功耗 从手册看CH58x低功耗模式功耗更低,实测睡眠模式电流==3.7uA==,与手册差距不大。代码如下: ```c hl:61-65,130-139 /********************************** (C) COPYRIGHT ******************************* * File Name : Main.c * Author : WCH * Version : V1.0 * Date : 2020/08/06 * Description : 系统睡眠模式并唤醒演示:GPIOA_5作为唤醒源,共4种睡眠等级 ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ /* 注意:切换到HSE时钟源,所需等待稳定时间和选择的外置晶体参数有关,选择一款新的晶体最好阅读厂家提供的晶体及其 负载电容参数值。通过配置R8_XT32M_TUNE寄存器,可以配置不同的负载电容和偏置电流,调整晶体稳定时间。 */ #include "CH58x_common.h" /********************************************************************* * @fn DebugInit * * @brief 调试初始化 * * @return none */ void DebugInit(void) { GPIOA_SetBits(GPIO_Pin_9); GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); UART1_DefInit(); } /********************************************************************* * @fn main * * @brief 主函数 * * @return none */ int main() { SetSysClock(CLK_SOURCE_PLL_60MHz); GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); /* 配置串口调试 */ DebugInit(); PRINT("Start @ChipID=%02x\n", R8_CHIP_ID); DelayMs(200); #if 1 /* 配置唤醒源为 GPIO - PA5 */ GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU); GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒 PFIC_EnableIRQ(GPIO_A_IRQn); PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); #endif #if 0 RTC_TMRFunCfg(Period_1_S);//定时1s的RTC闹钟 */ PFIC_EnableIRQ(RTC_IRQn);//使能RTC中断 */ PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Short_Delay );//使能RTC中断唤醒源 */ #endif #if 0 PRINT("IDLE mode sleep \n"); DelayMs(1); LowPower_Idle(); PRINT("wake.. \n"); DelayMs(500); #endif #if 0 PRINT("Halt mode sleep \n"); DelayMs(2); LowPower_Halt(); HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流) DelayMs(2); PRINT("wake.. \n"); DelayMs(500); #endif #if 1 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(2); // PRINT("wake.. \n"); // DelayMs(200); #endif #if 0 PRINT("shut down mode sleep \n"); DelayMs(2); LowPower_Shutdown(0); //全部断电,唤醒后复位 /* 此模式唤醒后会执行复位,所以下面代码不会运行, 注意要确保系统睡下去再唤醒才是唤醒复位,否则有可能变成IDLE等级唤醒 */ HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流) PRINT("wake.. \n"); DelayMs(500); #endif while(1) ; } /********************************************************************* * @fn GPIOA_IRQHandler * * @brief GPIOA中断函数 * * @return none */ __INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void) { GPIOA_ClearITFlagBit(GPIO_Pin_6 | GPIO_Pin_5); } /*RTC闹钟唤醒中断*/ __INTERRUPT __HIGH_CODE void RTC_IRQHandler(void) { if (RTC_GetITFlag(RTC_TMR_EVENT)) { RTC_ClearITFlag(RTC_TMR_EVENT); } } ``` 以上代码基本与官方样例一致。 参考文章:[CH582开启睡眠模式下低功耗测试](https://www.cnblogs.com/azou/p/16851017.html "发布于 2022-11-02 14:51") ## 注意事项 测试低功耗时首先要排除LDO的影响,上述低功耗模式用LDO供电功耗约35uA,也即LDO的静态功耗约30uA。 测试响应时间时不能接板载LDO或DCDC,需要采用受负载牵引影响小的长电电源供电,因为电源转换器有自身的响应时间。上述低功耗测试中采用LDO供电时无法观测到RTC的唤醒时间。