STM32低功耗与备用备份区域

news/2024/9/23 10:35:40/

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); 
}

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

祝你看完就会。


http://www.ppmy.cn/news/1509091.html

相关文章

oracle 保留两位小数

在Oracle数据库中,保留两位小数可以通过多种函数实现,主要包括ROUND、TRUNC和TO_CHAR函数。每种函数都有其特定的使用场景和效果。 1. ROUND函数 ROUND函数用于对数值进行四舍五入操作,保留指定的小数位数。其基本语法为: ROUN…

大数据面试SQL(七):累加刚好超过各省GDP40%的地市名称

文章目录 累加刚好超过各省GDP40%的地市名称 一、题目 二、分析 三、SQL实战 四、样例数据参考 累加刚好超过各省GDP40%的地市名称 一、题目 现有各省地级市的gdp数据,求从高到低累加刚好超过各省GDP40%的地市名称,临界地市也需要。 例如: 浙江省…

《全面解析 Nginx:从下载安装到高级应用与问题解决》

Nginx 一、Nginx 简介 什么是 Nginx 以及其功能 Nginx 是一款高性能的 HTTP 和反向代理的 Web 服务器,在处理高并发方面表现卓越,具备强大的能力来承受高负载,有相关报告指出其能够支持高达 50,000 个并发连接数。其显著特点为占用内存少、…

视频监控系统视图汇聚共享网关视频集中存储平台设备共享管理使用介绍

视图汇聚共享网关为v1.0.0版本 ,产品主要有 8大功能模块 ,包括:概况、实时、录像、 图库、 配置、接入、共享、系统维护。 一、管理端共享 . 支持查看网关是否共享至了管理端; . 支持查看管理端的地址; . 支持编…

【2.3】回溯算法-重新排序得到 2 的幂

一、题目 给定正整数N&#xff0c;我们按任何顺序&#xff08;包括原始顺序&#xff09;将 数字重新排序 &#xff0c;注意其前导数字不能为零。 如果我们可以通过上述方式得到2的幂&#xff0c;返回 true&#xff1b;否则&#xff0c;返回false。 提示&#xff1a; 1 < …

【前端】NodeJS:MongoDB

文章目录 1 简介1.1 MongoDB是什么1.2 数据库是什么1.3 数据库的作用1.4 数据库管理数据的特点1.5 为什么选择MongoDB 2 核心概念3 下载安装与启动4 命令行交互4.1 数据库命令4.2 集合命令4.3 文档命令4.4 应用场景4.4.1 新增4.4.2 删除4.4.3 更新4.4.4 查询 5 Mongoose5.1 介绍…

CentOS7.6 RabbitMQ消息队列集群部署——实施方案

1、前期环境准备&#xff08;每个主机都配置&#xff09; 1.准备三台主机 IP地址主机名内存大小192.168.200.10 rabbitmq1 2G192.168.200.11rabbitmq22G192.168.200.55rabbitmq32G 2. 设置主机名 hostnamectl set-hostname 主机名suexit Ctrlr 3. 设置IP地址然后重启网卡 …

20240810从串口查看荣品RK3588S-AHD开发板出厂预置的Android的版本

20240810从串口查看荣品RK3588S-AHD开发板出厂预置的Android的版本 2024/8/10 16:46 1、通过串口&#xff1a; console:/ # console:/ # getprop ro.build.version.release 13 console:/ # 【请严重注意&#xff0c;adb的那条USB2.0的公公线&#xff0c;一定要插到蓝色的USB3…