本次测试的主要硬件为STM32H533微控制器,结合使用了一个精度适中的万用表进行功耗测量。
STM32H533支持多种低功耗工作模式,包括CPU睡眠模式、系统待机模式和系统停止模式,这些模式均可通过RTC(实时时钟)唤醒。
低功耗模式介绍
CPU睡眠模式(CPU_SLEEP_MODE):
在此模式下,STM32H533的主CPU进入睡眠状态,但外设仍保持运行。
由于外设的持续工作,该模式对整体功耗的降低效果相对有限。
系统停止模式(SYSTEM_STOP_MODE):
系统进入停止模式后,主CPU和外设均停止工作,系统时钟也停止。
仅有内部稳压器保持供电,显著降低了功耗。
系统待机模式(SYSTEM_STANDBY_MODE):
这是功耗最低的模式,CPU、外设、系统时钟以及内部稳压器均被关闭。
仅保留备份寄存器和RTC供电,通过RTC中断可唤醒CPU。
硬件连接:
将万用表的电流测量端连接到JP2引脚CPU供电测试。万用表切换到电流MA档,注意万用表表笔需要跳一下。
通过编程(如使用STM32CubeIDE)设置STM32H533进入不同的低功耗模式。
在程序中设定自动进入低功耗模式的时间(10秒后)。
观察并记录万用表在不同模式下的电流读数,以评估功耗。
记录从正常工作模式转换到低功耗模式后,再由RTC唤醒的过程。
cpu的睡眠模式(CPU_SLEEP_MODE):在此工作模式下,STM32H533主芯片进入睡眠模式,但是外设仍然在保持工作。该模式下的功耗降低效果不是很明显,毕竟外设正在运行,不能很好的降低整体的功耗。
cpu停止模式(SYSTEM_STOP_MODE):在此工作模式下,STM32H533主芯片进入停止模式,在此模式下,所有的外设进入停止状态,系统时钟也停止工作,但是内部稳压器继续保持供电,这种模式下的功耗降低明显。
cpu待机模式(SYSTEM_STANDBY_MODE):在此工作模式下,STM32H533进入待机状态,功耗最低的模式,系统时钟,外设和内部稳压器都被关闭,仅仅保留备份寄存器和RTC供电,所以可以通过RTC再次唤醒CPU。
使用CUBE MX配置:
关键代码:
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
HAL_PWR_EnableBkUpAccess();
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* Initialize LED2 and LED2 */
BSP_LED_Init(LED2);
BSP_LED_Init(LED2);
/* Turn LED2 on */
BSP_LED_On(LED2);
/* Delay 5 seconds */
HAL_Delay(5000);
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ICACHE_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
/* Turn LED2 on */
BSP_LED_Off(LED2);
#if defined (CPU_SLEEP_MODE)
/* Suspend Tick increment */
HAL_SuspendTick();
/* Enter the CPU to SLEEP mode */
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI) ;
/* Resume Tick increment */
HAL_ResumeTick();
#elif defined (SYSTEM_STOP_MODE)
/* Enter the SYSTEM to STOP mode */
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
#elif defined (SYSTEM_STANDBY_MODE)
/* Enter the SYSTEM to STANDBY mode */
HAL_PWR_EnterSTANDBYMode();
#endif /* Power mode */
#if (!defined (SYSTEM_STANDBY_MODE))
/* Reset the system after wake up */
HAL_NVIC_SystemReset();
#endif
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
实际效果:
|