当前位置: 首页 > 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排序简介

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

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

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

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...