STM32学习和实践笔记(33):待机唤醒实验

1.STM32待机模式介绍

  很多单片机具有低功耗模式,比如MSP430、STM8L等,我们的STM32也不例外。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK CPU提供时钟,并执行程序代码。这是正常的一般运行模式。

当 CPU 不需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省功耗。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

  当然在运行模式下,也可以通过如下方式降低功耗

1)降低系统时钟速度

2不使用 APBxAHB 外设时,将对应的外设时钟关闭

STM32 提供了 3 种低功耗模式,以达到不同层次的降低功耗的目的,这三种模式如下:

1)睡眠模式CM3 内核停止工作,外设仍在运行

2)停止模式(所有时钟都停止

(3)待机模式( 1.8 V 内核电源关闭)

   这三种模式所需的功耗是逐级递减,也就是说待机模式功耗是最低的。三种低功耗模式汇总表如图所示: 

           

本章我们仅对STM32的待机模式进行介绍,其他2种模式可以参考《STM32F10x中文参考手册》-4电源控制器(PWR)章节,里面有详细的介绍。

 睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设, CM3 核心的外设全都照常运行。

停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。

待机模式中,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测BOOT条件,从头开始执行程序。

那么我们如何进入待机模式呢?其实很简单,只要按图所示的步骤执行就可以了。

  从待机模式唤醒后,程序将按照复位(启动引脚采样、复位向量已获取等)后的方式重新执行。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。

  在进入待机模式后,除了复位引脚以及被设置为防侵入或校准输出时的 TAMPER (PC13)引脚和被使能的唤醒引脚WK_UP 脚(PA0)),其他的 IO 引脚都将处于高阻态

2.待机模式配置步骤

  接下来我们介绍下如何使用库函数进入和退出待机模式。这个也是在编写程序中必须要了解的。具体步骤如下:(电源管理相关库函数在stm32f10x_pwr.c和stm32f10x_pwr.h文件中

1)使能电源时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

2)设置WK_UP引脚为唤醒源

PWR_WakeUpPinCmd(ENABLE);

3)进入待机模式

PWR_EnterSTANDBYMode();//进入待机模式

PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志          

3.硬件电路

  本实验使用到硬件资源如下:

(1)D1指示灯

(2)串口1

(3)K_UP按键

D1指示灯用来提示系统正常运行,K_UP按键用来唤醒待机模式,串口1用来输出提示信息。

4.编写待机唤醒程序

  本实验所要实现的功能是:系统运行时D1指示灯闪烁,5秒后进入待机模式,D1指示灯熄灭,同时串口printf输出相关提示信息,通过K_UP按键实现唤醒。程序框架如下:

(1)配置进入与退出待机模式

(2)编写主函数

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "usart.h"
#include "input.h"
#include "wakeup.h"int main()
{u8 i;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组LED_Init();USART1_Init(9600);while(1){for (i=9;i>0;i--){printf("time:=%d\r\n",i);led1=!led1;delay_ms(1000);}printf("进入待机模式\r\n");delay_ms(1000);Enter_StandbyMode();}
}

wakeup.c

#include "wakeup.h"void Enter_StandbyMode()
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//1)使能电源时钟PWR_WakeUpPinCmd(ENABLE);//(2)设置WK_UP引脚为唤醒源PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志PWR_EnterSTANDBYMode();//进入待机模式}

 wakeup.h

#ifndef _wakeup_H
#define _wakeup_H#include "system.h"void Enter_StandbyMode(void);#endif

  以上程序烧录到开发板上测试,结果如下。实验是成功的。

  

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

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

相关文章

java配置文件解析yml/xml/properties文件

XML 以mybatis.xml:获取所有Environment中的数据库并连接session为例 import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder; impo…

springboot基本使用十一(自定义全局异常处理器)

例如:我们都知道在java中被除数不能为0,为0就会报by zero错误 RestController public class TestController {GetMapping("/ex")public Integer ex(){int a 10 / 0;return a;}} 打印结果: 如何将这个异常进行处理? 创…

2024年06月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名(每月更新) 2024年06月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

跨越百亿营收的今世缘,全国化进程仍挑战重重?

当前,白酒市场正在经历一场深度调整,随着存量时代到来,白酒品牌地位的更替和竞争格局的重构已经展开。这一背景下,今世缘等地方性酒企也正在凭借对区域市场的深耕,展现出较快的成长速度,并希望能借此占领市…

AI视频下载:ChatGPT数据科学与机器学习课程

ChatGPT是一个基于OpenAI开发的GPT-3.5架构的AI对话代理。作为一种语言模型,ChatGPT能够理解并对各种主题生成类似人类的响应,使其成为聊天机器人开发、客户服务和内容创作的多用途工具。 此外,ChatGPT被设计为高度可扩展和可定制的,允许开发人员对其响应进行微调并将其集成到…

C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明: 1. 栈区(stack):在…

ERV-Net:一种用于脑肿瘤分割的高效3D残差神经网络| 文献速递-深度学习肿瘤自动分割

Title 题目 ERV-Net: An efficient 3D residual neural network for brain tumor segmentation ERV-Net:一种用于脑肿瘤分割的高效3D残差神经网络 01 文献速递介绍 脑肿瘤在全球范围内是致命的,与其他类型的肿瘤相比。胶质瘤是最具侵略性的脑肿瘤类…

【机器学习】深入探索机器学习:利用机器学习探索股票价格预测的新路径

❀机器学习 📒1. 引言📒2. 多种机器学习算法的应用📒3. 机器学习在股票价格预测中的应用现状🎉数据收集与预处理🎉模型构建与训练🌈模型评估与预测🌞模型评估🌙模型预测⭐注意事项 &…

教你本地化部署与使用一款免费的LLM应用工程化平台

随着LLM应用的不断成熟,特别是在B端企业场景中的逐渐落地,其不再停留在原型与验证阶段,将面临着更高的工程化要求,无论是输出的稳定性、性能、以及成本控制等,都需要实现真正的“生产就绪”;但由于大量的应…

剖析【C++】——类和对象(下篇)——超详解——小白篇

目录 1.再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit 关键字 2. Static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 3.3总结: 4. 内部类 1.概念 2.特性 示例代码: 代码分析 3.总结 5.再次理解类和对象 …

【Java面试】七、SpringMvc的执行流程、SpringBoot自动装配原理

文章目录 1、SpringMVC的执行流程1.1 视图阶段1.2 前后端分离阶段 2、SpringBoot自动配置原理3、框架常用的注解3.1 Spring的注解3.2 SpringMvc的注解3.3 SpringBoot的注解 4、面试 1、SpringMVC的执行流程 1.1 视图阶段 旧项目中,未前后端分离时,用到…

《mysql轻松学习·二》

1、创建数据表 contacts:数据表名 auto_increament:自动增长 primary key:主键 engineInnoDB default charsetutf8; 默认字符集utf8,不写就默认utf8 对数据表的操作: alter table 数据表名 add sex varchar(1); //添…

【C语言】字符串左旋(三种方法)

(方法3只给出思路参考) 问题 描述: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 分析 我们先来理解一下,什么叫“左旋”?其实是这…

d2-crud-plus 使用小技巧(六)—— 表单下拉选择 行样式 溢出时显示异常优化

问题 vue2 elementUI d2-crud-plus,数据类型为select时,行样式显示为tag样式,但是如果选择内容过长就会出现下面这种bug,显然用户体验不够友好。 期望 代码 js export const crudOptions (vm) > {return {...columns:…

QT 如何在 QListWidget 的选项中插入自定义组件

有时我们需要 QListWidget 完成更复杂的操作,而不仅限于添加文本或者图标,那么就会使用到 setItemWidget 函数,但是这也会伴生一个问题,插入自定义组件后,QListWidget 对选项点击事件的获取会收到阻塞,因…

QT 使用信号和槽,让QLabel的内容实时与QLineEdit同步,类似vue框架的双向绑定

在窗口里放置一个单行文本编辑器(QLineEdit)和一个标签控件(QLabel),实现的效果就是当编辑器的内容被编辑时,标 签控件同步显 示编辑控件里的内容 1)当 lineEdit 控件被用户编辑时,它…

重生之 SpringBoot3 入门保姆级学习(17、整合SSM)

重生之 SpringBoot3 入门保姆级学习&#xff08;17、整合SSM&#xff09; 4、数据访问4.1 整合 ssm 4、数据访问 4.1 整合 ssm pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" …

coze扣子自定义插件使用方式1

1&#xff0c;模型中的工具描述 2&#xff0c;大模型调用&#xff0c;触发接口&#xff1a;

谨以此文章记录我的蓝桥杯备赛过程

以国优秀结束了蓝桥杯cb组 鄙人来自电信学院&#xff0c;非科班出身&#xff0c;在寒假&#xff0c;大约2024年2月份&#xff0c;跟着黑马程序员将c基础语法学完了&#xff0c;因为过年&#xff0c;事情较多&#xff0c;没在学了。 最初就是抱着拿省三的态度去打这个比赛的&a…

linux指令-高阶指令用法

前言 linux操作系统的环境变量的使用基础需要先了解 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、环境变量是什么&#xff1f; 在Linux系统中&#xff0c;环境变量是动态命名的值&#xff0c;这些值可以由shell&#xff08;如bash&#xff09;…