STM32G474单片机开发入门(九)低功耗模式实战
文章目录
- 一.概要
- 二.STM32单片机低功耗基本介绍
- 三.STM32G474RET6单片机停止模式介绍
- 四.CubeMX配置一个低功耗停止模式的例程
- 1.硬件准备
- 2.创建工程
- 3.实验效果
- 五.小结
一.概要
在生活中通过关掉电器组件可以实现省电节能的目的,同样的道理单片机也可以通过这种方法实现降低功耗。单片机是由许多部件组成,一些组件的电源系统是独立的,可以通过关闭单片机内部的组件的电压,可以实现降低功耗。
二.STM32单片机低功耗基本介绍
STM32单片机提供了一些低功耗模式。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为CPU提供时钟,并执行程序代码。当 CPU 不需要继续运行(例如等待外部事件) 时,可以利用多种低功耗模式来节省功耗。
STM32G474RET6单片机提供了多种功耗模式,以达到不同层次的降低功耗的目的:
- 睡眠模式(Sleep Mode)
特点:CPU停止工作,但外设和时钟仍正常运行,在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。
功耗:典型值为37μA/MHz(运行模式)或110μA(低功耗睡眠模式)。
唤醒方式:通过任意中断或事件唤醒,响应速度快(几微秒)。
适用场景:短时间等待或需快速响应的任务(如按键检测)。 - 停止模式(Stop Mode)
特点:关闭主时钟(HSI/HSE/PLL),保留SRAM和寄存器数据,仅低功耗时钟(如LSI)运行。
功耗:典型值为80.5μA(带RTC)或80μA(不带RTC)。
唤醒方式:通过外部中断(EXTI)、RTC或特定外设唤醒。
适用场景:周期性采样的传感器(如温湿度采集)。 - 待机模式(Standby Mode)
特点:几乎所有电路关闭,仅备份域(RTC、BKP寄存器)供电,SRAM数据丢失。
功耗:典型值为0.88μA(带RTC)或0.13μA(不带RTC)。
唤醒方式:仅通过复位引脚、RTC闹钟或WKUP引脚唤醒。
适用场景:超长时间待机(如智能门锁)。 - 低功耗运行模式(Low-Power Run Mode)
特点:CPU以较低频率运行(如2MHz),外设可选择性关闭。
功耗:典型值为810μA。
适用场景:需持续运行但功耗敏感的任务(如后台数据采集)。 - 低功耗睡眠模式(Low-Power Sleep Mode)
特点:CPU停止且限制最大频率,外设可配置为低功耗状态。
功耗:典型值为110μA。
适用场景:平衡功耗与唤醒速度的中等需求
三.STM32G474RET6单片机停止模式介绍
STM32G474RET6的停止模式是一种低功耗状态,通过停止时钟系统和优化电压调节器实现显著节能,同时保留SRAM和寄存器内容。以下是关键特性与实现要点:
核心特性
停止所有1.8V供电区域的时钟(PLL、HSI、HSE振荡器关闭),保留I/O引脚状态,外设停止工作
电压调节器可配置为正常或低功耗模式(通过PWR_CR的LPMS位)。
依赖外部中断(如按键、RTC闹钟)或复位信号唤醒,唤醒后默认使用HSI(16MHz)作为系统时钟,需手动切换至HSE以稳定运行。
进入停止模式流程
清除PWR_CR的LPMS位(选择电压调节器模式),设置SCB->SCR的SLEEPDEEP位为1,执行WFI/WFE指令进入停止模式。
程序代码如下:
/* Stop 0 mode with Main Regulator */MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_CR1_LPMS_STOP0);/* Set SLEEPDEEP bit of Cortex System Control Register */SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));/* Select Stop mode entry --------------------------------------------------*//* Request Wait For Interrupt */__WFI();
退出停止模式
有外部中断,就能退出停止模式,退出后需重新配置系统时钟(如HSE+PLL),若启用低功耗电压调节器,需额外等待启动延迟。
应用场景
电池供电设备(如传感器节点)的间歇性工作,需快速唤醒且保留上下文的中断响应场景。
四.CubeMX配置一个低功耗停止模式的例程
1.硬件准备
STLINK接STM32G474RET6开发板,STLINK接电脑USB口。
2.创建工程
如下图所示,打开STM32CubeMX软件,新建工程。
如下图所示,Part Number处输入STM32G474RE,再双击就创建新的工程。
如下图所示,配置下载口引脚,PA13为SWD的SWDIO脚,PA14为SWD的SWCLK脚。
如下图所示,可以查看STM32G474RET6开发板原理图,PC8连接LED灯,所以配置PC8为GPIO输出,推挽输出。
如下图所示,配置系统主频170Mhz,使用内部16MHZ晶振。
PA0引脚跟按键相连,配置PA0引脚为外部中断0引脚,配置PA0引脚下拉,因为是上升沿产生中断,用来唤醒。
配置工程文件名,保存路径,KEIL5工程输出方式,生成工程。
用Keil5打开工程。
添加代码
//系统时钟初始化配置,用于从停止模式唤醒之后系统时钟初始化,采用内部晶振,系统主频还是配置成170MHZ
static void SYSCLKConfig_STOP(void)
{RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitTypeDef RCC_OscInitStruct = {0};uint32_t pFLatency = 0;/* Enable Power Control clock */__HAL_RCC_PWR_CLK_ENABLE();/* Get the Oscillators configuration according to the internal RCC registers */HAL_RCC_GetOscConfig(&RCC_OscInitStruct);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;RCC_OscInitStruct.PLL.PLLN = 85;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/* Get the Clocks configuration according to the internal RCC registers */HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency);/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2clocks dividers */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency) != HAL_OK){Error_Handler();}
}
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//内部16MHZ晶振,170MHZ系统主频/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();//PA0配置成外部中断引脚,中断使能,引脚下拉,上升沿产生中断,PC8配置成输出/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */HAL_Delay(1000);//等待1秒for(int i=0;i<10;i++){HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);//LED灯闪烁HAL_Delay(200);}HAL_PWREx_EnterSTOP0Mode(PWR_STOPENTRY_WFI);//进入停止模式,中断可以唤醒SYSCLKConfig_STOP();//唤醒后,配置系统时钟为170MHZwhile (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);//PC8翻转输出HAL_Delay(200);//等待200ms}/* USER CODE END 3 */
}
3.实验效果
板子上电后,LED会闪烁2秒左右然后停止闪烁,这时板子已经进入低功耗停止模式,再去按唤醒按键(wk_up),板子会继续运行,LED灯一直闪烁。
五.小结
STM32单片机支持多种低功耗模式,包括睡眠模式、停止模式等,这些模式通过降低时钟频率、禁用外设和进入深度睡眠状态来实现节能。通过仔细选择和配置这些模式,可以显著减少功耗,从而延长设备的续航时间。