ch32v003低功耗问题


功耗太高了,没有外围设备4Ma,耗电太快了,得加低功耗功能,代码很简单,就是main里进入待机(睡眠功耗也高),中断触发一次,main里继续待机,但是 中断只触了一次,一直在串口显示一直在中断,好奇怪,下面是在例程里改的


/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2023/12/25
 * Description        : Main program body.
 *********************************************************************************
 * 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.
 *******************************************************************************/

/*
 *@Note
 *low power, sleep mode routine:
 *EXTI_Line0(PD0)
 *This routine demonstrates that WFI enters the sleep mode, and the PD0 pin input
 *low level triggers the external interrupt EXTI_Line0 to exit the sleep mode,
 *Program execution continues after wake-up.
 *
 */

#include "debug.h"

/* Global define */

/* Global Variable */

/*********************************************************************
 * @fn      EXTI0_INT_INIT
 *
 * @brief   Initializes EXTI0 collection.
 *
 * @return  none
 */
void EXTI0_INT_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    EXTI_InitTypeDef EXTI_InitStructure = {0};
    NVIC_InitTypeDef NVIC_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    /* GPIOA.0 ----> EXTI_Line0 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI7_0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    SystemCoreClockUpdate();
    Delay_Init();
    Delay_Ms(1000);
    Delay_Ms(1000);
#if (SDI_PRINT == SDI_PR_OPEN)
    SDI_Printf_Enable();
#else
    USART_Printf_Init(115200);
#endif
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

    printf("Sleep Mode Test\r\n");
    EXTI0_INT_INIT();

    printf("\r\n ********** \r\n");
    __WFE();
    printf("\r\n ########## \r\n");

    while(1)
    {
        Delay_Ms(1000);
        printf("Run in PWR_STANDBYEntry_WFI  main\r\n");
        PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFE);
    }
}


void EXTI7_0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

/*********************************************************************
 * @fn      EXTI0_IRQHandler
 *
 * @brief   This function handles EXTI0 Handler.
 *
 * @return  none
 */
void EXTI7_0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line1)!=RESET)
    {
        printf("EXTI7_0_IRQHandler EXTI0 Wake_up\r\n");
        EXTI_ClearITPendingBit(EXTI_Line0);     /* Clear Flag */
//        Delay_Ms(2000);
//        PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFI);


//        __WFE();

    }
}


{3861-x-151767689362759}.png

刚才在研究ch32v003fun里面的例子时,找到了一个问题EXTI_Line0没改EXTI_Line1,测试ok了,

EXTI_ClearITPendingBit(EXTI_Line0);

 功耗问题还是不理想,正常工作4ma,我用了测试了这四个写法,电流最低在1ma左右,还能不能降?还有什么写法推荐一下

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    SystemCoreClockUpdate();
    Delay_Init();
    Delay_Ms(1000);
    Delay_Ms(1000);
#if (SDI_PRINT == SDI_PR_OPEN)
    SDI_Printf_Enable();
#else
    USART_Printf_Init(115200);
#endif
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

    printf("Sleep Mode Test\r\n");
    EXTI0_INT_INIT();

    printf("\r\n ********** \r\n");
//    __WFI();
//    __WFE();
//    PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFI);
    PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFE);
    printf("\r\n ########## \r\n");

    while(1)
    {
        Delay_Ms(1000);
        printf("Run in PWR_STANDBYEntry_WFI  main\r\n");

//        __WFI();
//        __WFE();
//        PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFI);
        PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFE);
    }
}



你好,功耗高可参考此篇博客:https://www.cnblogs.com/wchmcu/p/17091766.html 


只有PWR_EnterSTANDBYMode,

PWR_EnterSTOPMode已经没有了

{3861-x-325119210231189}.png


您好,CH32V003的低功耗模式只有睡眠模式和待机模式,没有停止模式,具体可看CH32V003应用手册,如下图,手册下载链接如下:

https://www.wch.cn/downloads/CH32V003RM_PDF.html

image.png


我想问的是最低功耗是多少?
功耗问题还是不理想,正常工作4ma,2楼我测试了这四个写法,电流最低在1ma左右,还能不能降?还有什么写法推荐一下


您好,CH32V003运行模式下电流最低也就在1mA左右,睡眠模式下电流最低在0.4mA左右,待机模式下电流最低在9uA左右。具体数据在CH32V003数据手册有介绍,手册下载链接如下。目前低功耗模式下软件方面注意事项基本就是3楼帖子提到的,将不用的IO设置成下拉输入模式,开启PWR时钟等。后续若有问题,可邮箱(lzs@wch.cn)沟通。

https://www.wch.cn/downloads/CH32V003DS0_PDF.html

 


我今天按三楼的改,cc表测试还是900UA,就C1接了一个红外中断唤醒,intoLowPowerMode写的有问题么?

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2023/12/25
 * Description        : Main program body.
 *********************************************************************************
 * 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.
 *******************************************************************************/

/*
 *@Note
 *low power, sleep mode routine:
 *EXTI_Line0(PD0)
 *This routine demonstrates that WFI enters the sleep mode, and the PD0 pin input
 *low level triggers the external interrupt EXTI_Line0 to exit the sleep mode,
 *Program execution continues after wake-up.
 *
 */

#include "debug.h"

/* Global define */

/* Global Variable */

/*********************************************************************
 * @fn      EXTI0_INT_INIT
 *
 * @brief   Initializes EXTI0 collection.
 *
 * @return  none
 */
void EXTI0_INT_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    EXTI_InitTypeDef EXTI_InitStructure = {0};
    NVIC_InitTypeDef NVIC_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    /* GPIOA.0 ----> EXTI_Line0 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI7_0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


void intoLowPowerMode(void){

	//开启PWR时钟,目的是将内部调压器调成低功耗模式
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
	//所有IO口需要设置成下拉输入,目的是将芯片IO固定电平状态,防止芯片IO悬空漏电
    GPIO_InitTypeDef GPIO_InitStructure = {0};
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_Init(GPIOD, &GPIO_InitStructure);

//        __WFI();
//        __WFE();
        PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFI);
//	PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFE);
}


/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    SystemCoreClockUpdate();
    Delay_Init();
    Delay_Ms(1000);
    Delay_Ms(1000);
#if (SDI_PRINT == SDI_PR_OPEN)
    SDI_Printf_Enable();
#else
    USART_Printf_Init(115200);
#endif
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

    printf("Sleep Mode Test\r\n");
    EXTI0_INT_INIT();

    printf("\r\n ********** \r\n");
    intoLowPowerMode();
    printf("\r\n ########## \r\n");

    while(1)
    {
        Delay_Ms(1000);
        printf("Run in PWR_STANDBYEntry_WFI  main\r\n");

        intoLowPowerMode();
        PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFE);
    }
}


void EXTI7_0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

/*********************************************************************
 * @fn      EXTI0_IRQHandler
 *
 * @brief   This function handles EXTI0 Handler.
 *
 * @return  none
 */
void EXTI7_0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line1)!=RESET)
    {
        printf("EXTI7_0_IRQHandler EXTI0 Wake_up\r\n");
        EXTI_ClearITPendingBit(EXTI_Line1);     /* Clear Flag */
//        Delay_Ms(2000);
//        PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFI);


//        __WFE();

    }
}



面包板应该没问题吧
dfc2315a124868bba99f3a1c7e9340eb.jpg


您好,不用的IO建议设置成下拉输入,下图标记处建议做一下修改。此外,在CH32V003 EVT中有待机模式的例程,你可以直接使用EVT例程测试一下,EVT下载链接如下:

https://www.wch.cn/downloads/CH32V003EVT_ZIP.html 

image.png


突然发现电压我用的5V 我用18650电池试了一下,现在电流520uA了,还有降的空间



面包板没动,EVT中待机模式的例程 4V测试 300uA

 我自己用8楼的代码测试  GPIO_Mode_IPD,GPIO_Mode_IPU感觉差别不大,都是500uA/490uA左右



用18650电池 cc表显示的是4V


有图有真相

2f66a8ff0ebd5e8d88598b87a8be7bb1.jpg


您好,如下图,我这边测试大概在13uA左右,注意系统主频配置使用内部晶振,EVT例程带有唤醒的,要把唤醒那部分注释掉。若有万用表,可以用万用表测试一下看看image.png


收到了。刚才测试把红外电源线拔了就9uA了


只有登录才能回复,可以选择微信账号登录