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

[复制链接]
 楼主| Alden 发表于 2025-4-27 12:01 | 显示全部楼层 |阅读模式
本帖最后由 Alden 于 2025-4-27 12:01 编辑

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

  4.     BOARD_LED_Config(LED2);
  5.     BOARD_LED_Config(LED3);
  6.     Usart_Init();
  7.           printf("run start\r\n");
  8.     /* KEY1 \ KEY2 Set */
  9.     BOARD_BUTTON_Config(BUTTON_KEY1, BUTTON_MODE_EINT);
  10.     BOARD_BUTTON_Config(BUTTON_KEY2, BUTTON_MODE_EINT);

  11.     /* NVIC Priority Set */
  12.     NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_1);
  13.     NVIC_EnableIRQRequest(EINT0_IRQn, 0, 1);
  14.     NVIC_EnableIRQRequest(EINT1_IRQn, 1, 1);

  15.     BOARD_LED_On(LED2);
  16.     BOARD_LED_Off(LED3);

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

  22.                           Delay(0x7FFFFF);
  23.         BOARD_LED_Toggle(LED2);
  24.                         if(stop_flag==1)
  25.                         {
  26.                                 printf("\r\nIN STOP mode\r\n");
  27.                                 stop_flag=0;
  28.                                 GPIO_ALL_init();

  29.                                 PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER, PMU_STOP_ENTRY_WFI);//测试stop开启
  30.                                 SystemInit();
  31.                                 Usart_Init();
  32.                                 BOARD_LED_Config(LED2);

  33.                                                 printf("\r\nOUT STOP mode\r\n");
  34.                                 if(keywkup_flag==1)
  35.                                 {
  36.                                         keywkup_flag=0;
  37.                                                 printf("\r\nkey WKUP STOP mode\r\n");
  38.                                 }
  39.                         }
  40.     }
  41. }
  1. void Eint0_Isr(void)
  2. {
  3.     if (EINT_ReadIntFlag(KEY2_BUTTON_EINT_LINE) != RESET)
  4.     {
  5.                                                 keywkup_flag=1;
  6.        // SystemInit();
  7.         BOARD_LED_Off(LED3);
  8.                
  9.         /* Wait for system init */
  10.         Delay(0xfffff);
  11.         printf("Wake up from STOP Mode\r\n");
  12.         EINT_ClearIntFlag(KEY2_BUTTON_EINT_LINE);
  13.     }
  14. }
  15. void Eint1_Isr(void)
  16. {
  17.     if (EINT_ReadIntFlag(KEY1_BUTTON_EINT_LINE) != RESET)
  18.     {
  19.         BOARD_LED_On(LED3);
  20.         BOARD_LED_Off(LED2);

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

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

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

  6.     /** Configure the GPIO_LED pin */
  7.     gpioConfig.pin = GPIO_PIN_ALL;
  8.     gpioConfig.mode = GPIO_MODE_ANALOG;
  9.     gpioConfig.speed = GPIO_SPEED_50MHz;


  10.     GPIO_Config(GPIOB, &gpioConfig);
  11.     GPIO_Config(GPIOC, &gpioConfig);
  12.     GPIO_Config(GPIOD, &gpioConfig);
  13.        
  14.             /** Configure the GPIO_LED pin */
  15.     gpioConfig.pin = ((uint32_t)0XFFFC);//除了PA0 PA1
  16.     gpioConfig.mode = GPIO_MODE_ANALOG;
  17.     gpioConfig.speed = GPIO_SPEED_50MHz;
  18.     GPIO_Config(GPIOA, &gpioConfig);

  19. }


0e7e69c8d90a57d9014e6605a329caf.png
软件方面,采用万用表串联到板子3.3V与VDD之间,VDDA与VDD接在一起,测的功耗就是MCU的功耗了。
接上后烧录代码,可以看到LED2闪烁,芯片的运行功耗大概是不到10mA,
4d1d709f61680600d710901c6f67285.jpg
按下KEY1后,LED2熄灭,芯片进入stop模式。
cd76bfbb165f6a22c0440180fd1c5e0.jpg
串口也会打印出进入休眠前后的状态。
0b19697fc726e5514da9898aed40dfe.png
如果不是用的开发板,没有按键的话也可以直接延时将stop_flag置1,上电就直接进入stop模式。
0fec5c1c33c45b2bd7d76191faa1a13.png
APM32F402_403_SDK_stop_key.zip (4.19 MB, 下载次数: 6)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

113

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部