基于stm32(g0)实现低功耗(stop模式)中断唤醒实验
本文目标:基于stm32(g0)实现低功耗(stop模式)中断唤醒实验
按照本文的描述,应该可以跑通实验并举一反三。
先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX
使用外设:GPIO
前言
在一些使用电池供电的场合中,经常会涉及低功耗的技术。低功耗技术是指通过一些手段,使得系统在不影响功能的前提下,尽可能地降低功耗,延长电池的使用寿命。STM32系列单片机提供了多种低功耗模式,其中最常用的是STOP模式。
实验目的
本文笔者使用现有的硬件进行验证,看看是否能达到芯片手册上所描述的功耗,而且能够正常通过外部中断进行唤醒。

目标明确,开工。
搭建工程
打开STM32CubeMX进行搭建工程:

选择对应的mcu芯片进行构建:

开启swd调试并简单配置gpio。

- 开启对应的中断

- 时钟界面选项卡:
这里我使用了8M尽可能低的系统频率进行运行。
- 工程选项卡:
点击右上角的的生成代码:

使用keil打开工程,编译工程,一切都是ok

编写代码实现需求
我这里的使用场景是系统上电延迟5s后,让系统进入低功耗,在按键中断触发时,程序可以从低功耗中唤醒,相关的代码片段如下:
/*********************************************************************************
* 函数名 :HAL_GPIO_EXTI_Falling_Callback
* 描述 :按键回调处理 下降沿触发
**********************************************************************************/
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case KEY1_Pin:
break;
default:
break;
}
}
/*********************************************************************************
* 函数名 :Low_Power_Set
* 描述 :对一些耗电高的外设设置重新配置一下
**********************************************************************************/
void Low_Power_Set(void)
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pins : PB7 PB8 PB9 PB0
PB1 PB2 PB3 PB4
PB5 PB6 */
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_0
|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4
|GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pins : PC14 PC15 */
GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pins : PA0 PA4 PA5 PA6
PA7 PA8 PA11 PA12
PA15 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6
|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_11|GPIO_PIN_12
|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = KEY1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOC_CLK_DISABLE();
}
/* 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();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(5000);
// 进低功耗前对一些耗电的外设全部设置一下
Low_Power_Set();
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config(); // 重新初始化一下
MX_GPIO_Init(); // 重新初始化一下
}
/* USER CODE END 3 */
}
进入低功耗的代码是这个:
__HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
main.c中的编写的代码片段

接下来简单的对工程配置一下

实验现象


把万用表串进回路中,可以观察到当5s时间到达,程序进入了低功耗模式大致是2ua,当我按下板子的KEY1时,板子正常的电流恢复成2.788ma。
总结
通过前面的实验,可以实现STM32G0系列单片机实现低功耗(STOP模式)中断唤醒实验。低功耗笔者经常使用的技巧是,只焊接mcu看一下mcu的代码功耗有多少,或者成品板子把mcu去掉,从硬件的角度看一下整个板子的功耗情况。还有一招就是慢慢的增加外设,看一下外设的功耗情况。