江科大RTC实时时钟hal库实现

article/2025/6/24 2:30:21

首先,因为的LSE无法启振,所以我使用LSI当作RTCCLK,LSI无法由备用电源供电,故主电源掉电时,RTC走时会暂停。

hal库相关函数

时分秒

typedef struct
{uint8_t Hours;            /*!< Specifies the RTC Time Hour.This parameter must be a number between Min_Data = 0 and Max_Data = 23 */uint8_t Minutes;          /*!< Specifies the RTC Time Minutes.This parameter must be a number between Min_Data = 0 and Max_Data = 59 */uint8_t Seconds;          /*!< Specifies the RTC Time Seconds.This parameter must be a number between Min_Data = 0 and Max_Data = 59 */} RTC_TimeTypeDef;

闹钟结构体 

typedef struct
{RTC_TimeTypeDef AlarmTime;     /*!< Specifies the RTC Alarm Time members */uint32_t Alarm;                /*!< Specifies the alarm ID (only 1 alarm ID for STM32F1).This parameter can be a value of @ref RTC_Alarms_Definitions */
} RTC_AlarmTypeDef;

初始化结构体 

typedef struct
{uint32_t AsynchPrediv;    /*异步预分频器,对RTC时钟源进行分频*/uint32_t OutPut;          /*时钟输出*/} RTC_InitTypeDef;

 日期结构体

typedef struct
{uint8_t WeekDay;  /*!< Specifies the RTC Date WeekDay (not necessary for HAL_RTC_SetDate).This parameter can be a value of @ref RTC_WeekDay_Definitions */uint8_t Month;    /*!< Specifies the RTC Date Month (in BCD format).This parameter can be a value of @ref RTC_Month_Date_Definitions */uint8_t Date;     /*!< Specifies the RTC Date.This parameter must be a number between Min_Data = 1 and Max_Data = 31 */uint8_t Year;     /*!< Specifies the RTC Date Year.This parameter must be a number between Min_Data = 0 and Max_Data = 99 */} RTC_DateTypeDef;

句柄

#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
typedef struct __RTC_HandleTypeDef
#else
typedef struct
#endif /* (USE_HAL_RTC_REGISTER_CALLBACKS) */
{RTC_TypeDef                 *Instance;  /*外设地址*/RTC_InitTypeDef             Init;       /*初始化结构体*/RTC_DateTypeDef             DateToUpdate;       /*初始化上电时间*/HAL_LockTypeDef             Lock;       /*配置锁存*/__IO HAL_RTCStateTypeDef    State;      /*当前状态*/#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)void (* AlarmAEventCallback)(struct __RTC_HandleTypeDef *hrtc);           /*!< RTC Alarm A Event callback         */void (* Tamper1EventCallback)(struct __RTC_HandleTypeDef *hrtc);          /*!< RTC Tamper 1 Event callback        */void (* MspInitCallback)(struct __RTC_HandleTypeDef *hrtc);               /*!< RTC Msp Init callback              */void (* MspDeInitCallback)(struct __RTC_HandleTypeDef *hrtc);             /*!< RTC Msp DeInit callback            */#endif /* (USE_HAL_RTC_REGISTER_CALLBACKS) */} RTC_HandleTypeDef;

 初始化函数

HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc);
HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc);
void              HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc);
void              HAL_RTC_MspDeInit(RTC_HandleTypeDef *hrtc);

设置日期时间

HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format);
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format);
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format);
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format);

闹钟相关函数

HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format);
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format);
HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm);
HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format);
void              HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef *hrtc);
HAL_StatusTypeDef HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout);
void              HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc);

hal库实现江科大 

首先就是对RTC的初始化,得开启BKP和PWR先关时钟,CubeMx帮我们开启了。

开启RTC时钟源,在时钟树那边设置RTC的时钟源,我选择的是LSI.

 BKP的相关函数在RTC和RTC_EX里面,没有专门的hal_BKP文件。

读写BKP函数

void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister)

对于江科大的相关函数,首先标准库里面很多的函数hal库里面都没有,所以得找个替换的方式,有些相关函数对于hal库是不起作用的,我们也得将他们删去。

//江科大RTC初始化函数
void MyRTC_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);//开启BKP,PWR时钟PWR_BackupAccessCmd(ENABLE);//使能通道if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)//判断BKP_DR1内容{RCC_LSICmd(ENABLE);//开启LSI时钟while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);//等待时钟就绪RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//配置LSI到RTC的时钟RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();//等待时钟同步RTC_WaitForLastTask();RTC_SetPrescaler(40000 - 1);//配置预分频值RTC_WaitForLastTask();//等待上个工作完成MyRTC_SetTime();//设置时间BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//写入BKP_DR1}else{RCC_LSICmd(ENABLE);				//即使不是第一次配置,也需要再次开启LSI时钟while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();}
}

这段代码里面,对于LSI和RTC的时钟是不需要我们进行配置的,CubeMX里面已经直接帮我们配置好且开启时钟了,我们只需要先开启BKP和PWR时钟,再对BKP进行读写和设置时间即可。

对于时分秒的计算,RTC的相关函数HAL_RTC_GetTime在函数里面对时间戳进行计算得到对应的时分秒,我们开启秒中断让他的时间戳一秒自增一次就行了。(内部自动进行自增)

秒中断 __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC);也在rtc_ex文件里面

hal库的日期读写则是通过读取RTC内部的寄存器内容来获取日期,日期也是在外面写入之后RTC内部自己进行维护的。

  RTC_DateTypeDef GetData;  //获取日期结构体RTC_TimeTypeDef GetTime;   //获取时间结构体
int main(void)
{HAL_Init();SystemClock_Config();OLED_Init();MX_GPIO_Init();MX_RTC_Init();OLED_ShowString(1, 1, "Date:XXXX-XX-XX");OLED_ShowString(2, 1, "Time:XX:XX:XX");
//    OLED_ShowString(3, 1, "CNT :");
//    OLED_ShowString(4, 1, "DIV :");while (1){HAL_RTC_GetTime(&hrtc,&GetTime,RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc,&GetData,RTC_FORMAT_BIN);OLED_ShowNum(1, 6,(2000+GetData.Year), 4);		//显示MyRTC_Time数组中的时间值,年OLED_ShowNum(1, 11,GetData.Month, 2);		//月OLED_ShowNum(1, 14, GetData.Date, 2);		//日OLED_ShowNum(2, 6, GetTime.Hours, 2);		//时OLED_ShowNum(2, 9, GetTime.Minutes, 2);		//分OLED_ShowNum(2, 12, GetTime.Seconds, 2);		//秒HAL_Delay(1000);//    OLED_ShowNum(3, 6, RTC_GetCounter(), 10);	//显示32位的秒计数器,没有相关函数,但是可以通过读写寄存器,或者对时间进行逻辑推导来实现
//    OLED_ShowNum(4, 6, RTC_GetDivider(), 10);	//显示余数寄存器}
}

日期的存入读取有问题,我们把日期存入BKP里面,第一次上电初始化的时候写入,其他时间上电从BKP里面读取,这样也能实现日期的正常读写。

void MX_RTC_Init(void)
{RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef DateToUpdate = {0};__HAL_RCC_BKP_CLK_ENABLE();       //开启后备区域时钟__HAL_RCC_PWR_CLK_ENABLE();		  //开启电源时钟hrtc.Instance = RTC;hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1) != 0xA5A5){sTime.Hours = 15;sTime.Minutes = 51;sTime.Seconds = 0;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC);HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1, 0xA5A5);//写入DR1的判断数据DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;DateToUpdate.Month = RTC_MONTH_JUNE;DateToUpdate.Date = 02;DateToUpdate.Year = 25;if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR2, (uint16_t)DateToUpdate.Year);HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, (uint16_t)DateToUpdate.Month);HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, (uint16_t)DateToUpdate.Date);HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, (uint16_t)DateToUpdate.WeekDay);}else{DateToUpdate.Year    = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);DateToUpdate.Month   = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);DateToUpdate.Date    = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);DateToUpdate.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC);	 //开启RTC时钟秒中断	}
}

代码参考了小璇的相关代码

这样也能实现江科大的RTC时钟了 


http://www.hkcw.cn/article/OIaGoAWBJy.shtml

相关文章

从“人防”到“智防”,智驱力助力危化品企业智能化转型

化工和危险化学品企业一直是国家安全生产监管的重点领域之一。近年来&#xff0c;随着AI技术的快速发展&#xff0c;越来越多的传统工业场景开始引入人工智能技术&#xff0c;实现从“人防”向“技防”的转变。多地应急管理厅也相继出台相关政策&#xff0c;推动视频智能分析系…

Nacos 2.4.3 登录配置

1&#xff0c; 调整配置 完整配置文件 # # Copyright 1999-2021 Alibaba Group Holding Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy…

Cursor 0.51 全网首歌新功能深度体验:Generate Memories 让 AI 编程助手拥有“记忆“

写在前面 你是否遇到过这样的困扰:每次开启新的 Cursor 对话,都要重新向 AI 解释项目背景、技术栈、架构设计?或者当对话内容过多时,AI 就"忘记"了之前讨论的重要信息? 如果你有过这样的经历,那么 Cursor 0.51 版本新推出的 Generate Memories 功能绝对是你的…

如何在WHM中配置远程数据库访问

在远程数据库访问方面&#xff0c;cPanel和WHM之间存在一些差异&#xff1a; 在WHM中添加的主机将应用于所有cPanel用户帐户及其关联的MySQL用户。 cPanel用户无法永久删除由系统管理员root账户在WHM中添加的主机。 要允许远程主机访问MySQL数据库&#xff0c;请导航到侧边栏…

强大的PDF编辑工具,操作方便 ,长久使用

这是一款能够让每一个用户都能在这里轻松实现最简单的编辑方式&#xff0c;一站式完成PDF文件处理&#xff0c;较于前面几个版本&#xff0c;这个版本整体界面比较清爽&#xff0c;用户可以在这里一站式完成PDF编辑&#xff0c;在这里快速修改&#xff0c;编辑、创建、电子签名…

上海迪士尼游客打架官方通报 拍照冲突致肢体冲突

昨天21:45,浦东公安分局发布微博称,5月31日18时许接到报警,迪士尼乐园内发生打架事件。经初步调查,闫某某(男,22岁)与女友在拍照时,因刘某某(男,36岁)夫妻的女儿进入拍摄画面,双方发生口角后引发肢体冲突,造成闫某某和刘某某互有皮外伤,小女孩未受伤。目前,调查…

蔚来5月交付23231辆 同比增长13.1%

6月1日,蔚来公司公布了5月份的交付数据。当月共交付新车23231台,同比增长13.1%。具体来看,蔚来品牌交付了13270台;乐道品牌交付了6281台;firefly萤火虫品牌交付了3680台。截至目前,蔚来公司累计交付新车总数达到760789台。其中,蔚来品牌累计交付710655台;乐道品牌累计交…

沈白高铁进入开通运营倒计时 联调联试启动

6月1日,国家“十四五”规划重点高速铁路建设项目——沈阳至长白山高速铁路正式启动联调联试,标志着沈白高铁进入开通运营的倒计时。沈白高铁起自沈阳北站,途经辽宁省沈阳市、沈抚新区、抚顺市,以及吉林省通化市、白山市、延边州、长白山管委会,最终引入敦化至白河铁路长白…

台艺人刘乐妍称自己是中国人:反对"台独"是世界潮流,也是台湾唯一出路

六一发文称自己是中国人!台湾艺人刘乐妍:反对"台独"是世界潮流,也是台湾唯一出路!责任编辑:zx0002

Cesium使用primitive添加点线面(贴地)

// 创建一个图元集合const primitives viewer.scene.primitives.add(new Cesium.PrimitiveCollection());1、点上图 // 定义点的位置&#xff08;中国不同城市的经纬度&#xff09;const points [{ lon: 116.4074, lat: 39.9042, name: "北京" },{ lon: 121.4737, …

杨明洋社媒晒国足训练照 备战印尼全力以赴

国脚杨明洋更新了社交媒体,分享了自己随国足备战与印尼比赛的照片。国足目前在上海进行最后两场18强赛的备战工作,并计划于今日启程前往雅加达。杨明洋表示,首次入选国家队感到非常荣幸,能够成为其中一员对他来说意义重大。责任编辑:zx0176

警方通报上海迪士尼打架事件 拍照争执引发冲突

6月1日,浦东公安分局接到报警称,5月31日18时许迪士尼乐园内有人打架。经初步调查,闫某某(男,22岁)与女友在拍照时,因刘某某(男,36岁)夫妻的女儿进入拍摄画面,双方发生口角后引发肢体冲突,造成闫某某和刘某某互有皮外伤,小女孩未受伤。目前,调查处理工作正在进一步…

机器视觉图像处理之图像滤波

1.均值滤波 均值滤波是一种基本的线性图像滤波方法&#xff0c;主要用于图像平滑和噪声去除。 特点 优点&#xff1a; 算法简单&#xff0c;计算速度快 对高斯噪声有较好的去除效果 能有效平滑图像中的小波动 缺点&#xff1a; 会导致边缘模糊 对椒盐噪声(脉冲噪声)效果不…

8、电解电容—数据手册解读

目录 1、寿命 2、Rated Voltage 额定电压(VR) 3、Capacitance 额定容量(CR) 4、Surge Voltage 浪涌电压(VS) 5、Leakage Current 泄漏电流(ILC) 6、Dissipation Factor (Tanδ)损失角正切值 7、Ripple Current 纹波电流(IRC, rms) 8、参数特性 9、寿命计算 9.1 以江海为例&…

Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 标题&#xff1a;YOLOv3: An Incremental Improvement 作者&#xff1a;Joseph Redmon, Ali Farhadi 机构&#xff1a;华盛顿大学&#xff08;University of Washington&#xff09; 发表时间&#xff1a;2018年 代…

ck-editor5的研究 (5):优化-页面离开时提醒保存,顺便了解一下 Editor的生命周期 和 6大编辑器类型

前言 经过前面的 4 篇内容&#xff0c;我们已经慢慢对 CKEditor5 熟悉起来了。这篇文章&#xff0c;我们就来做一个优化&#xff0c;顺便再补几个知识点&#xff1a; 当用户离开时页面时&#xff0c;提醒他保存数据了解一下 CKEditor5 的 六大编辑器类型了解一下 editor 实例对…

unity开发棋牌游戏

使用unity开发的棋牌游戏&#xff0c;目前包含麻将、斗地主、比鸡、牛牛四种玩法游戏。 相关技术 客户端&#xff1a;unity 热更新&#xff1a;xlua 服务器&#xff1a;c Web服务器&#xff1a;ruoyi 游戏视频 unity开发棋牌游戏 游戏截图

2025GDCPC广东省赛游记(附赛时代码)

我觉得算是给swan的自证之旅画上一个句号吧...说实话HDU给我带来的不止是排位上的压力&#xff0c;更多的是对自己能力的怀疑&#xff0c;特别是pluto不明说但是我很清楚的看不起&#xff08;没有责备本人的意思&#xff09;&#xff0c;evil和jxj之类的总感觉看到我就是看小丑…

元器件基础学习笔记——双极结型晶体管 (BJT)

一、概述 1.1 基本结构 双极结型晶体管&#xff08;Bipolar Junction Transistor&#xff09;由发射极&#xff08;Emitter&#xff09;、基极&#xff08;Base&#xff09;和集电极&#xff08;Collector&#xff09;三个掺杂程度不同的半导体区域组成&#xff0c;分别对应有…

2024最新DEM数据

数据简介 今天我们分享的数据是在2024年最新更新的全球DEM数据&#xff0c;并将其裁剪成中国区域以及各个省份与各个城市的数据&#xff0c;方便大家研究使用。 该数据来源于GEBCO&#xff0c;GEBCO是一个由测绘专家组成的国际小组&#xff0c;在国际水文组织&#xff08;IHO&a…