STM32 睡眠模式测试程序
2026/6/6 20:11:37 网站建设 项目流程

基于 STM32F103 + HAL 库,代码可直接编译运行,并且教你如何测量电流验证是否真的睡下去了。


一、STM32 低功耗模式速查

模式唤醒方式唤醒后典型功耗适用场景
Sleep任意中断立即执行mA 级只是让 CPU 歇一下
StopEXTI(按键)需要重配时钟μA 级电池供电首选
StandbyWakeUp 引脚 / RTC相当于复位< 5μA极低功耗,但麻烦

90% 的项目用 Stop 模式就够了


二、Stop 模式测试程序

1、GPIO 设计

引脚功能
PA0唤醒按键(EXTI0)
PC13LED(闪烁表示运行)
其余 IO设为Analog省电

2、主程序(main.c

#include"main.h"voidSystemClock_Config(void);voidEnter_STOP_Mode(void);intmain(void){HAL_Init();SystemClock_Config();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct={0};// PC13 LEDGPIO_InitStruct.Pin=GPIO_PIN_13;GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);// PA0 唤醒按键GPIO_InitStruct.Pin=GPIO_PIN_0;GPIO_InitStruct.Mode=GPIO_MODE_IT_RISING;GPIO_InitStruct.Pull=GPIO_NOPULL;HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);HAL_NVIC_EnableIRQ(EXTI0_IRQn);while(1){// 运行指示HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);HAL_Delay(200);// 运行 2 秒后进入 STOPstaticuint32_tcnt=0;if(++cnt>10){cnt=0;HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);Enter_STOP_Mode();}}}

3、进入 Stop 模式

voidEnter_STOP_Mode(void){__HAL_RCC_PWR_CLK_ENABLE();// 关闭所有不需要的外设时钟__HAL_RCC_USART1_CLK_DISABLE();__HAL_RCC_SPI1_CLK_DISABLE();__HAL_RCC_TIM2_CLK_DISABLE();// 配置所有 IO 为模拟输入(最省电)GPIO_InitTypeDef GPIO_InitStruct={0};GPIO_InitStruct.Mode=GPIO_MODE_ANALOG;GPIO_InitStruct.Pull=GPIO_NOPULL;GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Pin=GPIO_PIN_All;HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);// 进入 STOP 模式,唤醒后使用 HSIHAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);}

4、唤醒后恢复时钟

voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin==GPIO_PIN_0){// 重新初始化系统时钟(STOP 唤醒后默认用 HSI)SystemClock_Config();// 重新初始化 GPIO__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct={0};GPIO_InitStruct.Pin=GPIO_PIN_13;GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);}}

三、SystemClock_Config(标准 72MHz)

voidSystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct={0};RCC_ClkInitTypeDef RCC_ClkInitStruct={0};RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState=RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL=RCC_PLL_MUL9;HAL_RCC_OscConfig(&RCC_OscInitStruct);RCC_ClkInitStruct.ClockType=RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV1;HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_2);}

四、如何验证是否真的睡下去了

方法 1:万用表测电流(最准)

状态电流
运行10~30 mA
Sleep5~10 mA
Stop≈ 20~50 μA
Standby< 5 μA

如果 Stop 模式 > 1mA,一定有问题


2、方法 2:LED 行为

  • 运行:LED 快速闪烁
  • 睡眠:LED 熄灭
  • 唤醒:LED 再次闪烁

参考代码 睡眠模式测试程序www.youwenfan.com/contentcsv/103598.html

五、常见问题

问题原因
睡不下去外设没关时钟
唤醒后死机没重配系统时钟
电流很大IO 没设为 Analog
自动唤醒没关滴答定时器
串口失效STOP 后 USART 时钟没了

六、彻底省电

关闭 SysTick 再睡

HAL_SuspendTick();// 禁止 SysTickHAL_PWR_EnterSTOPMode(...);HAL_ResumeTick();// 恢复 SysTick

七、Standby 模式

HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);HAL_PWR_EnterSTANDBYMode();

唤醒 =复位重启

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询