本帖最后由 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_T gpioConfig;
- /** 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模式。
APM32F402_403_SDK_stop_key.zip
(4.19 MB, 下载次数: 6)
|