STM32 拓展 低功耗案例3:待机模式 (register)

需求描述

寄存器操作进入待机模式。待机模式的唤醒方式比较有限。我们这次使用WKUP引脚的上升沿唤醒。PA0就是WKUP引脚。

当然PA0仍然需要工作在下拉输入模式,只有这样当按键按下的时候才会有一个上升沿。

由于我们电路中PA0已经连接了LED1,所以要产生上升沿需要先用杜邦线连接GND(拉低),然后再连接3.3V电源即可(拉高)。

另外也可以使用NRST引脚实现唤醒。

思路

首先用杜邦线连接GND和PA0,然后设置PA0 位下拉输入模式,继续设置stm32进入待机模式,最后用杜邦线连接3V3和PA0,产生上升沿,进行唤醒。

相关寄存器

PA0需要开启唤醒功能

PDDS位配置

SLEEPDEEP位配置

main.c

#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"

void enter_standby_mode(void);

int main(void)
{
	// 初始化
	USART_Init();
	LED_Init();
	KEY_Init();

	printf("尚硅谷低功率实验:待机模式...\n");

	// 1. 开启LED灯,延时2s,模拟正常程序执行过程
	LED_On(LED_2);
	Delay_s(2);

	while (1)
	{
		// 2. 进入待机模式
		printf("正常代码执行完毕,3s后进入待机模式...\n");
		Delay_s(3);
		printf("进入待机模式,请接线唤醒...\n");
		Delay_ms(1);	// 引入延时,确保发送信息成功
		enter_standby_mode();

		// 4. 以下代码不会执行
		printf("从待机模式中唤醒...\n");
		Delay_s(2);
	}
}

// 定义进入睡眠模式的函数
void enter_standby_mode(void)
{
	// 1. 设置深睡眠模式
	SCB->SCR |= SCB_SCR_SLEEPDEEP;

	// 2. 开启PWR模块时钟
	RCC->APB1ENR |= RCC_APB1ENR_PWREN;

	// 3. 配置PDDS = 1,表示待机模式
	PWR->CR |= PWR_CR_PDDS;

	// 4. 使能 PA0 的唤醒功能
	PWR->CSR |= PWR_CSR_EWUP;

	// 5. 使用WFI指令,进入待机模式
	__WFI();
}

问题1:运行完之后会发现,不断的唤醒。

查看寄存器发现,唤醒标志位没有清0操作。重点时WUF唤醒标志位。

添加代码:

    // 开启PWR模块时钟
	RCC->APB1ENR |= RCC_APB1ENR_PWREN;

	// 判断是否有标志位,如果有就直接清除
	if (PWR->CSR & PWR_CSR_SBF)
	{
		printf("从待机模式唤醒!\n");
		PWR->CR |= PWR_CR_CSBF;
	}
	if (PWR->CSR & PWR_CSR_WUF)
	{
		printf("发生了唤醒事件!\n");
		PWR->CR |= PWR_CR_CWUF;
	}

main.c(完整版)

#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"

void enter_standby_mode(void);

int main(void)
{
	// 初始化
	USART_Init();
	LED_Init();
	KEY_Init();


	// 开启PWR模块时钟
	RCC->APB1ENR |= RCC_APB1ENR_PWREN;

	// 判断是否有标志位,如果有就直接清除
	if (PWR->CSR & PWR_CSR_SBF)
	{
		printf("从待机模式唤醒!\n");
		PWR->CR |= PWR_CR_CSBF;
	}
	if (PWR->CSR & PWR_CSR_WUF)
	{
		printf("发生了唤醒事件!\n");
		PWR->CR |= PWR_CR_CWUF;
	}
	

	printf("尚硅谷低功率实验:待机模式...\n");

	// 1. 开启LED灯,延时2s,模拟正常程序执行过程
	LED_On(LED_2);
	Delay_s(2);

	while (1)
	{
		// 2. 进入待机模式
		printf("正常代码执行完毕,3s后进入待机模式...\n");
		Delay_s(3);
		printf("进入待机模式,请接线唤醒...\n");
		Delay_ms(1);	// 引入延时,确保发送信息成功
		enter_standby_mode();

		// 4. 以下代码不会执行
		printf("从待机模式中唤醒...\n");
		Delay_s(2);
	}
}

// 定义进入待机模式的函数
void enter_standby_mode(void)
{
	// 1. 设置深睡眠模式
	SCB->SCR |= SCB_SCR_SLEEPDEEP;

	// 3. 配置PDDS = 1,表示待机模式
	PWR->CR |= PWR_CR_PDDS;

	// 4. 使能 PA0 的唤醒功能
	PWR->CSR |= PWR_CSR_EWUP;

	// 5. 使用WFI指令,进入待机模式
	__WFI();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows中硬件加速gpu计划开启cpu的使用率居高不下

1.加速gpu计划开启在任务管理器的gpu选项中看不到cuda选项,这给我们进行深度学习训练和推理带来很大影响。 2.开启硬件加速CPU的占用率明显增高,特别用GPU进行实时视频流解码时就不会分配给GPU解码,造成cpu占用居高不下。不利于深度学习训练…

【Go】运行自己的第一个Go程序

运行自己的第一个Go程序 一、Go语言的安装Go环境安装查看是否安装成功配置GOPROXY(代理) 二、Goland安装三、Goland破解四、新建项目 开一篇专栏记录学习Go的过程,一门新语言从hello world开始,这篇文章详细讲解Go语言环境搭建及hello world实现 一、Go语…

提升汽车金融租赁系统的效率与风险管理策略探讨

内容概要 在汽车金融租赁系统这个复杂的生态中,提升整体效率是每个企业都渴望达成的目标。首先,优化业务流程是实现高效运行的基础。通过分析目前的流程,找出冗余环节并进行简化,能够帮助企业缩短审批时间,提高客户满…

计算机网络 (25)IPV6

前言 IPv6,全称为“互联网协议第6版”(Internet Protocol Version 6),是由互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议。 一、产生背景 IPv4,即互联网协议第4版,是现行…

嵌入式系统(将软件嵌入到硬件里面)

目录 Linux起源 查看操作系统的版本 查看内核的版本: 内核系统架构 系统关机或重启命令 关机: 重启: linux下的软件安装 两种软件包管理机制: deb软件包分为两种: 软件包的管理工具:dpkg apt 1…

Conda 安装 Jupyter Notebook

文章目录 1. 安装 Conda下载与安装步骤: 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能(可选)6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具,尤其适合数据科学、机器…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象,有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据: 获取session获取数据: 请求存储: 请求获取: 数据正常打印&#xff1a…

如何在电脑上使用 FaceTime

如今,视频通话已成为与朋友、家人和同事保持联系的重要组成部分。 FaceTime 是 Apple 推出的一款功能丰富的视频通话应用程序。它以其简单性和视频质量而闻名。但如果您想在 PC 上使用 FaceTime该怎么办?虽然 FaceTime 仅适用于 Apple 设备,但…

(框架漏洞)

1.Thinkphp 1.Thinkphp5x远程命令执⾏及getshell 搭建靶场环境 vulhub/thinkphp/5-rce docker-compose up -d #启动环境 ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]whoami ?s/Index/\think\app/invokefunctio…

探秘Kafka源码:关键内容解析

文章目录 一、以kafka-3.0.0为例1.1安装 gradle 二、生产者源码2.1源码主流程图2.2 初始化2.3生产者sender线程初始化2.4 程序入口2.5生产者 main 线程初始化2.6 跳转到 KafkaProducer构造方法 一、以kafka-3.0.0为例 打开 IDEA,点击 File->Open…->源码包解…

动态库dll与静态库lib编程4:MFC规则DLL讲解

文章目录 前言一、说明二、具体实现2.1新建项目2.2 模块切换的演示 总结 前言 动态库dll与静态库lib编程4:MFC规则DLL讲解。 一、说明 1.前面介绍的均为Win32DLL,即不使用MFC的DLL。 2.MFC规则DLL的特点:DLL内部可以使用MFC类库、可以被其他…

对比学习损失函数 - InfoNCE

InfoNCE Loss :构建高效对比学习模型 引言 对比学习中的InfoNCE损失函数是自监督学习领域的重要进展,它通过最大化正样本对之间的相似度并最小化负样本对的相似度,有效地引导模型学习到数据的本质特征。InfoNCE不仅提高了表示学习的质量&am…

家用万兆网络实践:紧凑型家用服务器静音化改造(二)

大家好,这篇文章我们继续分享家里网络设备的万兆升级和静音改造经验,希望对有类似需求的朋友有所帮助。 写在前面 在上一篇《家用网络升级实践:低成本实现局部万兆(一)》中,我们留下了一些待解决的问题。…

【STC库函数】Compare比较器的使用

如果我们需要比较两个点的电压,当A点高于B点的时候我们做一个操作,当B点高于A点的时候做另一个操作。 我们除了加一个运放或者比较器,还可以直接使用STC内部的一个比较器。 正极输入端可以是P37、P50、P51,或者从ADC的十六个通道…

东京大学联合Adobe提出基于指令的图像编辑模型InstructMove,可通过观察视频中的动作来实现基于指令的图像编辑。

东京大学联合Adobe提出的InstructMove是一种基于指令的图像编辑模型,使用多模态 LLM 生成的指令对视频中的帧对进行训练。该模型擅长非刚性编辑,例如调整主体姿势、表情和改变视点,同时保持内容一致性。此外,该方法通过集成蒙版、…

海思Linux(一)-Hi3516CV610的开发-ubuntu22_04环境创建

目 录 前 言 一、芯片介绍 二、环境搭建 2.1 前提准备 2.2 虚拟机创建 2.3 ubuntu环境安装 2.4 基础ubuntu环境搭建 2.5 使用MobaXterm登陆ubuntu 前 言 芯片选型:HI3516CV610 选择的开发板是:酷电科技馆的Hi3516CV610-MINI开发板 上一篇文章&#xf…

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。 1.设计思路:2.设计细节3.详细代码实现 1.设计思路: 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…

Spring boot 项目 Spring 注入 代理 并支持 代理对象使用 @Autowired 去调用其他服务

文章目录 类定义与依赖注入方法解析createCglibProxy注意事项setApplicationContext 方法createCglibProxy 方法 类定义与依赖注入 Service: 标识这是一个 Spring 管理的服务类。ApplicationContextAware: 实现该接口允许你在类中获取 ApplicationContext 对象,从而…

应用程序越权漏洞安全测试总结体会

应用程序越权漏洞安全测试总结体会 一、 越权漏洞简介 越权漏洞顾名思议超越了自身的权限去访问一些资源,在OWASP TOP10 2021中归类为A01:Broken Access Control,其本质原因为对访问用户的权限未进行校验或者校验不严谨。在一个特定的系统或…

JAVA:Spring Boot 集成 Quartz 实现分布式任务的技术指南

1、简述 Quartz 是一个强大的任务调度框架,允许开发者在应用程序中定义和执行定时任务。在 Spring Boot 中集成 Quartz,可以轻松实现任务的调度、管理、暂停和恢复等功能。在分布式系统中,Quartz 也支持集群化的任务调度,确保任务…