【STM32笔记】STM32的低功耗模式

这篇具有很好参考价值的文章主要介绍了【STM32笔记】STM32的低功耗模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 低功耗模式

  在嵌入式系统设计中,嵌入式系统被广泛的应用在便携式和移动性较强的产品,然而有一些产品并不都是有着充足的电源供应,为了尽可能地延长电池使用时间,这个时候就要考虑降低功率消耗了。
  在系统或电源复位以后,微控制器处于运行的状态,当CPU不需要继续运行时,可以利用多种低功耗模式来降低节省功耗。在STM32F103系列芯片中提供了睡眠模式,停止模式和待机模式三种模式。此外,在运行模式下还可以通过降低系统是时钟或关闭APB和AHB总线上未被使用的外设时钟的方式来降低功耗。

  • 睡眠模式:CortexTM-M3内核停止,所有的外设包括Cortex-M3核心的外设,如NVIC,系统时钟(SysTick)等仍运行。
  • 停止模式:所有时钟都已停止。
  • 待机模式:1.8V电源关闭。
    此外,在运行模式下,可以通过以下方式中的一种降低功耗
  • 降低系统时钟
  • 关闭APB和AHB总线上未被使用的外设时钟
    降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机
    当然在使用低功耗模式时,需要注意仔细配置和管理,在使用STM32的低功耗模式时,需要注意以下几点:
    1.在进入低功耗模式之前,需要关闭未使用的外设和时钟,最大程度地降低功耗。
    2.在唤醒后,需要重新初始化某一些外设和时钟。
    3.低功耗模式需要进行合理的功耗管理和唤醒源选择,以防止设备在必要时未能及时的唤醒,或者时功耗没有达到预期的水平。

二. 睡眠模式

  在此模式下,CPU停止工作,但SRAM保持内容。可以通过中断或特定事件唤醒,唤醒后回到睡眠的位置向后执行。

1. 进入睡眠模式

  通过执行WFI或WFE指令执行睡眠模式。根据Cortex-M3系统控制寄存器中的SLEEPOONEXIT位的值有两种选项可以用于选择睡眠模式进入该机制。当进入睡眠模式后,所有的I/O引脚都保持它们在运行模式时的状态。

  • SLEEP-NOW:如果SLEEPONEXIT位被清除,当WRI或WFE被执行时,微控制器立即进入睡眠模式。
  • SLEEP-ON-EXIT:如果SLEEPONEXIT位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就立即进入睡眠模式。

2. 退出睡眠模式

  如果是执行WFI指令进入的睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。
  如果执行WFE指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。唤醒事件可以通过下述方式产生:

  • 在外设控制寄存器中使能一个中断,而不是在NVIC(嵌套向量中断控制器)中使能,并且在Cortex-M3系统控制寄存器中使能SEVONPEND位。当MCU从WFE中唤醒后,外设的中断挂起位和外设的NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)必须被清除。
  • 配置一个外部或内部的EXIT线为事件模式。当MCU从WFE中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的NVIC中断通道挂起位。
    降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机
    降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机
    打开STM32CubeMX,先配置好基础设置。
    将PA0设置为外部中断0,通过触发外部中断唤醒STM32
    降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机
    同时使能外部中断通道0
    降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机

-----睡眠模式(外部中断唤醒)
在mian.c文件中添加如下代码
上电后,LED小灯以每一秒翻转电平6次后进入睡眠模式,当有外部中断触发后,退出睡眠模式,LED小灯继续亮灭。如此反复。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  unsigned int timer = 0;
  while (1)
  {
	  // 睡眠模式 外部中断唤醒睡眠模式
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
	  if(timer == 5){
		  HAL_SuspendTick(); // 停止系统滴答定时器 这个函数可以自行去go to查找一下或者在stm32f1xx_hal.c文件中查找一下
		  HAL_PWR_EnterSLEEPMode(0,PWR_SLEEPENTRY_WFI); // 开启STM32的睡眠模式 这个函数可以自行去go to查找一下或者在stm32f1xx_hal_pwr.c文件中查找一下
		  HAL_ResumeTick(); // 启用系统滴答定时器 这个函数可以自行去go to查找一下或者在stm32f1xx_hal.c文件中查找一下
		  timer = 0;
	  }
	  timer++;
	  /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

-----睡眠模式(外部中断唤醒,但是只处理中断服务函数)
在mian.c文件中添加如下代码
上电后,LED小灯以每一秒翻转电平6次后进入睡眠模式后,当有外部中断触发后,退出睡眠模式,执行外部中断回调函数需要执行的操作,执行完之后再进入睡眠模式。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  	  // 睡眠模式 外部中断唤醒但是只响应中断服务函数 将翻转电平函数放在外部中断处理函数中
	  HAL_Delay(1000);
	  if(timer == 5){
		  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
		  HAL_SuspendTick(); // 停止系统滴答定时器 
		  HAL_PWR_EnableSleepOnExit(); // 使能睡眠模式只响应外部中断触发睡眠模式失效,中断服务函数结束后再进入睡眠模式 这个函数可以自行去go to查找一下或者在stm32f1xx_hal_pwr.c文件中查找一下
		  HAL_PWR_EnterSLEEPMode(0,PWR_SLEEPENTRY_WFI); // 开启STM32的睡眠模式
		  HAL_ResumeTick(); // 启用系统滴答定时器 
		  timer = 0;
	  }
	  timer++;
	/* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

在main.c文件中写入外部中断回调处理函数要做的操作

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	if(GPIO_Pin == GPIO_PIN_0){
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
	}
}
/* USER CODE END PFP */

-----睡眠模式(外部事件唤醒)
在mian.c文件中添加如下代码
上电后,LED小灯以每一秒翻转电平6次后进入睡眠模式,当有外部事件触发后,退出睡眠模式,LED小灯继续亮灭。如此反复。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  	  // 睡眠模式 外部事件唤醒睡眠模式 需要将外部中断线设置为外部事件中断模式
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
	  if(timer == 5){
		  HAL_SuspendTick(); // 停止系统滴答定时器 
		  HAL_PWR_EnterSLEEPMode(0,PWR_SLEEPENTRY_WFE); // 开启STM32的睡眠模式
		  HAL_ResumeTick(); // 启用系统滴答定时器 
		  timer = 0;
	  }
	  timer++;
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

三. 停止模式

  在此模式下,关闭所有1.8V区域的时钟,同时HSI和HSE RC振荡器也关闭,但SRAM和寄存器保持内容不丢失。可以通过任一外部中断、RTC或特定事件唤醒,唤醒后回到被停止的代码处向后执行,但是要重新初始化时钟和外设。

1. 进入停止模式

  在停止模式下,通过设置电源控制寄存器(PWR_CR)的LPDS位使内部调节器进入低功耗模式,能够降低更多的功耗。如果在进入ADC和DAC没有被关闭,则这些外设仍然消耗电流。可以通过设置寄存器ADC_CR2的ADON位和寄存器DAC_CR的ENx位为0可关闭这2个外设。
降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机

2. 退出停止模式

  当一个中断或唤醒事件导致退出停止模式时,HSI RC振荡器被选为系统时钟。当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。
降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机

-----停止模式(外部中断唤醒)
在mian.c文件中添加如下代码
上电后,LED小灯以每一秒翻转电平6次后进入停止模式,当有外部中断触发后,退出停止模式,LED小灯继续亮灭。如此反复。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  // 停止模式 外部中断唤醒停止模式 电压调节器为低功耗模式
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
	  if(timer == 5){
		  HAL_SuspendTick(); // 停止系统滴答定时器
		  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI); // 电压调节器为低功耗模式,开启STM32的停止模式
		  SystemClock_Config(); // 重新配置系统时钟
		  HAL_ResumeTick(); // 启用系统滴答定时器 
		  timer = 0;
	  }
	  timer++;
	  /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

-----停止模式(外部事件唤醒)
在mian.c文件中添加如下代码
上电后,LED小灯以每一秒翻转电平6次后进入停止模式,当有外部事件触发后,退出停止模式,LED小灯继续亮灭。如此反复。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  // 停止模式 外部事件唤醒停止模式 需要将外部中断线设置为外部事件中断
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
	  if(timer == 5){
		  HAL_SuspendTick(); // 停止系统滴答定时器 
		  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFE); // 电压调节器为低功耗模式,开启STM32的停止模式
		  SystemClock_Config(); // 重新配置系统时钟
		  HAL_ResumeTick(); // 启用系统滴答定时器 
		  timer = 0;
	  }
	  timer++;
	/* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

四. 待机模式

  在此模式下,时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电,当一个外部复位(NRST脚)、IWDG复位、WKUP引脚(PA0)上的上升沿或RTC闹钟事件的上升沿发生时,微控制器才可从待机模式退出。

1. 进入待机模式

降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机

2. 退出待机模式

降低stm32的时钟频率可以降低功耗吗,STM32笔记,stm32,笔记,单片机

-----待机模式(外部事件唤醒)
在mian.c文件中添加如下代码
上电后,LED小灯以每一秒翻转电平6次后进入停止模式,当有外部中断触发后,退出待机模式,LED小灯继续亮灭。如此反复。文章来源地址https://www.toymoban.com/news/detail-789164.html

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  // 待机模式 WKUP唤醒待机模式(上升沿) 当触发唤醒时其效果相当与按下了开发板的复位键 注意:需要手动将按键PA0设置为SYS_WKUP模式(STM32CubeMX配置的SYS_WKUP无法使用)
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
	  if(timer == 5){
		  SET_BIT(PWR->CR,PWR_CR_CWUF_Msk);
		  HAL_PWR_EnterSTANDBYMode(); // 开启STM32的待机模式
		  timer = 0;
	  }
	  timer++;
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	
}
  /* USER CODE BEGIN 2 */
    // 待机模式 
	HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 将PA0设置为SYS_WKUP模式
	SET_BIT(PWR->CR,PWR_CR_CSBF_Msk); // 清除唤醒位标志 SET_BIT 宏定义函数是用于在寄存器中设置某个特定的位。
	SET_BIT(PWR->CR,PWR_CR_CWUF_Msk); // 清除待机位标志
  /* USER CODE END 2 */

到了这里,关于【STM32笔记】STM32的低功耗模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 11、江科大stm32视频学习笔记——输入捕获模式测频率、PWMI模式测频率占空比

    目录 一、知识点 1、IC(Input Capture)输入捕获 2、通用定时器结构 (1)输出比较的执行逻辑 (2)四个输入捕获和输出比较通道 (3)输入捕获的执行流程和输出比较的区别 (4)输入捕获的作用 (5)输入捕获通道 (6)PWMI模式:同时测量频率和占空比 (7)主从触发模式:

    2024年02月13日
    浏览(26)
  • STM32系统时钟频率更改

    注:此文仅作为个人学习记录。 海创学习记录: 图0:手册时钟图   stm32的系统时钟频率在驱动文件中一般情况下是被固定的。系统频率有几种,分别为24MHz、36MHz、48MHz、56MHz、72MHz。一般情况下(_md.s),默认设置为72MHz。可以对系统时钟频率进行更改以适应不同的要求。  

    2024年02月11日
    浏览(28)
  • STM32 学习笔记(六)定时器中断:内部时钟模式,外部时钟模式

    定时器是功能最强大,内容最复杂的32结构。 之前51用过的功能,定时产生中断。 输出比较,常用于产生 PWM 波形,驱动电机等。 输入捕获,测量方波频率。 编码器,读取正交编码器的波形。 最大定时时间:72M/65536/65536=中断频率,中断频率取倒数是最大定时时间。 定时器可

    2024年02月08日
    浏览(40)
  • 洋桃电子STM32F407单片机入门教程笔记九:低功耗模式

      此文档作为对洋桃电子STM32F407单片机视频的整理,B站链接: 第28集)低功耗模式_哔哩哔哩_bilibili         在之前的程序里应用程序在while(1)主循环中反复执行,ARM内核以100%的功率工作。这样的设计简单稳定,内核全速运行的功耗也只有几十毫安,对于外接电源的设备

    2024年01月23日
    浏览(45)
  • 【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

    【STM32】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案) 低功耗模式如图所示 停止模

    2023年04月08日
    浏览(25)
  • STM32pwm 时钟 配置 周期 频率 关系配置原理

    PWM(脉冲宽度调制)是一种常用的电子信号调制技术,用于控制电子设备中的电平和电流。它通过调整脉冲的宽度来控制信号的平均功率。 在PWM信号中,一个周期由一个固定的频率确定,称为PWM频率。每个周期内,脉冲的高电平时间称为占空比,表示高电平时间与周期时间的

    2024年02月09日
    浏览(29)
  • 【STM32笔记】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断)

    【STM32】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案) __WFI

    2024年02月10日
    浏览(36)
  • (stm32)低功耗模式

     执行哪个低功耗模式的程序判断流程 标志位设置操作一定要在WFI/WFE之前,调用此指令后立即进入睡眠判断流程      

    2024年02月12日
    浏览(74)
  • STM32--低功耗模式详解

    正常模式与睡眠模式耗电是mA级,停机模式与待机模式是uA级。 供电区域有三处,分别是 模拟部分供电(VDDA) ,数字部分供电,包括 VDD供电区域和1.8V供电区域 , 后备供电(VBAT) 。 PDDS 位用来区分停机还是待机模式。 PDDS = 0,进入停机模式,PDDS = 1,进入待机模式 ; LPD

    2024年03月26日
    浏览(36)
  • STM32 低功耗-待机模式

    在 STM32 的正常工作中,具有四种工作模式: 运行、睡眠、停止和待机模式 。 在系统或电源复位以后,微控制器处于运行状态,当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗。这些低功耗模式电源消耗不同、唤醒时间不同和唤醒源不同。 例如等待某个外部事件

    2024年02月14日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包