返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[APM32E1] APM32 MINI开发板功耗测试方式

[复制链接]
 楼主| Alden 发表于 2024-4-8 15:17 | 显示全部楼层 |阅读模式
<
本帖最后由 Alden 于 2024-4-8 15:29 编辑

#申请原创# #技术资源#
在一些MCU应用中,需要MCU进入低功耗模式,关闭外设来减少功耗,延长待机时间。APM32的低功耗模式有以下三种:
1. 睡眠模式(Sleep Mode)
在睡眠模式下,CPU停止工作,但所有时钟和外设仍然工作,可以通过外部中断或者某些内部中断源唤醒CPU。这种模式适用于等待外设操作完成或外部事件的场景。
2. 停止模式(Stop Mode)
停止模式下,所有内核时钟停止,外设时钟可以选择性地停止,RAM和寄存器内容被保留。微控制器的功耗进一步降低,可以通过外部中断、内部中断源或者复位信号唤醒。唤醒后,微控制器从停止模式恢复到正常工作模式。
3. 待机模式(Standby Mode)
待机模式是STM32F103中功耗最低的模式。在此模式下,电源电压监控器(PVD)、低速外部晶振(LSE)、实时时钟(RTC)和唤醒引脚保持工作状态,而CPU和大部分外设的电源被关闭。RAM和寄存器的内容不被保留。可以通过RTC闹钟、外部中断引脚或复位信号唤醒微控制器。

低功耗模式的选择:
选择哪种低功耗模式取决于应用的具体需求,比如需要保持的外设活动、唤醒时间、功耗预算等。通常,待机模式的功耗最低,但从待机模式唤醒的时间也最长。睡眠模式虽然功耗相对较高,但能快速唤醒,适合需要快速响应外部事件的应用。

而在功耗测试时会面临选择进入哪个低功耗模式,实际功耗是多少,数据手册标的是否真实,测试环境是怎样的等等问题。
在APM32E103的数据手册中对功耗测试环境和低功耗模式下的功耗有进行说明:
ff8a6f68a3b077933e7f64dd21e8bb7.png
其中比较重要的一点就是所有IO引脚都处于输入模式,这样能够避免引脚电平对功耗测试产生干扰。
e82cb1909df1a2a235d6e309deff621.png
数据手册中标注的低功耗电流见上表,接下来实际验证下APM32系列中STOP模式和STANDBY模式的功耗。

测试环境使用APM32F103ZET6 MINIBOARD开发板进行测试,在这款开发板中,VDD、VDDA、VREF引脚都采用跳帽隔开,可以方便的将万用表串入其中进行功耗测试。
77d66baab615dc733ff9477985f136a.png

2f5e65fdc096d04ba24f8698fcd70b8.jpg
休眠代码的配置在极海SDK的基础上修改,便于唤醒和测试。
  1. void ALL_Peri_OFF(void)
  2. {
  3.          GPIO_Config_T  configStruct;
  4.          RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA|RCM_APB2_PERIPH_GPIOB|RCM_APB2_PERIPH_GPIOC|
  5.          RCM_APB2_PERIPH_GPIOD|RCM_APB2_PERIPH_GPIOE|RCM_APB2_PERIPH_GPIOF|RCM_APB2_PERIPH_GPIOG);
  6.          
  7.           configStruct.pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|
  8.          GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  9.     configStruct.mode = GPIO_MODE_ANALOG;
  10.     configStruct.speed = GPIO_SPEED_50MHz;
  11.           GPIO_Config(GPIOA, &configStruct);
  12.          
  13.                  configStruct.pin = GPIO_PIN_ALL;
  14.     configStruct.mode = GPIO_MODE_ANALOG;
  15.     configStruct.speed = GPIO_SPEED_50MHz;
  16. //          GPIO_Config(GPIOA, &configStruct);
  17.                 GPIO_Config(GPIOB, &configStruct);
  18.                 GPIO_Config(GPIOC, &configStruct);
  19.                 GPIO_Config(GPIOD, &configStruct);
  20.                 GPIO_Config(GPIOE, &configStruct);
  21.                 GPIO_Config(GPIOF, &configStruct);
  22.                 GPIO_Config(GPIOG, &configStruct);
  23. }
  1. int main(void)
  2. {
  3.     RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)(RCM_APB1_PERIPH_PMU | RCM_APB1_PERIPH_BAKR));

  4.     APM_MINI_LEDInit(LED2);
  5.     APM_MINI_LEDInit(LED3);

  6.     Usart_Init();
  7.     /* KEY1 \ KEY2 Set */
  8.     APM_MINI_PBInit(BUTTON_KEY1, BUTTON_MODE_EINT);
  9.     APM_MINI_PBInit(BUTTON_KEY2, BUTTON_MODE_EINT);

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

  14.     APM_MINI_LEDOn(LED2);
  15.     APM_MINI_LEDOff(LED3);

  16.     /* Enable PMU Periph Clock */
  17.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);
  18.     PMU_Reset();

  19.     printf("Press KEY1 to Enter STOP Mode\r\n");
  20.     while (1)
  21.     {

  22.           if(stopflag==1)
  23.            {
  24.               stopflag=0;
  25.               printf("\r\nSystem have entered STOP mode\r\n");
  26.               printf("now, LED2 remains in the previous state\r\n");
  27.               printf("please press KEY2 or reset System to exit STOP mode\r\n");
  28.               ALL_Peri_OFF();

  29.               PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER, PMU_STOP_ENTRY_WFI);
  30. //            PMU_EnableWakeUpPin();
  31. //            PMU_EnterSTANDBYMode();

  32.               SystemInit();
  33.               Usart_Init();
  34.               APM_MINI_LEDInit(LED2);
  35.               APM_MINI_LEDInit(LED3);
  36.         APM_MINI_LEDOff(LED3);
  37.         /* Wait for system init */
  38.         Delay(0xff);
  39.         printf("Wake up from STOP Mode\r\n");
  40.         }
  41.          else
  42.          {
  43.          Delay(0x7FFFFF);
  44.          printf("mcu RUN\r\n");
  45.          APM_MINI_LEDToggle(LED2);
  46.           }
  47.     }
  48. }


进入休眠前将IO除了需要用的按键外都配置成模拟输入模式来避免IO口的影响。
PA0、PA1引脚中断来判断进入推出低功耗模式。
  1. void Eint1_Isr(void)
  2. {
  3.     if (EINT_ReadIntFlag(KEY1_BUTTON_EINT_LINE) != RESET)
  4.     {
  5.         APM_MINI_LEDOn(LED3);
  6.         APM_MINI_LEDOff(LED2);
  7.         /* Enter STOP Mode in WFI*/
  8.         stopflag=1;

  9.         EINT_ClearIntFlag(KEY1_BUTTON_EINT_LINE);
  10.     }
  11. }

  12. void Eint0_Isr(void)
  13. {
  14.     if (EINT_ReadIntFlag(KEY2_BUTTON_EINT_LINE) != RESET)
  15.     {
  16.         EINT_ClearIntFlag(KEY2_BUTTON_EINT_LINE);
  17.     }
  18. }
通过main中屏蔽来测试stop模式还是standby模式。
stop模式的实测:
VDD:36.4uA  VDDA:4.3uA
c5b2e781d48db544c8b8ba637dcb60c.jpg 9a97f3a4811408834333f3731949ed2.jpg
standby模式实测:
VDD:0uA  VDDA:3uA
c9a000badfcc53d3347d0e46897bb46.jpg f0022f048e75c06db7fb5c869d64c18.jpg

与规格书中的3.3V 25°常温常压的数据基本一直,证明测试方式的可靠性和规格书的真实性都是没问题的。
APM32E10x_SDK_V1.2-stop.zip (3.73 MB, 下载次数: 7)


打赏榜单

21小跑堂 打赏了 50.00 元 2024-04-28
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

测试APM32 MINI开发板在不同低功耗模式下的功耗表现,以及测量功耗的方法和注意事项  发表于 2024-4-28 16:25
 楼主| Alden 发表于 2024-4-8 15:18 | 显示全部楼层
OKAKAKO 发表于 2024-4-15 20:11 | 显示全部楼层
其实整体低功耗的MCU都差不多的
szt1993 发表于 2024-4-16 19:29 | 显示全部楼层
睡眠模式虽然功耗相对较高,但能快速唤醒,适合需要快速响应外部事件的应用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

113

帖子

2

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