299|2

87

帖子

0

TA的资源

一粒金砂(中级)

全能小网关|CH32V208--第四篇:低功耗测试 [复制链接]

本帖最后由 xiaolinen 于 2024-7-6 22:03 编辑

一:电路图修改

        将下图中的D1(LED灯)和R1电阻拆除,减少电流的耗损。

硬件.jpg
 
二:低功耗模式
        2.1,CH32V208的低功耗模式包括:睡眠模式,停止模式,待机模式,具体如下图所示:
1720270690248.jpg

 

        2.1,active模式
                CH32V208在正常运行工作状态的电流情况,如下图所示:
active.jpg
 

        2.3,sleep模式

                2.3.1,PA0引脚输入低电平触发外部中断EXTI_Line0退出sleep睡眠模式,程序在唤醒后继续执行。

                2.3.2,重点代码,如下图所示:

/*********************************************************************
 * @fn      EXTI0_INT_INIT
 *
 * @brief    EXTI0中断配置,使PA0发生中断,唤醒sleep休眠
 *
 * @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_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* GPIOA.0 ----> EXTI_Line0 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*********************************************************************
 * @fn      sleep_mode_enable
 *
 * @brief   使能sleep休眠模式
 *
 * @return  none
 */
void sleep_mode_enable(void)
{
    __WFI();
}

                2.3.3,sleep模式下电流情况,如下图所示:

sleep.jpg
 

        2.4,stop模式

                2.4.1,PA0引脚输入低电平触发外部中断EXTI_Line0退出stop睡眠模式,程序在唤醒后继续执行。

                2.4.2,重点代码,如下图所示:

/*********************************************************************
 * @fn      EXTI0_INT_INIT
 *
 * @brief  EXTI0中断配置,使PA0发生中断,唤醒sleep休眠
 *
 * @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_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* GPIOA.0 ----> EXTI_Line0 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

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

/*********************************************************************
 * @fn      stop_mode_enable
 *
 * @brief  使能stop休眠模式
 *
 * @return  none
 */
void stop_mode_enable(void)
{
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}

                2.4.3,stop模式下电流情况,如下图所示:

stop.jpg
 

        2.5,standby模式

                2.5.1,WKUP (PA0)引脚的上升沿退出待机模式,唤醒后程序复位。

                2.5.2,重点代码,如下图所示:

/*********************************************************************
 * @fn      gpio_init
 *
 * @brief   GPIO初始化
 *
 * @return  none
 */
void gpio_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

        /* To reduce power consumption, unused GPIOs need to be set as pull-down inputs */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|
                RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_Init(GPIOD, &GPIO_InitStructure);
        GPIO_Init(GPIOE, &GPIO_InitStructure);
}


/*********************************************************************
 * @fn      PWR_WakeUpPinCmd
 *
 * @brief   Enables or disables the WakeUp Pin functionality.
 *
 * @param   NewState - new state of the WakeUp Pin functionality
 *        (ENABLE or DISABLE).
 *
 * @return  none
 */
void PWR_WakeUpPinCmd(FunctionalState NewState)
{
    if(NewState)
    {
        PWR->CSR |= (1 << 8);
    }
    else
    {
        PWR->CSR &= ~(1 << 8);
    }
}

/*********************************************************************
 * @fn      PWR_EnterSTANDBYMode
 *
 * @brief   Enters STANDBY mode.
 *
 * @return  none
 */
void PWR_EnterSTANDBYMode(void)
{
    PWR->CTLR |= PWR_CTLR_CWUF;
    PWR->CTLR |= PWR_CTLR_PDDS;
    NVIC->SCTLR |= (1 << 2);

    __WFI();
}

                2.5.3,standby模式下电流情况,如下图所示:

standby.jpg

 

三:声明

        本次记录的实验,主要是为了熟悉芯片各种低功耗模式的进入和退出方法,所记录的电流情况,并不是各个低功耗模式下的最低情况。

此帖出自RF/无线论坛

最新回复

主要是为了熟悉芯片各种低功耗模式的进入和退出方法,所记录的电流情况,并不是各个低功耗模式下的最低情况。 明白,就是为了熟悉   详情 回复 发表于 2024-7-7 09:24

回复
举报

6123

帖子

0

TA的资源

五彩晶圆(高级)

主要是为了熟悉芯片各种低功耗模式的进入和退出方法,所记录的电流情况,并不是各个低功耗模式下的最低情况。

明白,就是为了熟悉

此帖出自RF/无线论坛

点评

不要这么理解,不要这么理解,只是为后续进一步使用做一下铺垫  详情 回复 发表于 2024-7-7 14:13

回复

87

帖子

0

TA的资源

一粒金砂(中级)

Jacktang 发表于 2024-7-7 09:24 主要是为了熟悉芯片各种低功耗模式的进入和退出方法,所记录的电流情况,并不是各个低功耗模式下的最低情况 ...

不要这么理解,不要这么理解,只是为后续进一步使用做一下铺垫

此帖出自RF/无线论坛

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表