当前位置: 首页 > news >正文

STM32低功耗与备用备份区域

STM的备份备用区域其实就是两个区块:BKP和RTC。低功耗则其实是STM32四种模式中的三种耗能很低的模式。

目录

一:备用区域

1.BKP

2.RTC

二:低功耗模式

1.睡眠模式:

2.停机模式:

3.待机模式:


一:备用区域

1.BKP

BKP就是一个备份寄存器,大小不是一定的。但基本单位都是16位。所谓的的备份,其实在这里的意义就是当主要供电丧失后不会丢失数据。在板子上的体现就是:复位后数据不丢失。

当然了,你要是直接给你板子电源拔了它该丢失还是丢失的。

这个区域没什么好讲的,就是简单的读写。要记住的东西就是:
1.备用供电时Vbat
2.复位后不能直接访问,需要打开时钟:
通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟

3.其内部有校准RTC的寄存器。

代码部分:

#include "bkp.h"RTC_HandleTypeDef rtc_handle = {0};
void RTC_INIT(){__HAL_RCC_BKP_CLK_ENABLE();		//使能后背域时钟__HAL_RCC_PWR_CLK_ENABLE();		//使能电源时钟	HAL_PWR_EnableBkUpAccess();		//使能后背域访问/*rtc_handle.Instance = RTC;	rtc_handle.Init.AsynchPrediv = 32767;	//时钟源的HZ为323768,为了将RTC配置为1HZ,所以溢出值设定为32767HAL_RTC_Init(&rtc_handle);*/
}uint16_t RTC_read_data(uint8_t bkpx){uint32_t data_read;data_read = HAL_RTCEx_BKUPRead(&rtc_handle,bkpx);return data_read;
}void RTC_write_data(uint8_t bkpx,uint32_t data_write){HAL_RTCEx_BKUPWrite(&rtc_handle,bkpx,data_write);
}

没什么难点就是一些API直接的调用。

2.RTC

RTC本质上是一个独立的定时器。所谓独立,其实就是复位后它数据可以保存,但是注意,这里它的属于来源其实是BKP。前面讲过BKP中有RTC的校准器,所以如果你希望在复位后RTC的数值保持不丧失你最好先初始化BKP。

RTC框图

图中红框内就是这个模块的重点。
初始化的过程也和重点对应:
 RTCCLK选择振荡器HAL_RCC_OscConfig HAL_RCCEx_PeriphCLKConfig
                                        |
 RTC分频器选择分频数rtc_handle.Init.AsynchPrediv = 32767;
                                        |
        CNT的赋值HAL_RTC_SetTime HAL_RTC_SetDate
代码:

 

#include "rtc.h"
#include "uart1.h"
RTC_HandleTypeDef rtc_handle = {0};
void RTC_INIT(void){__HAL_RCC_BKP_CLK_ENABLE();		//使能后背域时钟__HAL_RCC_PWR_CLK_ENABLE();		//使能电源时钟	HAL_PWR_EnableBkUpAccess();		//使能后背域访问rtc_handle.Instance = RTC;	rtc_handle.Init.AsynchPrediv = 32767;	//时钟源的HZ为323768,为了将RTC配置为1HZ,所以溢出值设定为32767HAL_RTC_Init(&rtc_handle);
}
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc){//配置振荡器时钟RCC_OscInitTypeDef  rcc_osc = {0};rcc_osc.PLL.PLLState = RCC_PLL_NONE;rcc_osc.LSEState = RCC_LSE_ON;rcc_osc.OscillatorType = RCC_OSCILLATORTYPE_LSE;//选择振荡器时钟RCC_PeriphCLKInitTypeDef  perh_init = {0};perh_init.PeriphClockSelection = RCC_PERIPHCLK_RTC;		//外设确认perh_init.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;		//时钟确认HAL_RCC_OscConfig(&rcc_osc);HAL_RCCEx_PeriphCLKConfig(&perh_init);
}
void Read_RTC_time(void){RTC_TimeTypeDef time_handle = {0};RTC_DateTypeDef date_handle = {0};HAL_RTC_GetTime(&rtc_handle,&time_handle,RTC_FORMAT_BIN);	//最后一位是时间格式	HAL_RTC_GetDate(&rtc_handle,&date_handle,RTC_FORMAT_BIN);printf("Get time : %d-%02d-%02d-%02d-%02d-%02d \r\n",date_handle.Year + 2000,date_handle.Month,date_handle.Date,time_handle.Hours,time_handle.Minutes,time_handle.Seconds);	
}void Set_RTC_time(struct tm time_struct){RTC_TimeTypeDef time_handle = {0};RTC_DateTypeDef date_handle = {0};date_handle.Year = time_struct.tm_year - 2000;date_handle.Month = time_struct.tm_mon;date_handle.Date = time_struct.tm_mday;time_handle.Hours = time_struct.tm_hour;time_handle.Minutes = time_struct.tm_min;time_handle.Seconds = time_struct.tm_sec;HAL_RTC_SetTime(&rtc_handle,&time_handle,RTC_FORMAT_BIN);HAL_RTC_SetDate(&rtc_handle,&date_handle,RTC_FORMAT_BIN);while(!__HAL_RTC_ALARM_GET_FLAG(&rtc_handle,RTC_FLAG_RTOFF));	//确定写入完成后在继续}

其实看着华丽呼哨的都是在赋值。RTC内部的时钟生成的是一个时间戳。你知道的,时间赋值就是很麻烦。简而言之这里是吧时间分为DATE和TIME两部分赋值。调用了是个time.h的库搞了一个结构体吧数值赋值进去。就这么简单。

RTC还有闹钟功能,总体的流程也是非常经典:
在上面的基础上 配置NVIC 设定闹钟(使能中断允许位)配置中断回调函数

    HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 2, 2);HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}
void RTC_Alarm_IRQHandler(void)
{HAL_RTC_AlarmIRQHandler(&rtc_handle);
}
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{printf("ring ring ring...\r\n");
}
void rtc_set_alarm(struct tm alarm_data)
{RTC_AlarmTypeDef alarm = {0};alarm.Alarm = RTC_ALARM_A;alarm.AlarmTime.Hours = alarm_data.tm_hour;alarm.AlarmTime.Minutes = alarm_data.tm_min;alarm.AlarmTime.Seconds = alarm_data.tm_sec;HAL_RTC_SetAlarm_IT(&rtc_handle, &alarm, RTC_FORMAT_BIN);
}

多余的配置代码我就不给了因为都一样。

二:低功耗模式

STM32一共有四种模式:运行模式;睡眠模式;停机模式;待机模式;这四个模式这里按照省电效率依次排列,待机模式最省电。我们平常上电时默认则是运行模式/。

就不分开讲了吧,因为非常的相似,这里给一个手册里的图吧:

这里只说一点,为了方面切换模式且一个方法能唤醒任何一种模式;我们在睡眠模式选择WFI的进入方式,然后配置一个WKUP的引脚位上升沿的中断触发。 

1.睡眠模式:

本质上睡眠模式就是把CPU关了外设没关。所有的GPIO口和其他外设都保持工作。
这里的WFI和WIE其实是 wait for interrupt 和wait for evnt;那就理解了唤醒方式为什么不同了。

唯一要注意一点:在进入模式前最好关闭Systick。

2.停机模式:

跟睡眠模式的区别就是外设不工作了,同时CPU也不工作了,唯一保持的就是CPU部分的供电

这里一样也要在进入模式前关闭Systick;并选择WFI进入。

3.待机模式:

这个模式就比较特别了:
如果把前两个模式都比作放假的话,那么这个模式就是“停业整顿”;当进入待机模式时,所有外设包括CPU全部停止工作。唯一不留下的就是我们前边配置的WKUP引脚用于唤醒。

另外要注意:它的唤醒标志最好在进入前清零。并且,在进入待机模式后再出来时,系统的主频率会从72M变为8M,所以必须重新初始化时钟树

代码:
 

#include "lwr.h"void LWR_INIT(){//初始化WUK针脚GPIO_InitTypeDef gpio_init;gpio_init.Mode = GPIO_MODE_IT_RISING;gpio_init.Pin = GPIO_PIN_0;gpio_init.Pull = GPIO_PULLUP;gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;__HAL_RCC_GPIOA_CLK_ENABLE();HAL_GPIO_Init(GPIOA, &gpio_init);HAL_NVIC_EnableIRQ(EXTI0_IRQn);HAL_NVIC_SetPriority(EXTI0_IRQn,2,2);}void EXTI0_IRQHandler(){HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}void Sleep_mode(){//停止滴答定时器HAL_SuspendTick();HAL_PWR_EnterSLEEPMode(1,PWR_SLEEPENTRY_WFI);
}void Stop_mode(){HAL_SuspendTick();HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
}void StandBy_mode(){//使能电源控制时钟(关闭电压调节器)__HAL_RCC_PWR_CLK_ENABLE();//使能一个唤醒引脚HAL_PWR_EnableWakeUpPin(GPIO_PIN_0);//复位唤醒标志位__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnterSTANDBYMode();//当从待机模式返回时主时钟会从72M变为8M所以要重新初始化stm32_clock_init(RCC_PLL_MUL9); 
}

注意:虽然这里的中断只是为了唤醒系统而不做任何操作,但也必须完整写下来。

祝你看完就会。

相关文章:

STM32低功耗与备用备份区域

STM的备份备用区域其实就是两个区块:BKP和RTC。低功耗则其实是STM32四种模式中的三种耗能很低的模式。 目录 一:备用区域 1.BKP 2.RTC 二:低功耗模式 1.睡眠模式: 2.停机模式: 3.待机模式: 一&…...

武汉某汽配公司携手三品软件 共绘PLM项目新蓝图

近日,三品软件与武汉某汽配公司达成战略合作,双方将共同启动PLM项目,以助力该公司在汽车制造业的研发管理领域实现全面升级。 客户简介 该公司自2008年成立以来,一直专注于为汽车制造业提供自动化输送系统、车辆装配的合装技术和…...

uniapp多图上传uni.chooseImage上传照片uni.uploadFile,默认上传9张图

uniapp多图上传uni.chooseImage上传照片uni.uploadFile 代码示例: /**上传照片 多图*/getImage() {uni.chooseImage({count: 9, //默认9sizeType: [original, compressed], //可以指定是原图还是压缩图,默认二者都有sourceType: [album], //从相册选择/…...

MySQL——内置函数

时间函数 select * from msg where date_add(sendtime, interval 2 minute) > now(); 理解: ------------------------------|-----------|-------------|------------------ 初始时间 now() 初始时间2min 字符串 length函数返回字符串长度,以字节为…...

2024年最新版小程序云开发数据模型的开通步骤,支持可视化数据库管理,支持Mysql和NoSql数据库,可以在vue3前端web里调用操作

小程序官方又改版了,搞得石头哥不得不紧急的再新出一版,教大家开通最新版的数据模型。官方既然主推数据模型,那我们就先看看看新版的数据模型到底是什么。 一,什么是数据模型 数据模型是什么 数据模型是一个用于组织和管理数据的…...

智慧水库大坝安全监测预警系统解决方案

前言 水库大坝作为重要的水利设施,承载着防洪涝、灌溉、发电等功能,关系着无数人的生命财产安全,一旦发生意外事故,后果将不堪设想,因此需要建立一套水库大坝安全监测预警系统解决方案。 系统概述 水库大坝安全监测…...

基于SpringBoot+VUE的社区团购系统(源码+文档+部署)

主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等 业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写…...

LeetCode 3151. 特殊数组 I【数组】简单【Py3,C++,Java,GO,Rust】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

超级字符串技能:提升你的编码游戏

嘿嘿,uu们,今天咱们来详解字符函数与字符串函数,好啦,废话不多讲,开干! 1.:字符分类函数 C语言中又一系列的函数是专门做字符分类的,也就是一个字符属于什么类型的字符的,这些函数的使用需要包含头文件ctype.h 这些函数的使用方法都十分类似,博主在这里就举两到三个…...

米联客-FPGA程序设计Verilog语法入门篇连载-16 Verilog语法_时钟分频设计

软件版本:无 操作系统:WIN10 64bit 硬件平台:适用所有系列FPGA 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述 本小节讲解Verilog语法的时钟…...

【Echarts】custom自定义图表实现甘特图

效果图 主要注意点: 1、右上角图例visualMap实现 2、visualMap增加formatter 3、series使用custom自定义图表,encode解析四维数组。核心是renderItem方法,必填项,且需要注意要全部定义在options里面!!&…...

【高等代数笔记】003线性方程组的解法(一)

1. 线性方程组的解法 1.1 解线性方程组的矩阵消元法 【例1】解线性方程组 { x 1 3 x 2 x 3 2 3 x 1 4 x 2 2 x 3 9 − x 1 − 5 x 2 4 x 3 10 2 x 1 7 x 2 x 3 1 \left\{\begin{array}{ll} x_{1}3x_{2}x_{3}2 \\ 3x_{1}4x_{2}2x_{3}9 \\ -x_{1}-5x_{2}4x_{3}10 \\…...

Scrapy入门教程

Scrapy入门教程:打造高效爬虫的第一步 1. 引言 在当今的网络世界中,信息是无价的资源。而爬虫工具则是获取这些资源的有力武器。Scrapy 是 Python 生态系统中最强大的爬虫框架之一,它不仅功能强大,而且易于扩展,适用…...

Microsoft VBA Excel VBA学习笔记——双重筛选+复制数值1.0

问题场景 CountryProductCLASS 1CLASS 2CLASS 3CLASS 4CLASS 5CLASS 6…USApple0.3641416030.8918210610.0591451990.7320110290.0509636560.222464259…USBanana0.2300833330.4027262180.1548836670.2988904860.7802326210.028592635…CNApple0.7762370470.5075548320.481978…...

谷歌反垄断官司败诉后,或又面临被拆分风险?

KlipC报道:上周8月5日,美国法院裁定谷歌的搜索业务违反了美国反垄断法,非法垄断在线搜索和搜索文本广告市场。据悉,胜诉的美国司法部正在考虑拆分谷歌。其他选项包括强制谷歌与竞争对手分享更多数据,以及防止其在人工智…...

数据结构入门——06树

1.树 树(Tree)非线性数据结构,它是n(n≥0)个节点的有限集合,它满足两个条件 : 有且仅有一个特定的称为根(Root)的节点; 其余的节点可以分为m(m…...

FFmpeg源码:av_packet_move_ref、av_packet_make_refcounted函数分析

一、av_packet_move_ref函数 (一)av_packet_move_ref函数的声明 av_packet_move_ref函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavcodec/packet.h中: /*** Move every field in src to ds…...

12 中断

12 中断 1、内核中断编程2、顶半部和底半部机制2.1 任务的相关概念2.1.1 分类2.1.2 优先级2.1.3 进程调度2.1.4 休眠sleep 2.2 顶半部和底半部实现机制2.2.1 顶半部特点2.2.2 底半部特点2.2.3 底半部实现方法之:tasklet2.2.4 底半部实现机制之工作队列2.2.5 底半部实现机制之软…...

经典算法题总结:十大排序算法,外部排序和Google排序简介

十大排序算法 就地性:顾名思义,原地排序通过在原数组上直接操作实现排序,无须借助额外的辅助数组,从而节省内存。通常情况下,原地排序的数据搬运操作较少,运行速度也更快。 稳定性:稳定排序在完…...

服务器是什么?怎么选择适合自己的服务器?

在这个数字化的世界中,我们每天都在与各种网站打交道,浏览新闻、购物、看视频等。你是否曾经好奇过,这些网站是如何运行的?它们又是如何实现随时随地可访问的呢? 在这背后,有一个神秘的角色在默默地支撑着…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层&#xf…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...