【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)

【STM32笔记】低功耗模式配置及避坑汇总

一、低功耗模式简介

系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳平衡。

睡眠模式、停止模式及待机模式中,若备份域电源正常供电,备份域内的 RTC 都可以正常运行,备份域内的寄存器的数据会被保存,不受功耗模式影响。

从表中可以看到,这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。

模式 说明 进入方式 唤醒 对1.8V区域时钟的影响 对VDD区域时钟的影响 调压器
睡眠模式 内核停止,所有外设包括M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行 WFI、WFE命令(HAL库直接调用) 任意中断/事件 内核时钟关,对其他时钟和ADC时钟无影响
停止模式 所有的时钟都已停止 配置PWR_CR寄存器的PDDS+LPDS位+SLEEPDEEP位+WFI或WFE命令 任意外部中断EXTI(在外部中断寄存器中设置) 关闭所有1.8V区域的时钟 HSI和HSE的振荡器关闭 开启或处于低功耗模式(依据电源控制寄存器的设定)
待机模式 1.8V电源关闭 配置PWR_CR寄存器的PDDS+SLEEPDEEP位+WFI或WFE命令 WKUP、引脚的RTC闹钟事件、NRST引脚上的外部复位、IWDG复位 关闭所有1.8V区域的时钟 HSI和HSE的振荡器关闭

L4及L4+的通用模式状态表可见手册

blog.csdn.net/weixin_53403301/article/details/129031935
【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

blog.csdn.net/weixin_53403301/article/details/129055530
【STM32笔记】低功耗模式下GPIO省电配置避坑实验(闲置引脚配置为模拟输入其实更耗电)

blog.csdn.net/weixin_53403301/article/details/129060093
【STM32笔记】低功耗模式下GPIO、外设省电配置避坑

1.1 睡眠模式

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM3 核心的外设全都还照常运行。有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是 WFI(wait for interrupt) 和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。

特性和说明:立即睡眠: 在执行 WFI 或 WFE 指令时立即进入睡眠模式。
退出时睡眠: 在退出优先级最低的中断服务程序后才进入睡眠模式。
进入方式: 内核寄存器的 SLEEPDEEP=0 ,然后调用 WFI 或 WFE 指令即可进入睡眠模式;SLEEPONEXIT=1 时,进入“退出时睡眠”模式。
唤醒方式: 如果是使用 WFI 指令睡眠的,则可使用任意中断唤醒;如果是使用 WFE 指令睡眠的,则由事件唤醒。
睡眠时: 关闭内核时钟,内核停止,而外设正常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。
唤醒延迟: 无延迟。
唤醒后: 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI 指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。

唤醒后即可开始行动 继续程序 无需配置任何寄存器

睡眠模式和低功耗睡眠模式是两个模式 由PWR_MAINREGULATOR_ON和PWR_LOWPOWERREGULATOR_ON两个变量确定

要进入低功耗睡眠模式 首先得进入低功耗运行模式
HAL_PWREx_EableLowPowerRunMode()
且工作频率降低到2MHz以下

唤醒时 睡眠模式直接唤醒

而低功耗睡眠模式唤醒后 会进入到低功耗运行模式 若想正常工作 需用HAL_PWREx_DisableLowPowerRunMode()退出

1.2 停止模式

在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒,在停止模式中可以选择电压调节器为开模式或低功耗模式。

特性和说明:调压器低功耗模式: 在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗。
进入方式: 内核寄存器的 SLEEPDEEP=1,PWR_CR 寄存器中的 PDDS=0,然后调用 WFI 或 WFE 指令即可进入停止模式;PWR_CR 寄存器的 LPDS=0 时,调压器工作在正常模式,LPDS=1 时工作在低功耗模式。
唤醒方式: 如果是使用 WFI 指令睡眠的,可使用任意 EXTI 线的中断唤醒;如果是使用 WFE 指令睡眠的,可使用任意配置为事件模式的 EXTI 线事件唤醒。
停止时: 内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据。
唤醒延迟: 基础延迟为 HSI 振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间。
唤醒后: 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI 指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。唤醒后,STM32 会使用 HSI 作为系统时钟。

只能由外部中断唤醒 唤醒后需要重新使能时钟(SystemClock_Config();)
建议将一条外部中断线专门作为唤醒中断,执行中断后进入回调进行时钟使能

停止模式0和1由PWR_MAINREGULATOR_ON和PWR_LOWPOWERREGULATOR_ON两个变量确定

停止模式0和1可以被串口 I2C等设备唤醒(具体看手册)

停止模式2则在pwr_ex.c中进入

停止模式2 只能被特定器件(如LPUART等在内部与EXTI有链接的器件)唤醒

详情见后续关于STOP模式串口唤醒的文章

blog.csdn.net/weixin_53403301/article/details/129014963
【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决串口唤醒和回调无法一起使用的问题)

1.3 待机模式

翻译成shutdown更为合适
待机模式,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot 条件,从头开始执行程序。它有四种唤醒方式,分别是 WKUP(PA0)引脚的上升沿,RTC 闹钟事件,NRST 引脚的复位和 IWDG(独立看门狗)复位。

特性和说明:进入方式: 内核寄存器的 SLEEPDEEP=1,PWR_CR 寄存器中的 PDDS=1,PWR_CR 寄存器中的唤醒状态位 WUF=0,然后调用 WFI 或 WFE 指令即可进入待机模式。
唤醒方式: 通过 WKUP ,RTC 闹钟、唤醒、入侵、时间戳事件或 NRST 引脚外部复位及 IWDG 复位唤醒。
待机时: 内核停止,片上外设也停止;内核寄存器、内存的数据会丢失;除复位引脚、RTC_AF1 引脚及 WKUP 引脚,其它 I/O 口均工作在高阻态。
唤醒延迟: 芯片复位的时间。
唤醒后: 相当于芯片复位,在程序表现为从头开始执行代码。

代码实操

SYS配置:

选择Serial Wire模式可以在某些情况下进行调试如(SWD)

配置外部中断就不说了

进入低功耗模式的函数

引脚指定只对待机模式有效
HAL_PWR_EnableWakeUpPin(WakeUpPinPolarity);
该函数指定的引脚不受引脚其他的配置影响(比如已经被配成了复用)

__HAL_RCC_PWR_CLK_ENABLE(); 可要可不要

/*!* @brief         进入低功耗模式     ** @param  [in]    mode_flag: 模式标志*                                0/大于4 不进入任何模式,1 进入睡眠,2 进入停止,3 进入待机,4 关机*                [in]    WakeUpPinPolarity: 待机模式下WKUP唤醒引脚极性配置,其他模式无用** @return               None*/
void Enter_Low_PWR(uint8_t mode_flag,uint32_t WakeUpPinPolarity)
{__HAL_RCC_PWR_CLK_ENABLE();switch(mode_flag){case 0:{printf("[INFO] 不进入低功耗模式\n");break;}case 1:{printf("[INFO] 进入睡眠模式\n");delay_ms(10);  //消抖__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);break;}case 2:{printf("[INFO] 进入停止模式\n");delay_ms(10);  //消抖__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);break;}case 3:{printf("[INFO] 三秒后进入待机模式\n");delay_ms(3000);printf("[INFO] 进入待机模式\n");HAL_PWR_EnableWakeUpPin(WakeUpPinPolarity);delay_ms(10);  //消抖__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnterSTANDBYMode();break;}case 4:{printf("[INFO] 三秒后进入关机模式\n");delay_ms(3000);printf("[INFO] 进入关机模式\n");HAL_PWR_EnableWakeUpPin(WakeUpPinPolarity);delay_ms(10);  //消抖__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWREx_EnterSHUTDOWNMode();break;}default:{printf("[INFO] 不进入低功耗模式\n");break;}}
}

外部中断回调(只对STOP模式有效果 SLEEP模式可以省略):

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{switch(GPIO_Pin){case WAKE_UP_Pin:{__HAL_RCC_PWR_CLK_ENABLE();SystemClock_Config();}default:{          break;}}__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
}

ADC唤醒无法使用的解决方案

从STOP模式唤醒 会导致L4系列等MCU的ADC无法使用
原因就是PLLSAI时钟被关闭了 就算从头开始初始化也没用
所以只需要更换时钟源即可

低功耗模式无法烧录解决方案

在进入到待机模式后 相当于强行死机了 无法进行烧录 只能手动复位后烧录
但在调试时 将进入待机模式的函数放得太前 则完全无法烧录 这时候就需要从硬件方面解决

把烧写程序用的软件复位NREST引脚与硬件复位短接 那么在烧写时 复位引脚就会被拉低 这样的话 就算是shutdown模式 也能正常烧写程序 就不用像之前那样一直按复位卡时间点了

省电优化

在CubeMX里面有一项设置,就是把没有用到的引脚全部设置为省电(模拟输入) 这样可以更省电

部分理论参考:
leung-manwah.blog.csdn.net/article/details/114675725

【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)相关推荐

  1. 【STM32】HAL库 STM32CubeMX教程九---ADC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  2. 【STM32】HAL库-电源控制(低功耗模式)

    电源框图 STM32 的电源系统主要分为备份域电路.内核电路以及 ADC 电路三部分 备份域电路 STM32 的 LSE 振荡器.RTC.备份寄存器及备份 SRAM 这些器件被包含进备份域电路中,这部 ...

  3. 配置CLion进行嵌入式STM32的HAL库开发

    前言 时不可以苟遇,道不可以虚行. 一.准备 1.软件 CLion-2020:百度网盘提取链接放在文章最后. STM32CubeMX:使用 6.5.0 版本的,不要使用最新版本的 CubeMX,不然没 ...

  4. STM32 RTC时钟掉电日期不更新 STM32 HAL库RTC时钟配置

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STM32 RTC时钟掉电日期不更新 & STM32 HAL库RTC时钟配置 一.STM32CubeMX RTC配置 二.RT ...

  5. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...

  6. 正点原子STM32(基于HAL库)3

    目录 高级定时器实验 高级定时器简介 高级定时器输出指定个数PWM 实验 高级定时器输出指定个数PWM原理 TIM1/TIM8 寄存器 硬件设计 课堂源码(输出指定个数PWM灯就闪几次) 程序设计 下 ...

  7. 正点原子STM32(基于HAL库)5

    目录 SRAM 实验 存储器简介 SRAM 方案简介 硬件设计 程序设计 程序流程图 程序解析 下载验证 内存管理实验 内存管理简介 硬件设计 程序设计 程序流程图 程序解析 下载验证 SD 卡实验 ...

  8. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  9. 【STM32】HAL库 STM32CubeMX教程十---DAC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

最新文章

  1. 人生快乐之道(组图)
  2. 5.QT5中的connect的实现
  3. 自动化测试基础之Python常见问题
  4. php memcached get,PHP Memcached操作类
  5. iOS 11 下 UICollectionView 出现滚动条被 HeaderView 遮挡的问题
  6. Apache Flink 漫谈系列(06) - 流表对偶(duality)性
  7. 【转】CentOs中Apache开启rewrite模块详解
  8. C++ Qt高级开发视频教程
  9. 饮用水配送管理系统项目解决方案
  10. Tomcat修改默认端口号
  11. 接口测试流程和用例设计
  12. 4款简单实用的的服务器文件管理工具推荐
  13. c语言汇率转换代码_拜求c语言编写的人民币大小写转换的代码!
  14. 蓝湖怎么切图标注_如何用蓝湖做自动标注 ?
  15. 解决Linux系统centos7的开机报错:Welcome to emergency mode
  16. 21(6). 赋值兼容规则与抽象类
  17. 如何规避苹果审查,实现app store上的app版本强制更新
  18. 正则表达式 语法详解
  19. C# NPOI 批量导出Excel 打包下载
  20. REXROTH力士乐柱塞泵A10VSO100DRS/32R-VPB12N00

热门文章

  1. 活动图的制作非常简单,只需5个步骤即可完成精美互动图!
  2. 超硬核之傅里叶公式推导(上)
  3. android 权限开启回调,Android M请求onSurfaceTextureAvailable回调权限不在活动
  4. hypermesh闪退启动解决(最全!!!)
  5. 2020.8.28丨蛋白质组产品介绍、方案设计和案例解析
  6. Android和Java中的回调函数
  7. 区块链赋能医疗产业报告
  8. EXCEL Function Part II Chapter 3 —— 用函数统计和汇总数据
  9. 金蝶云苍穹集成,苍穹到eas审核反审核
  10. 前端实现文字竖向排版