STM32G070KBT6的RTC HAL库使用

*配置问题

    首先使能时钟源,这里在时钟配置中选择LSI,为什么后面会说,然后使能Calender结构体,保证可以对RTC的年月日时分秒等进行写入和读取;alarmA和alarmB是闹钟,这里不用就Disable;      Tamper用于检测外部篡改事件(通常用于增强系统的安全性,尤其是在需要保护敏感数据或防止恶意操作的应用中。),使能后会有一个专用引脚,Timestamp是时间戳,使能后会出现一个引脚,当该引脚检测到篡改事件时,可以触发中断或其他响应机制(例如自动清除 RTC 的备份寄存器,以防止敏感数据被读取或篡改。)同时RTC 备份域中的特定寄存器可以记录篡改事件的发生,以便后续分析和处理。

    TimeStamp功能允许在特定事件发生时,记录当前的日期和时间。这对于需要精确记录事件发生时间的应用非常有用。使能后同样会有一个专用引脚,可以记录按钮按下、外部中断、篡改检测等事件的时间,在数据记录系统(RTC 备份域)中,可以为每条记录添加时间戳,以便后续分析。

    Calibration使能后也有一个专用引脚,用于对外输出特定频率的脉冲,外部可以通过该引脚输出的脉冲判断RTC的精度;

    根据我们选择的功能,我们需要配置上述参数,首先Asynchronous Predivider value和Synchronous Predivider value用于将RTC的时钟分频,我们一般进行秒级计数,所以将其分频到1HZ,计算方法为:时钟源频率/(Asynchronous Predivider value+1)/(Synchronous Predivider value),这里为32.768KHZ/128/256 = 1HZ;  

    Day Light Saving和Store Operation分别代表夏令时和重置存储操作,夏令时是一种为了节约能源而对时钟进行调整的制度。在夏令时期间,时钟会提前一小时,以便在白天更长的时间内利用自然光。夏令时的设置可以帮助设备自动调整时间以适应这种变化。我们一般不开启夏令时以保证RTC的时间是标准时间;重置存储操作:

  • RTC_STOREOPERATION_RESET:在低功耗模式下不存储当前时间设置,退出低功耗模式时时间会被重置。
  • RTC_STOREOPERATION_SET:在低功耗模式下保存当前时间设置,退出低功耗模式时恢复到之前的时间。

    我们一般选择RTC_STOREOPERATION_SET,这样就算进入和退出低功耗模式,RTC时间仍然会保持计数;

    Wake UP用于设置RTC唤醒中断,其中的Wake UP Clock是唤醒中断周期,设置为1HZ唤醒中断周期就是1秒,Wake Up Counter就是经过n+1次唤醒中断周期后触发中断,这里n为0,表示经过1次唤醒中断周期,也就是1秒后触发中断;

    Data Format分为BCD格式和BIN格式,BIN格式十进制数12表示0x0C,和我们正常的二进制-十进制转换相同,BCD格式是一种将每个十进制数的每一位用四位二进制表示的方法,十进制数12表示为0x12;一般我们用BIN格式更符合常识;

HAL_RTC_GetTime()和HAL_RTC_SetTime()用于获取和设置RTC的时分秒;

HAL_RTC_GetDate()和HAL_RTC_SetDate()用于获取和设置RTC的年月日星期;

注意上面的函数执行时要有顺序!读取时间时先执行HAL_RTC_GetTime()再执行HAL_RTC_GetDate(),不然就会导致读取时间无效的情况;同样设置时间先HAL_RTC_SetDate()再HAL_RTC_SetTime();代码例子如下:

RTC_Time.c:#include "RTC_Time.h"/*** @brief	时间设置* @param   *		@arg 	分别输入 年 月 日 星期 时 分 秒* @retval 无*/
void RTC_SetTime(uint16_t yea,uint8_t mon,uint8_t da, uint8_t hou,uint8_t min,uint8_t sec)
{RTC_TimeTypeDef RTC_Time;RTC_DateTypeDef RTC_Date;system_config.calendar.year = yea;system_config.calendar.century = yea/100;system_config.calendar.month = mon;system_config.calendar.date = da;system_config.calendar.hour = hou;system_config.calendar.min = min;system_config.calendar.sec = sec;system_config.calendar.week = GregorianDay(system_config.calendar);Flash_WriteStruct(FLASH_USER_START_ADDR, &system_config);            //将系统配置保存到FLASH用户数据区RTC_Date.Year = (uint8_t)(system_config.calendar.year%100);    //RTC中year格式为uint8_t,我们这里用其保存年份后两位RTC_Date.Month = system_config.calendar.month;RTC_Date.Date = system_config.calendar.date;RTC_Date.WeekDay = system_config.calendar.week;RTC_Time.Hours = system_config.calendar.hour;RTC_Time.Minutes = system_config.calendar.min;RTC_Time.Seconds = system_config.calendar.sec;RTC_Time.DayLightSaving = DayLightSaving_status;RTC_Time.StoreOperation = StoreOperation_status;HAL_RTC_SetDate(&hrtc, &RTC_Date, RTC_FORMAT_BIN);      //将配置写入到RTCHAL_RTC_SetTime(&hrtc, &RTC_Time, RTC_FORMAT_BIN);
}/*** @brief	获取时间* *		*/
void RTC_GetTime(void)
{RTC_TimeTypeDef RTC_Time;RTC_DateTypeDef RTC_Date;HAL_RTC_GetTime(&hrtc, &RTC_Time, RTC_FORMAT_BIN);   //先运行GetTime再运行GetDateHAL_RTC_GetDate(&hrtc, &RTC_Date, RTC_FORMAT_BIN);system_config.calendar.year = system_config.calendar.century*100 + RTC_Date.Year;  //将Flash中的世纪和RTC中的年份相加获得完整年份system_config.calendar.month = RTC_Date.Month;system_config.calendar.date = RTC_Date.Date;system_config.calendar.week = RTC_Date.WeekDay;system_config.calendar.hour = RTC_Time.Hours;system_config.calendar.min = RTC_Time.Minutes;system_config.calendar.sec = RTC_Time.Seconds;//Flash_WriteStruct(FLASH_USER_START_ADDR, &system_config);            //将系统配置保存到FLASH用户数据区
}void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{/* Prevent unused argument(s) compilation warning *///HAL_IWDG_Refresh(&hiwdg);   //喂狗,5s内必须喂一次RTC_GetTime();   	//更新时间   Write_Num_Time();							  //显示时间/* NOTE : This function should not be modified, when the callback is needed,the HAL_RTCEx_WakeUpTimerEventCallback could be implemented in the user file*/
}/*计算公历天数得出星期*/
static int GregorianDay(_calendar_obj tm)
{int leapsToDate;int lastYear;int day;int MonthOffset[] = { 0,31,59,90,120,151,181,212,243,273,304,334 };lastYear=tm.year-1;/*计算从公元元年到计数的前一年之中一共经历了多少个闰年*/leapsToDate = lastYear/4 - lastYear/100 + lastYear/400;      /*如若计数的这一年为闰年,且计数的月份在2月之后,则日数加1,否则不加1*/if((tm.year%4==0) &&((tm.year%100!=0) || (tm.year%400==0)) &&(tm.month>2)) {/** We are past Feb. 29 in a leap year*/day=1;} else {day=0;}day += lastYear*365 + leapsToDate + MonthOffset[tm.month-1] + tm.date; /*计算从公元元年元旦到计数日期一共有多少天*/tm.week=day%7; //算出星期if(tm.week == 0) tm.week = 7;return tm.week;
}RTC_Time.h:#ifndef __RTC_TIME_H__
#define __RTC_TIME_H__#include "main.h"
#include "User_Flash.h"
#include "rtc.h"
#include "74HC595.h"#define DayLightSaving_status     RTC_DAYLIGHTSAVING_NONE   //配置RTC夏令时状态
#define StoreOperation_status     RTC_STOREOPERATION_SET    //配置RTC 是否在低功耗模式保持运行void RTC_SetTime(uint16_t yea,uint8_t mon,uint8_t da, uint8_t hou,uint8_t min,uint8_t sec);
void RTC_GetTime(void);
static int GregorianDay(_calendar_obj tm); 
#endif

*电源引脚问题:

    从上图我们可以看出LQFP32封装的G070KBT6是没有VBAT引脚的,只有VDD引脚,因此当主电源VDD断电后采用电池给VDD供电,因此RTC也只能由VDD保持供电,可以用一路ADC采样主电源电压,当检测到主电源电压接近0V时表示此时已切换到电池供电,然后进行相应操作。电路如下:

    巧思:要做低功耗,可以进入低功耗就把检测电源电压的ADC转化为外部中断,当再次上电时触发外部中断退出低功耗模式,这样就不用电池供电的时候还要用ADC检测电源是否重新上电,节省功耗。(未验证)

*时钟源问题 :

    只有一个外部高速时钟,可以选择LSI或者HSE/32(一般RTC外部时钟源可以选择LSE或者HSE,通常使用LSE,不过为了节省晶振的情况下也可以用HSE分频替代,这样也比LSI更稳定。),由于主电源断电之后采用外部高速时钟HSE为有源晶振,会停止起振,因此这里使用LSI内部低速32.768KHZ晶振给RTC提供时钟源。由前面关于RTC的手册描述我们可以知道当LSI计时时,VBAT模式下RTC是不工作的,因为vbat只能给LSE供电而不能给LSI供电。vdd断了以后LSI也相当于断电了,rtc自然就不走了。但是由于G070KBT6没有VBAT引脚,因此也就没有VBAT模式,就算用刚刚的电池供电也是给VDD供电,因此这里不用担心电池供电时RTC会停止工作。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ShardingSphere之ShardingProxy集群部署

文章目录 介绍使用Zookeeper进行集群部署统一ShardingJDBC和ShardingProxy配置通过Zookeeper注册中心同步配置直接使用ShardingProxy提供的JDBC驱动读取配置文件 介绍 开发者手册 在conf/server.yaml配置文件中有下面这一段配置,就是关于集群部署的 mode: # typ…

极狐GitLab CICD Catalog Beta 功能介绍

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…

视觉SLAM中的数学基础01 -3D空间的位置表示

在视觉SLAM中,理解和表示3D空间中的位置是至关重要的。这涉及到多种数学概念和工具,如坐标系、向量、矩阵、旋转和平移等。这些数学基础构成了视觉SLAM算法的核心。以下是3D空间位置表示的基本数学概念。 这是一个表示世界坐标系和相机坐标系之间关系的3…

JNPF快速开发平台赋能数字办公方式转变

随着信息技术的飞速发展,数字化转型已成为各行各业提升效率、优化流程的重要手段。JNPF快速开发平台正是在这样的背景下应运而生,它通过简化开发流程,使得非技术人员也能参与到应用的构建中来,从而加速了数字办公方式的转变。 数字…

畅捷通基于Flink的实时数仓落地实践

摘要:本文整理自畅捷通总架构师、阿里云MVP专家郑芸老师在 Flink Forward Asia 2023 中闭门会上的分享。内容主要为以下四部分: 业务背景数仓建设具体案例未来展望 一、业务背景 畅捷通是用友旗下成员企业,一直持续专注于小微企业的数字化转…

4K YouTube to MP3 Pro:跨平台音频提取与转换的好用工具

4K YouTube to MP3 Pro是一款专为追求高品质音频体验的用户设计的跨平台(支持Mac与Windows)音频提取与转换软件。该软件以其卓越的音频提取能力和简便的操作流程,在同类产品中脱颖而出,成为众多用户的心头好。 功能强大&#xff…

AI革新3D建模:Stable Fast 3D工具的高效应用——图片快速生成3D模型

在3D建模领域,AI技术的介入正引发一场革命。Stable Diffusion(SD)的最新应用——Stable Fast 3D,为快速生成3D模型提供了一个强大的解决方案。以下是对这项技术及其应用的详细介绍和优化建议。 一、工具概览 Stable Fast 3D模型:这是一个基于AI的3D模型生成工具,可通过H…

社交电商系统:技术融合与商业创新

一、引言 随着社交平台的普及和电商系统的不断发展,社交电商系统作为一种新型的商业模式应运而生。这种模式结合了传统电子商务和社交媒体的优势,为消费者和商家提供了一个全新的购物和销售环境。本文将深入探讨社交电商系统的技术架构、主要模式、优势以…

每日学术速递8.8

1.Rethinking temporal self-similarity for repetitive action counting 标题:重新思考重复动作计数的时间自相似性 作者: Yanan Luo, Jinhui Yi, Yazan Abu Farha, Moritz Wolter, Juergen Gall 文章链接:https://arxiv.org/abs/2407.09…

LVS(Linux Virtual Server)详解

LVS(Linux Virtual Server)是一个用于负载均衡的开源软件项目,旨在通过集群技术实现高性能、高可用的服务器系统。它运行在Linux操作系统上,并且可以利用内核级的资源来提高性能和稳定性。 思维导图 LVS的工作原理 LVS主要基于Ne…

【树的遍历】

题目 代码 #include<bits/stdc.h> using namespace std;const int N 40;int in[N], pos[N]; //中序、后序 int idx[N]; //中序的值->索引 unordered_map<int, int> l, r; //根节点的左、右树根节点 int n; int build(int il, int ir, int pl, int pr) {int ro…

vite + tsc 打包报TS类型错误问题及解决方法

当新建vue3项目&#xff0c;package.json文件会自动添加一些配置选项&#xff0c; 这些选项基本没有问题&#xff0c;但是在实际操作过程中&#xff0c;列举一个目前我遇到的一个问题&#xff1a;打包后报了一堆TS类型错误&#xff0c;怎么消除这些错误&#xff1f; 报错信息&a…

ubuntu20从docker安装到制作自己的镜像使用记录

ubuntu20从docker安装到制作自己的镜像使用记录 第一章&#xff1a;配置环境 1.ubuntu20 2.docker镜像18.04 3.参考&#xff1a;https://www.runoob.com/docker/docker-tutorial.html 第二章&#xff1a;安装docker 一、安装docker 参考1&#xff1a;Ubuntu安装docker并运…

Go语言编程大全,web微服务数据库十大专题精讲

本课程主要从数据结构、Go Module 依赖管理、IO编程、数据库编程、消息队列、加密技术与网络安全、爬虫与反爬虫、web开发、微服务通用技术、Kitex框架等方面讲解~ 链接&#xff1a;https://pan.quark.cn/s/d65337a0e60d

视频循环存储的实现

目录 1. 三方工具 2. 视频存储的实现 2.1 分段存储 - 比如每15分钟 2.2 对齐到15分钟整边界 2.3 循环存储的实现 video_space_daemon.sh 3.封装 3.1 主执行程序&#xff0c;修订版 3.2 创建服务 3.3 service关联的执行脚本文件 4.额外的工作 附录A: ffmpeg视频存储…

矩阵算法的介绍和实现

一. 介绍 首先我们要清楚矩阵是什么&#xff1a;矩阵是一个按照长方阵列排列的复数或实数集合 1> 定义 定义&#xff1a;mn矩阵为mn个数排成的m行n列的表格&#xff0c;当mn时&#xff0c;矩阵A称为n阶方阵或者n阶矩阵。零矩阵&#xff1a;矩阵所有元素都为0。同型矩阵&a…

一个简单的录音软件(利用QT录音,ffmpeg进行音频重采样,fdk-aac编码)

录音软件是一种非常有用的工具&#xff0c;可以帮助我们记录和存储语音信息。在本文中&#xff0c;我们将介绍一个简单的录音软件&#xff0c;该软件利用QT进行录音&#xff0c;使用ffmpeg进行音频重采样&#xff0c;并使用fdk-aac编码。 一、 环境介绍 1、QT版本: QT5.…

SuccBI+低代码文档中心 — 可视化分析(仪表板)(上)

有关仪表板的设计器&#xff1a; 查询设置 由于仪表板的设计器是所见即所得的&#xff0c;可以将当前制作的内容和数据的查询结果实时展示在界面中&#xff0c;当引入到仪表板的模型数据量较大时&#xff0c;为了提高设计器界面的查询性能&#xff0c;提供了以下两种方法&…

Azure openai connection with javascript

题意&#xff1a;使用JavaScript与Azure OpenAI进行连接 问题背景&#xff1a; I have created my chatbot with javascript and used open ai. I need to change it to azure open ai but can not find the connection details for javascript. This is how i connect with p…

基于C#调用文心一言大模型制作桌面软件(可改装接口)

目录 开发前的准备账号注册应用创建应用接入开始开发创建项目设计界面使用 AK,SK 生成鉴权签名窗体代码百度智能云千帆大模型平台什么是百度智能云千帆大模型平台模型更新记录开发前的准备 账号注册 访问百度智能云平台,通过百度账号登录或手机号验证。 点此跳转百度智能云平…