本次测试的主要硬件为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 */
- }
实际效果:
|