一、电源框图

        VDDA 供电区域,主要是 ADC 电源以及参考电压,STM32 ADC 模块配备独立的供电方
式,使用了 VDDA 引脚作为输入,使用 VSSA 引脚作为独立地连接,VREF 引脚为提供给 ADC
参考电压。
电压调节器是 STM32
的电源系统中最核心部分,连接 VDD 供电区域和 1.8 供电区域。
VDD供电来自于 VSS VDD,给 I/O 电路以及待机电路供电,电压调节器主要为备份域以及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及RAM,调节器的输出电压约为1.8V,因此由调压器供电的区域称为 1.8V 供电区域。电压调节器根据应用方式不同有三种不同的工作模式。在运行模式下,调节器以正常工作模式为内核、内存和外设提供 1.8V;在停止模式下,调节器以低功耗模式提供 1.8V 电源,以保存寄存器和 SRAM 的内容。在待机模式下,调节器停止供电,除了备用电路和备份域外,寄存器和 SRAM 的内容全部丢失。
        电池备份区域也就是后备供电区域,使用电池或者其他电源连接到 VBAT 脚上,当 VDD断电
时,可以保存备份寄存器的内容和维持 RTC 的功能。同时 VBAT 引脚也为 RTC LSE 振荡器
供电,这保证了当主要电源被切断时,RTC 能够继续工作。切换到 VBAT 供电由复位模块中的掉
电复位功能控制。

二、电源管理

电源管理的部分我们要关注低功耗模式,在 STM32 的正常工作中,具有四种工作模式,运
行、睡眠、停止以及待机。当单片机上电运行后,不需要内核继续运行,就可以选择睡眠、停止以及待机三种低功耗模式。
睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时
(SysTick)等仍在运行)。
停止模式(所有的时钟都已停止)。
待机模式(1.8V电源关闭)。
2.1、睡眠模式:

立即睡眠

在执行 WFI 或 WFE 指令时立即进入睡眠模式。

退出时睡眠

在退出优先级最低的中断服务程序后才进入睡眠模式。

进入方式

内核寄存器的SLEEPDEEP = 0 ,然后调用WFIWFE指令即可进入睡眠模式;

另外若内核寄存器的SLEEPONEXIT=0时,进入“立即睡眠”模式,SLEEPONEXIT=1时,进入“退出时睡眠”模式。

唤醒方式

如果是使用WFI指令睡眠的,则可使用任意中断唤醒;

如果是使用WFE指令睡眠的,则由事件唤醒。

睡眠时

关闭内核时钟,内核停止,而外设正常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。

唤醒延迟

无延迟。

唤醒后

若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。

只需要调用这个函数,选择一下进入模式,中断进入/时间进入。PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instructionPWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instructionHAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)

2.2、停止模式

调压器低功耗模式

在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗

FLASH掉电模式

在停止模式下FLASH可工作在正常模式或掉电模式,可进一步降低功耗

进入方式

内核寄存器的SLEEPDEEP =1PWR_CR寄存器中的PDDS=0,然后调用WFIWFE指令即可进入停止模式;

PWR_CR 寄存器的LPDS=0时,调压器工作在正常模式,LPDS=1时工作在低功耗模式;

唤醒方式

如果是使用WFI指令睡眠的,可使用任意EXTI线的中断唤醒;

如果是使用WFE指令睡眠的,可使用任意配置为事件模式的EXTI线事件唤醒。

停止时

内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据。

唤醒延迟

基础延迟为HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间,若FLASH工作在掉电模式,还需要加上FLASH从掉电模式唤醒的时间。

用KEY0来进入停止模式,然后使用任意外部中断唤醒。uint8_t KEY0_Scan(void) {static uint8_t key_pressed = 0;         if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET) {HAL_Delay(20);                        if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET && key_pressed == 0) {key_pressed = 1;               while (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET);printf("按键0触发了,进入停止模式\n");  I2C_Write(0,I2C_Wbuf,  strlen((char*)I2C_Wbuf) + 1);HAL_PWR_EnterSTOPMode(1, PWR_SLEEPENTRY_WFI);return 1;  }} else {key_pressed = 0;}return 0;}退出停止模式
因为停止模式,会关闭HSE和PLL,所以在退出时,必须重新开启HSE和PLL。void CLK_Resume()
{//使能HSE__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET){}//使能PLL__HAL_RCC_PLL_ENABLE();while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET){}	//选择PLL作为系统时钟__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK);while(__HAL_RCC_GET_SYSCLK_SOURCE() != 0x08 ){}
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_2) {CLK_Resume();printf("退出停止模式\n");key_pressed_flag = 1;        key_debounce_start = HAL_GetTick(); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2); }
}

现象:

2.3、待机模式

进入方式

内核寄存器的SLEEPDEEP =1PWR_CR寄存器中的PDDS=1PWR_CR寄存器中
的唤醒状态位
WUF=0,然后调用WFIWFE指令即可进入待机模式;

唤醒方式

通过WKUP引脚的上升沿,RTC闹钟、唤醒、入侵、时间戳事件或NRST引脚外部复位
IWDG复位唤醒。

待机时

内核停止,片上外设也停止;内核寄存器、内存的数据会丢失;除复位引脚、
RTC_AF1引脚及WKUP引脚,其它I/O口均工作在高阻态。

唤醒延迟

芯片复位的时间

唤醒后

相当于芯片复位,在程序表现为从头开始执行代码。

代码:
GPIO.C 
//下述代码实现了,按键1进入待机模式,并且用中断0进行唤醒,唤醒后相当于重新上电。
uint8_t  key_pressed_flag = 0;   
uint32_t key_debounce_start = 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  //将PA0配置为中断模式
{if(GPIO_Pin == GPIO_PIN_0){HAL_ResumeTick();   //恢复systick中断,否则不能使用HAL_Delayprintf("退出待机模式\n");key_pressed_flag = 1;        key_debounce_start = HAL_GetTick(); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); }
}void KEYUP_Scan(void) 
{
if (key_pressed_flag == 1) {if (HAL_GetTick() - key_debounce_start > 20) {if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {if (HAL_GetTick() - key_debounce_start > 1000) {break; }}										printf("按键2触发!LED状态已翻转\n");										                   }key_pressed_flag = 0; }						
}
}
uint8_t KEY1_Scan(void) {static uint8_t key_pressed = 0;         if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET) {HAL_Delay(20);                        if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET && key_pressed == 0) {key_pressed = 1;               while (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET);printf("按键1触发了,进入待机模式\n");  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);  //使能唤醒引脚__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnterSTANDBYMode();      //进入到待机模式return 1;  }} else {          key_pressed = 0;}return 0;
}void Key_Process(void)
{KEY1_Scan();KEYUP_Scan();
}
现象:
按完按键1之后,相当于复位,程序从头执行代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95748.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95748.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95748.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章带你彻底搞懂 JVM 垃圾收集器

垃圾收集器是 JVM 内存管理的执行引擎,负责自动回收无用的对象内存。其设计核心是 权衡:主要是吞吐量和停顿时间之间的权衡。没有“最好”的收集器,只有“最适合”特定场景的收集器。一、核心基础:分代收集模型主流 HotSpot JVM 采…

服务器排故随笔:服务器无法ssh远程登录

文章目录服务器排故随笔:服务器无法远程登录问题现象解决过程第一步:确认故障描述是否准确第二步:确认网络是否有问题第三步:确认ssh服务是否有问题第四步:确认防火墙是否放行sshd服务第五步:试试万能的“重…

Deeplizard深度学习课程(六)—— 结合Tensorboard进行结果分析

前言 Tensorboard最初是tensorflow的可视化工具,被用于机器学习实验的可视化,后来也适配了pytorch。Tensorboard是一个前端web界面,,能够从文件里面读取数据并展示它(比如损失、准确率、网络图)。具体使用可…

C语言————实战项目“扫雷游戏”(完整代码)

无论是找工作面试,还是课设大作业、考研,都离不开实战项目的积累,如果你能把一个项目搞明白,并且给别人熟练的讲出来,即使你没有过项目经历,也可以说是非常加分的,下面来沉浸式体验一下这款扫雷…

数据结构之加餐篇 -顺序表和链表加餐

目录一、链表分割二、随机链表的复制总结一、链表分割 链表分割 题目描述的意思就如下图: 也就是把1,2挪到前面,6,3,5挪到后面,前者的相对顺序不发生改变 这里要想往后挪就要先遍历,遍历到6…

JSP与Servlet整合数据库开发:构建Java Web应用的全栈指南

JSP与Servlet整合数据库开发:构建Java Web应用的全栈指南 概述 在Java Web开发领域,JSP(JavaServer Pages)与Servlet是构建动态Web应用的核心技术组合。Servlet作为Java EE的基础组件,负责处理客户端请求、执行业务逻…

设计五种算法精确的身份证号匹配

问题定义与数据准备 我们有两个Excel文件: small.xlsx: 包含约5,000条记录。large.xlsx: 包含约140,000条记录。 目标:快速、高效地从large.xlsx中找出所有其“身份证号”字段存在于small.xlsx“身份证号”字段中的记录,并将这些匹配的记录保…

Spring 框架(IoC、AOP、Spring Boot) 的必会知识点汇总

目录:🧠 一、Spring 框架概述1. Spring 的核心功能2. Spring 模块化结构🧩 二、IoC(控制反转)核心知识点1. IoC 的核心思想2. Bean 的定义与管理3. IoC 容器的核心接口4. Spring Bean 的创建方式🧱 三、AOP…

简单工厂模式(Simple Factory Pattern)​​ 详解

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页: Meteors.的博客 💞当前专栏: 设计模式 ✨特色专栏: 知识分享 &…

新电脑硬盘如何分区?3个必知技巧避免“空间浪费症”!

刚到手的新电脑,硬盘就像一间空荡荡的大仓库,文件扔进去没多久就乱成一锅粥?别急,本文会告诉你新电脑硬盘如何分区,这些方法不仅可以帮你给硬盘分区,还可以调整/合并分区大小等。所以,本文的分区…

【微知】git submodule的一些用法总结(不断更新)

文章目录综述要点细节如何新增一个submodule?如何手动.gitmodules修改首次增加一个submodule?git submodule init,init子命令依据.gitmodules.gitmodules如何命令修改某个成员以及同步?如果submodule需要修改分支怎么办&#xff1…

【Spring Cloud微服务】9.一站式掌握 Seata:架构设计与 AT、TCC、Saga、XA 模式选型指南

文章目录一、Seata 框架概述二、核心功能特性三、整体架构与三大角色1. Transaction Coordinator (TC) - 事务协调器(Seata Server)2. Transaction Manager (TM) - 事务管理器(集成在客户端)3. Resource Manager (RM) - 资源管理器…

AI赋能!Playwright带飞UI自动化脚本维护

80%的自动化脚本因一次改版报废? 开发随意改动ID导致脚本集体崩溃?背景UI自动化在敏捷开发席卷行业的今天,UI自动化测试深陷一个尴尬困局:需求迭代速度(平均2周1次)> 脚本维护速度(平…

Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南

Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南 1. 问题背景介绍 在分布式系统中,多节点并发访问共享资源时,如果不加锁或加锁不当,会导致数据不一致、超卖超买、竞态条件等问题。常见的分布式锁方案包括基于Redis、Zoo…

网络安全A模块专项练习任务十一解析

任务十一:IP安全协议配置任务环境说明: (Windows 2008)系统:用户名Administrator,密码Pssw0rd1.指定触发SYN洪水攻击保护所必须超过的TCP连接请求数阈值为5;使用组合键winR,输入regedit打开注册表编辑器&am…

金蝶中间件适配HGDB

文章目录环境文档用途详细信息环境 系统平台:Microsoft Windows (64-bit) 10 版本:5.6.5 文档用途 本文章主要介绍金蝶中间件简单适配HGDB。 详细信息 一、金蝶中间件Apusic安装与配置 1.Apusic安装与配置 Windows和Linux下安装部署过程相同。 &…

使用a标签跳转之后,会刷新一次,这个a标签添加的样式就会消失

<ul class"header-link"><li><a href"storeActive.html">到店活动</a></li><li><a href"fuwu.html">服务</a></li><li><a href"store.html">门店</a></l…

线程池实现及参数详解

线程池概述 Java线程池是一种池化技术&#xff0c;用于管理和复用线程&#xff0c;减少线程创建和销毁的开销&#xff0c;提高系统性能。Java通过java.util.concurrent包提供了强大的线程池支持。 线程池参数详解 1. 核心参数 // 创建线程池的完整构造函数 ThreadPoolExecu…

K8S 部署 NFS Dynamic Provisioning(动态存储供应)

K8S 部署 NFS Dynamic Provisioning&#xff08;动态存储供应&#xff09; 本文档提供完整的 K8s NFS 动态存储部署流程&#xff0c;包含命名空间创建、RBAC 权限配置、Provisioner 部署、StorageClass 创建及验证步骤。 2. 部署步骤 2.1 创建命名空间 首先创建独立的命名空间 …

JavaEE 进阶第二期:开启前端入门之旅(二)

专栏&#xff1a;JavaEE 进阶跃迁营 个人主页&#xff1a;手握风云 目录 一、VS Code开发工具的搭建 1.1. 创建.html文件 1.2. 安装插件 1.3. 快速生成代码 二、HTML常见标签 2.1. 换行标签 2.2. 图片标签: img 2.3. 超链接 三、表格标签 四、表单标签 4.1. input标…