关于CH32V003的待机模式问题

我程序上设计是一个按键按下进入待机模式,另一个按键按下唤醒,现在的问题是第一次可以进入待机模式,但是第二次就不能进入,此时单片机工作电流还有大约1.1mA,以下是我的程序:

#include "debug.h"


/* Global define */


/* Global Variable */


/*********************************************************************

 * @fn      EXTI_INT_INIT

 *

 * @brief   Initializes EXTI 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_GPIOD, ENABLE);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_Init(GPIOD, &GPIO_InitStructure);


    /* GPIOA ----> EXTI_Line3 */

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);

    EXTI_InitStructure.EXTI_Line = EXTI_Line3;

    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 = EXTI7_0_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}


/*********************************************************************

 * @fn      main

 *

 * @brief   Main program.

 *

 * @return  none

 */

int main(void)

{

    GPIO_InitTypeDef GPIO_InitStructure = {0};


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    Delay_Init();

    Delay_Ms(1000);

    Delay_Ms(1000);


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;


    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_Init(GPIOD, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_5 | GPIO_Pin_6;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_WriteBit(GPIOC, GPIO_Pin_6, 1);

    GPIO_WriteBit(GPIOC, GPIO_Pin_5, 1);

    GPIO_WriteBit(GPIOC, GPIO_Pin_7, 0);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOD, &GPIO_InitStructure);


    EXTI0_INT_INIT();


//    RCC_LSICmd(ENABLE);

//    while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

    Delay_Ms(100);

    GPIO_WriteBit(GPIOC, GPIO_Pin_7, 1);

    while(1)

    {

        if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2) == Bit_RESET)

        {

            GPIO_WriteBit(GPIOC, GPIO_Pin_6, 0);

            GPIO_WriteBit(GPIOC, GPIO_Pin_5, 0);

            PWR_EnterSTANDBYMode(PWR_STANDBYEntry_WFI);

        }

    }

}


void EXTI7_0_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line3)!=RESET)

    {

        GPIO_WriteBit(GPIOC, GPIO_Pin_6, 1);

        GPIO_WriteBit(GPIOC, GPIO_Pin_5, 1);

        EXTI_ClearITPendingBit(EXTI_Line3);     /* Clear Flag */

    }

}


上电后的电流.jpg上电后的电流


第一次进入待机模式的电流.jpg第一次进入待机模式的电流


第一次唤醒的电流.jpg第一次唤醒的电流


第二次未成功进入待机模式的电流.jpg第二次未成功进入待机模式的电流


此后按键再无任何响应


没有外部晶振,自己画的板子,电路不复杂


您好,看了一下你的程序,有用到中断函数,但并没有加中断声明,你可以添加一下中断声明再测试一下,具体添加方式可参考下图

image.png


OK,可以了,我原来以为那个声明是在线调试用的就没添加,原来是声明啊。编译器不报错和警告,就没注意这点。


缘分 上周也在用一样的电流工具调这颗单片机的功耗 


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