Alden 发表于 2025-4-27 12:01

APM32F402进入stop休眠与按键唤醒功耗测试

本帖最后由 Alden 于 2025-4-27 12:01 编辑

#技术资源# #申请原创#
APM32F402与常规的32位MCU由于具备sleep、stop、standby这三个低功耗模式。接下来测试下APM32F402进入stop模式的功耗和按键唤醒。
基于APM32F402的SDK,使用APM32F402 TinyBoard进行测试。
软件流程:按KEY1 PA1进入stop模式,按KEY2 PA0退出stop模式。
int main(void)
{
    RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)(RCM_APB1_PERIPH_PMU | RCM_APB1_PERIPH_BAKR));

    BOARD_LED_Config(LED2);
    BOARD_LED_Config(LED3);
    Usart_Init();
          printf("run start\r\n");
    /* KEY1 \ KEY2 Set */
    BOARD_BUTTON_Config(BUTTON_KEY1, BUTTON_MODE_EINT);
    BOARD_BUTTON_Config(BUTTON_KEY2, BUTTON_MODE_EINT);

    /* NVIC Priority Set */
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_1);
    NVIC_EnableIRQRequest(EINT0_IRQn, 0, 1);
    NVIC_EnableIRQRequest(EINT1_IRQn, 1, 1);

    BOARD_LED_On(LED2);
    BOARD_LED_Off(LED3);

//   Delay(0x7FFFFF);//上电进入休眠测试功耗
//               stop_flag=1;//上电进入休眠测试功耗
    printf("Press KEY1 to Enter STOP Mode\r\n");
    while (1)
    {

                          Delay(0x7FFFFF);
      BOARD_LED_Toggle(LED2);
                        if(stop_flag==1)
                        {
                                printf("\r\nIN STOP mode\r\n");
                                stop_flag=0;
                                GPIO_ALL_init();

                                PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER, PMU_STOP_ENTRY_WFI);//测试stop开启
                                SystemInit();
                                Usart_Init();
                                BOARD_LED_Config(LED2);

                                                printf("\r\nOUT STOP mode\r\n");
                                if(keywkup_flag==1)
                                {
                                        keywkup_flag=0;
                                                printf("\r\nkey WKUP STOP mode\r\n");
                                }
                        }
    }
}void Eint0_Isr(void)
{
    if (EINT_ReadIntFlag(KEY2_BUTTON_EINT_LINE) != RESET)
    {
                                                keywkup_flag=1;
       // SystemInit();
      BOARD_LED_Off(LED3);
               
      /* Wait for system init */
      Delay(0xfffff);
      printf("Wake up from STOP Mode\r\n");
      EINT_ClearIntFlag(KEY2_BUTTON_EINT_LINE);
    }
}
void Eint1_Isr(void)
{
    if (EINT_ReadIntFlag(KEY1_BUTTON_EINT_LINE) != RESET)
    {
      BOARD_LED_On(LED3);
      BOARD_LED_Off(LED2);

      printf("\r\nSystem have entered STOP mode\r\n");
      printf("now, LED2 remains in the previous state\r\n");
      printf("please press KEY2 or reset System to exit STOP mode\r\n");

                                stop_flag=1;
      EINT_ClearIntFlag(KEY1_BUTTON_EINT_LINE);
    }
}
在KEY1 KEY的中断函数中只做标志位的修改,方便在main编写测试判断函数。
需要注意的是进stop模式后IO口状态是不改变的,不使用的引脚要设置在模拟输入模式,功耗才是最低的,唤醒后需要重新初始化时钟、串口、LED引脚等。
void GPIO_ALL_init(void)
{
        GPIO_Config_TgpioConfig;

    /** Enable the GPIO Clock */
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA|RCM_APB2_PERIPH_GPIOB|RCM_APB2_PERIPH_GPIOC|RCM_APB2_PERIPH_GPIOD);

    /** Configure the GPIO_LED pin */
    gpioConfig.pin = GPIO_PIN_ALL;
    gpioConfig.mode = GPIO_MODE_ANALOG;
    gpioConfig.speed = GPIO_SPEED_50MHz;


    GPIO_Config(GPIOB, &gpioConfig);
    GPIO_Config(GPIOC, &gpioConfig);
    GPIO_Config(GPIOD, &gpioConfig);
       
          /** Configure the GPIO_LED pin */
    gpioConfig.pin = ((uint32_t)0XFFFC);//除了PA0 PA1
    gpioConfig.mode = GPIO_MODE_ANALOG;
    gpioConfig.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOA, &gpioConfig);

}


软件方面,采用万用表串联到板子3.3V与VDD之间,VDDA与VDD接在一起,测的功耗就是MCU的功耗了。
接上后烧录代码,可以看到LED2闪烁,芯片的运行功耗大概是不到10mA,

按下KEY1后,LED2熄灭,芯片进入stop模式。

串口也会打印出进入休眠前后的状态。

如果不是用的开发板,没有按键的话也可以直接延时将stop_flag置1,上电就直接进入stop模式。


页: [1]
查看完整版本: APM32F402进入stop休眠与按键唤醒功耗测试