嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > 基于stm32(g0)实现低功耗(stop模式)中断唤醒实验

基于stm32(g0)实现低功耗(stop模式)中断唤醒实验

基于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去掉,从硬件的角度看一下整个板子的功耗情况。还有一招就是慢慢的增加外设,看一下外设的功耗情况。