STM32CUBEMX 待机模式最简单的RTC定时唤醒(低功耗电池产品必备)

news2024/11/22 15:33:58

文章意义:

看到很多技术帖子讲述RTC定时唤醒功能的时候,老是需要去读取当前时间,再设定下一个闹钟唤醒时间,无形中多了很多变量和操作。所以我决定分享一种简单的RTC定时唤醒方法,适合于不需要实现具体时间获取的场合,仅实现RTC定时唤醒的功能。

RTC定时唤醒的意义:

电池类便携式产品一般都要求低功耗,以延长产品工作时间。电池类产品开机方式一般有按键开启(电动牙刷等)、隔空感应式开启(自动冲厕类产品等),定时开启(具备预约功能类产品)等。
单片机低功耗唤醒方式一般有两种,一种是通过按键或者外部传感器的唤醒信号进行外部中断唤醒,传感器可以实现无接触唤醒,但这要求传感器自身具备低功耗属性,即其自身具有打盹方式唤醒检测,或者其检测时仍具备低功耗属性。另一种方式为采用RTC定时唤醒(打盹方式),比如1秒内唤醒系统检测5毫秒,剩下的时间则进入低功耗模式。

接下来记录一下stm32cubemx 采用stm32f030f4单片机实现RTC定时唤醒的方法,个人认为是最简单的实现方法了:

1.打开cubemx软件,选择对应MCU,然后使能SW仿真,默认使用内部晶振:
在这里插入图片描述
在这里插入图片描述

2.选择RTC,使能时钟源、日历、闹钟(3个打钩):
在这里插入图片描述

3.接下来设置定时唤醒的时间,与Asynchronous Predivider value 和Synchronous Predivider value以及所使用的时钟有关,下面是一张采用不同时钟设置1秒唤醒时两个参数的配置值:在这里插入图片描述
其计算方法也十分简单,比如我采用LSI内部40KHz时钟,则计算方法为:

1/(40000/128)*312=0.9984≈1秒,

所以我们只需要更改Synchronous Predivider value的值来更改定时时间就行了,比如我们需要500毫秒唤醒一次,只需要把311改为155便可以了。记住我们设置的参数要比计算参数小1才行,因为他们都是默认从1开始计数的。

这里我采用40KHz内部时钟设置1秒RTC唤醒(红箭头的参数需要注意设置为与图中一致即可):
在这里插入图片描述
在这里插入图片描述
四个使能之后闹钟在同一时刻唤醒,即实现了RTC在我们设置的时间计时到达之后便会唤醒。

4.使能RTC对应的唤醒中断:在这里插入图片描述

5.设置空闲引脚高阻输入,以避免无效功耗(打钩后无配置功能的引脚则会默认为高阻输入状态):
在这里插入图片描述

6.设置工程名,保存工程路径,设置保存类型(我用的是keil工程),生成工程:在这里插入图片描述

这样RTC唤醒功能在RTC初始化后便开始计时唤醒了,接下来我们去工程里面实现进入待机模式和RTC唤醒:

进入待机模式:

void sys_enter_standby_mode(void)
{
    __HAL_RCC_PWR_CLK_ENABLE();                                                // 使能PWR时钟
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);                                         // 清除唤醒标记
	  HAL_PWR_EnterSTANDBYMode();                                                //进入待机模式
}

main函数,PA4接了1个LED灯(教程没配置,需你们自行配置),程序内容为RTC初始化后便开始1秒计时,同时点亮LED灯500毫秒后进入待机模式,进入待机模式后各种变量和配置都会被清除,所以灯也会熄灭;再经过500毫秒后RTC定时唤醒时间到,系统将被唤醒然后从头开始执行,再次点亮灯,所以我们只需要看灯是否有闪烁,便知道系统是否进入了待机模式并成功实现了RTC唤醒:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC_Init();
  //MX_RTC_Init();
  MX_TIM3_Init();
  MX_TIM14_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	MX_RTC_Init();//1s触发1次RTC唤醒中断
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
		HAL_Delay(500);
		sys_enter_standby_mode();
	}
}

下面是我自己做的一个隔空操控的低功耗唤醒小项目,功能为每1秒唤醒5毫秒检测人手,检测到人手之后系统唤醒工作,实现从左到右挥手实现调光亮,从右到左挥手实现切换照明灯的手势识别功能,期间不再自行进入待机模式,直到人手隔空操控系统关机,则重新进入打盹模式等待唤醒工作。

**添加链接描述

有需要的可以留言一下,等下次有空的话我会再写一篇文章分享这个项目,感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业遇到知识管理困境该怎么办?这里有解决方案!寻找Baklib

随着企业业务不断扩大,员工数量的增加,知识管理成为了企业面临的一个重要问题。企业需要管理大量的知识,如产品手册、流程规范、客户信息等,这些知识对企业的生产和经营至关重要。但是,如何高效地管理这些知识&#xf…

LeetCode_双指针_中等_24.两两交换链表中的节点

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1&a…

第40讲:Python for-in循环语句使用索引遍历序列

文章目录 方法一:遍历的是序列的元素方法二:遍历的是序列的索引方法三:while循环遍历实现方法四:调用内置函数enumerate实现1.什么是enumerate函数2.调用内置函数enumerate实现索引遍历序列 如果在遍历序列的过程中,需…

国产高端GPU,国产替代加速(附国产厂家汇总)

前言 2022年8月9日,壁仞科技在上海发布首款通用GPU芯片BR100,标志着中国企业第一次打破了此前一直由国际巨头保持的通用GPU全球算力纪录; 8月31日,美国政府命令芯片厂商英伟达(NVIDIA)以及超威半导体&…

借助 Google Play 游戏电脑版 Com2uS 为用户打造多平台无缝体验

作者 / Google Play 游戏总监 Arjun Dayal 吸引潜在用户在 PC 端畅享游戏 《魔灵召唤:克罗尼柯战记》是韩国游戏开发商 Com2uS 于 2023 年 3 月面向全球发布的一款移动端大型多人在线角色扮演游戏。迄今为止,《魔灵召唤》在全球的下载量超过 1.8 亿&…

Aztec:混合zkRollup,而非zkEVM

1. 引言 Aztec zkRollup为混合zkRollup: 支持通用私有计算的加密zkRollup(命名为Aztec):构建trustless、可扩展的、去中心化的Layer2 zkRollup,同时支持private smart contract execution。同时支持public state和pr…

C++ Primer阅读笔记--参数传递

目录 1--三种基本传递方式 2--数组形参 3--main函数传递参数 4--传递可变形参 1--三种基本传递方式 ① 值传递: 使用值传递时,初始值会拷贝给变量,对变量的改动不会改变初始值的值; ② 指针传递: 使用指针传递时&…

Mysql 查询性能优化

查看数据库用户连接数量 show processlist;分析表结构 索引 show index from conference;查询锁状态 show status like %lock%;是否开启慢查询 show variables like %slow_query_log%;日志查询默认情况下:slow_query_log的Value为OFF 如要开启慢查询日志&#…

2023最新软件测试面试题汇总

常见的面试题汇总 1、你做了几年的测试、自动化测试,说一下 selenium 的原理是什么? 我做了五年的测试,1年的自动化测试; selenium 它是用 http 协议来连接 webdriver ,客户端可以使用 Java 或者 Python 各种编程语言…

AI奇点将至 如何成为人工智能驱动型公司

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 2023年4月16日,中泰证券首席经济学家李迅雷先生发表了《奇点将至:AI或开启新一轮科技革命》的文章。李迅雷先生认为,以智能化为特征的第四次工业革命轮廓日渐清晰,在世界百年未…

Linux网络编程:socket、客户端服务器端使用socket通信

socket socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)…

[230507]托福听力真题TPO66词汇 |无重复|20:50~21:55 + 8:00~8:30

目录 conversation 1 conversation 2 ​ TPO66 Lecture ppt词汇 TPO66 Lecture 笔记词汇 conversation 1 conference / ˈkɑːnfərəns /n 会议terrific / təˈrɪfɪk /adj 极好的presentation / ˌpriːz(ə)nˈteɪʃ…

发送Ajax get请求详解

发送AJAX get请求&#xff0c;前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>ajax get请求</title> </head> <body> <script type"text/java…

第三十一章 Unity骨骼动画

关于骨骼动画的原理&#xff0c;我们这里不再详细介绍&#xff0c;有不清楚的可以回去看DirectX课程和3dsMAX课程。接下来&#xff0c;我们来讲解一下Unity的骨骼动画系统。Unity 的动画系统基于动画剪辑&#xff08;Animation Clip&#xff09;的概念&#xff0c;它的本质就是…

Linux 安装时,各个分区的作用是什么?

在这里&#xff0c;我说说一开始Linux为什么需要分区。 因为 Linux 是一个多用户操作系统。 多用户意味着一个问题&#xff1a;并非所有用户的操作都是可控的。 而系统正常运行的话&#xff0c;必须要一定的剩余空间。 这也就意味着&#xff1a;如果一个用户自己把空间占满…

MySQL数据库之用户管理

一、数据库用户管理 1.1 新建用户 CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码]; 即&#xff1a;create user 用户名源地址 identified by 密码; 用户名&#xff1a; 指定将创建的用户名 来源地址&#xff1a; 指定新创建的用户可在哪些主机上登录&…

线段树练习题(日程安排表、LC-307、LC-2407、LC-699)

线段树详解&#xff1a;https://leetcode.cn/problems/range-module/solution/by-lfool-eo50/ 文章目录 线段树线段树模板[729. 我的日程安排表 I](https://leetcode.cn/problems/my-calendar-i/)[731. 我的日程安排表 II](https://leetcode.cn/problems/my-calendar-ii/)[732.…

数据库基础及用户管理授权

数据库概念 关系型数据库 数据结构二维表格 库 -> 表 -> 列&#xff08;字段&#xff09;&#xff1a;用来描述对象的的一个属性&#xff1b;行&#xff1a;用来描述一个对象的信息 mysql&#xff08;5.7/8.0&#xff09; maridb ocracle postgresql sqlserver(windows…

2D火焰特效

Unity面片实现火焰效果 一、效果说明 大家好&#xff0c;我是阿赵。这是一个火焰的效&#xff0c;不过它不是粒子做的&#xff0c;是用一个面片做的&#xff0c;可以理解成是2D的特效。这个例子很简单&#xff0c;但可以拓展一下思路&#xff0c;原来除了用序列帧和粒子做动画…

将页面元素隐藏的10种方法

在Web开发中&#xff0c;隐藏页面元素使其视觉不可见是一个非常常见的需求。为了实现这一目标&#xff0c;我们通常会采用多种方法&#xff0c;最常用的例如CSS的display属性&#xff0c;只要设置为node即可隐藏元素。 本文将通过对当前所有可用的隐藏元素的方法做一个总结&…