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]