obsidian-notes/MCU/WCH-南京沁恒/CH582F.md
murmur 4d2dd85dbb Matebook更新了5个文件
Affected files:
MCU/WCH-南京沁恒/CH582F.md
MCU/华大/选型.md
MCU/国产化/MCU选型.md
_resources/hc32l110-demo.ept
工具/VSCODE/EIDE.md
2024-05-01 14:12:51 +08:00

4.7 KiB
Raw Blame History

created tags
2024-04-26
代码块
#RTC
RISC_V
ldo
dcdc
电源
国产化
mcu

CH58x与CH57x部分封装兼容从已够的评估板可知CH571F、CH573F及CH582F封装兼容。

低功耗

从手册看CH58x低功耗模式功耗更低实测睡眠模式电流==3.7uA==,与手册差距不大。代码如下:

/********************************** (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开启睡眠模式下低功耗测试

注意事项

测试低功耗时首先要排除LDO的影响上述低功耗模式用LDO供电功耗约35uA也即LDO的静态功耗约30uA。 测试响应时间时不能接板载LDO或DCDC需要采用受负载牵引影响小的长电电源供电因为电源转换器有自身的响应时间。上述低功耗测试中采用LDO供电时无法观测到RTC的唤醒时间。