rtc时钟

article/2025/8/6 23:44:49

一、设计效果

  1. 配置RTC时钟,初始化为2000年1月1日00:00:00;
  2. 通过RTC时钟秒中断串口每秒打印一次当前时刻,并切换一次流水灯状态;
  3. 配置闹铃为10:00:05,在闹铃中断中每秒切换一次蜂鸣器状态闹铃,直到按KEY1关闭闹钟;
  4. 配置开发板上四个按键中断,按下实现:
    1. KEY0 —— 将时间设置为 2022年11月06日 10:00:00
    2. KEY1 —— 将关闭闹钟
    3. KEY2 —— 打开蜂鸣器
    4. KEYUP —— 关闭蜂鸣器
  1. 每次操作时,使用串口打印提示信息

二、硬件工作原理和原理图

RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。一般配备有电池。

三、实验记录

1.完成CubeMx初始化配置

1.1 利用CubeMX完成HAL库工程模板和初始化:

通过选择芯片型号创建CubeMX工程

在弹出的对话框中输入开发板上的芯片型号,STM32F103RB

在右侧筛选栏中选择Tx型,即开发板上芯片所用的LQFP64型封装,双击建立工程

1.2 RCC模块引脚的配置

在弹出的工程配置对话框中的第一个引脚配置选项卡下,先完成RCC时钟模块引脚配置:

选择启用外部的高速和低速时钟源,HSE和LSE,配置为晶振连接;

配置完成后,对应时钟引脚变绿,同时旁边出现其将要配置模式的文字说明;

1.3 配置时钟

我们前面启用了RCC时钟模块的外部时钟引脚,这里我们需要将外部时钟源配置为实际使用的频率;

1.4 RTC配置

1.在侧边栏的计时器中选择RTC

2.勾选Activate Clock Source 激活时钟源
Activate calendar 激活日历

3.配置时间日期

1.5 串口配置

  1. 在侧边栏的通信外设中选择USART1
  2. 在串口下拉框出选择异步(Asynchronous),成功后可以看到对应的串口引脚RX(接收引脚),TX(发送引脚)变绿。
  3. 选择下方的Parameter Settings选项卡确认串口参数。设置波特率为115200,传输数据长度为8 Bit,无奇偶校验位,1个停止位,数据方向(Data Direction)为接收和发送(Receive and Transmit)

1.6 配置按键外部中断

参看EX3_1配置四个按键的外部中断,注意不同按键的上/下拉和边沿检测;

1.7 配置NVIC,使能中断并设置优先级

1.8 创建生成工程

2.使用的RTC的HAL库函数带读

2.1 RTC初始化

1) 配置RTC的秒时钟

2) 配置初始化时间日期

2.2 HAL_RTC_MspInit()解析

2.3 RTC相关接口函数

1)日期设置函数:

/*函数功能:设置RTC当前日期
/入口参数:hrtc:指向RTC_HandleTypeDef结构的指针sDate:指向日期结构体指针Format:输入格式(RTC_FORMAT_BIN:二进制格式,RTC_FORMAT_BCD:BCD数据格式)
/返回值:HAL_OK表示设置成功,HAL_ERROR表示设置失败*/
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)//RTC日期结构体定义
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;    

 2)时间设置函数:

/*函数功能:设置RTC当前时间
/入口参数:hrtc:指向RTC_HandleTypeDef结构的指针sTime:指向时间结构体指针Format:输入格式(RTC_FORMAT_BIN:二进制格式,RTC_FORMAT_BCD:BCD数据格式)
/返回值:HAL_OK表示设置成功,HAL_ERROR表示设置失败*/
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)//RTC时间结构体定义
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;    

 3)闹钟设置函数:

/*函数功能:设置指定的RTC报警与中断
/入口参数:hrtc:指向RTC_HandleTypeDef结构的指针sAlarm:指向报警结构体指针Format:输入格式(RTC_FORMAT_BIN:二进制格式,RTC_FORMAT_BCD:BCD数据格式)
/返回值:HAL_OK表示设置成功,HAL_ERROR表示设置失败
/注:再使用这个函数设计前必须调用HAL_RTC_SetTime()*/
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)//RTC闹钟结构体定义
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;

4)报警函数:

/*该函数处理告警中断请求,当RTC到我们所设置的时间时,会进入该中断,随后进入报警回调函数*/
void HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef *hrtc)/*报警回调函数,其是一个弱定义的占位空函数,使用需要我们自己重写一个同名的函数,来完成中断的响应内容*/
__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)

 5)RTC中断

/*处理RTC全局中断*/
void RTC_IRQHandler(void)
{/* USER CODE BEGIN RTC_IRQn 0 *//* USER CODE END RTC_IRQn 0 */HAL_RTCEx_RTCIRQHandler(&hrtc);//秒中断/* USER CODE BEGIN RTC_IRQn 1 *//* USER CODE END RTC_IRQn 1 */
}/*秒中断回调函数,每秒进入一次*/
__weak void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)

 

3.程序编写

3.1 修改 rtc.h 和 rtc.c 实现基础功能

1)根据设计效果要求,rtc模块须实现三个功能函数,依此修改rtc.h 文件:

2)在rtc.c 中实现三个功能函数

① void RTC_TimeAndDate_Show(void) 串口打印时间和日期

/*** @brief  串口打印时间和日期* @param  无* @retval 无*/
void RTC_TimeAndDate_Show(void)
{RTC_TimeTypeDef RTC_TimeStructure;RTC_DateTypeDef RTC_DateStructure;// 获取日历HAL_RTC_GetTime(&hrtc, &RTC_TimeStructure, RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc, &RTC_DateStructure, RTC_FORMAT_BIN);                    // 打印日期printf("日期: 20%0.2d年%0.2d月%0.2d日 - 星期%d\r\n", RTC_DateStructure.Year,RTC_DateStructure.Month, RTC_DateStructure.Date,RTC_DateStructure.WeekDay);// 打印时间printf("时间: %0.2d:%0.2d:%0.2d \r\n\r\n", RTC_TimeStructure.Hours, RTC_TimeStructure.Minutes, RTC_TimeStructure.Seconds);	
}

 ②void RTC_StartAlarm(void) 启动 10:00:05 闹钟

/*** @brief   要使能 RTC 闹钟中断,需按照以下顺序操作:1. 配置 NVIC 中的 RTC_Alarm IRQ 通道并将其使能。2. 配置 RTC 以生成 RTC 闹钟(闹钟 A 或闹钟 B)。* @param  无* @retval 无*/
void RTC_StartAlarm(void)
{RTC_AlarmTypeDef  RTC_AlarmStructure;/* RTC 闹钟中断配置 */HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 9, 0);/* 使能RTC闹钟中断 */HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);/* 设置闹钟源 */RTC_AlarmStructure.Alarm = RTC_ALARM_A;/* 设置闹钟时间 */RTC_AlarmStructure.AlarmTime.Hours   = 0x10;RTC_AlarmStructure.AlarmTime.Minutes = 0x00;RTC_AlarmStructure.AlarmTime.Seconds = 0x5;/* 启动闹钟中断10:00:05 */  HAL_RTC_SetAlarm_IT(&hrtc,&RTC_AlarmStructure, RTC_FORMAT_BCD); printf("启动闹钟! 10:00:05闹铃!\r\n\r\n");
}

③void RTC_SetTime(void) 设置当前日期时间

/*** @brief  设置当前日期时间* @param  无* @retval 无*/
void RTC_SetTime(void)
{RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef DateToUpdate = {0};sTime.Hours = 0x10;sTime.Minutes = 0x0;sTime.Seconds = 0x0;HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD);DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;DateToUpdate.Month = RTC_MONTH_NOVEMBER;DateToUpdate.Date = 0x7;DateToUpdate.Year = 0x22;HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD);
}

 3.2 在 usart.c 中,重定义printf

前面有文章教学。

3.3 移植BEEP的BSP驱动到到新工程

1)拷贝BSP驱动到工程目录

2)添加源文件到工程

3)在main.c 中添加BSP驱动头文件

这里添加时使用了绝对路径,故可不必在编译器中添加头文件的 include path

3.4 在main.c中实现设计效果

1)定义一个全局变量,作为闹钟状态标志

2)用户层代码初始化

3)RTC秒中断实现时间打印和闹铃效果

3)编写报警回调函数

4)套用之前的按键外部中断程序,实现设计效果

4. 编译烧录

结果显示:

 


http://chatgpt.dhexx.cn/article/KI7hGmyw.shtml

相关文章

RTC时钟实现实时日历

文章目录 1、RTC时钟简介1.2、初识RTC1.2、相关寄存器 2、创建项目23、完善代码4、总结 1、RTC时钟简介 1.2、初识RTC 1、简介&#xff1a; RTC—real time clock&#xff0c;实时时钟&#xff0c;主要包含日历、闹钟和自动唤醒这三部分的功能&#xff0c;其中的日历功能我们使…

STM32之RTC时钟

前言 了解实时时钟RTC的原理。STM32芯片自带RTC&#xff0c;因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求&#xff1a; 1&#xff09;读取RTC初始时间&#xff0c;验证是否为 1970年1月1日零分零秒&#xff1b; 2&#xff09;将RTC时间调整为…

【STM32】HAL库 STM32CubeMX教程十三---RTC时钟

前言&#xff1a; 本系列教程将 对应外设原理&#xff0c;HAL库与STM32CubeMX结合在一起讲解&#xff0c;使您可以更快速的学会各个模块的使用 所用工具&#xff1a; 1、芯片&#xff1a; STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE&#xff1a; MDK-Keil软…

【STM32】详解RTC实时时钟的概念和配置示例代码

一、什么是RTC RTC(Real-time Clock)&#xff1a;实时时钟&#xff0c;本质上是一个支持BCD编码的定时器/计数器。主电源断电后能够由电池供电&#xff0c;使其时钟跳转依然正常。 二、STM32F4芯片内的RTC功能 ①日历时钟&#xff08;时分秒、年月日、星期&#xff09; ②两个闹…

android小错误:Failure retrieving text 0x7f050001 in package

1.在启动android应用程序的过程中&#xff0c;logcat打印如下的错误&#xff1a; 报错的原因&#xff1a;资源的id没有找到。资源在R.java文件中&#xff0c;找到0x7f050001 对应的定义 R.java public static final int AppTheme0x7f050001; AppTheme这个文件在AndroidMan…

Windows7系统蓝屏-解决办法, 错误代码:0x0000007F

1.电脑突然蓝屏提示stop:0x0000007F&#xff0c;如下图所示&#xff1a; 2.故障排除 重启电脑&#xff0c;一直按F8&#xff0c;进入“安全模式”&#xff0c;如能正常进入系统&#xff0c;查看系统错误日志。针对系统记录的错误日志&#xff0c;解决问题。如下图&#xff0c;…

java.lang.IllegalArgumentException No view found for id 0x7

java.lang.IllegalArgumentException No view found for id 0x7 布局上找不到这个View&#xff0c;看下ERROR的地方&#xff0c;可以看到是因为Container找不到因此报错了。 从布局入手&#xff0c;参考了很多文章主要分为以下两种原因 1 Fragment 嵌套了 Fragment 例如&…

Fragment报java.lang.IllegalArgumentException:No view found for id 0x7f070250的错误

我用的是Fragment嵌套Fragment做的&#xff0c;放fragment切换快的时候程序就会崩溃&#xff0c;解决这个办法就是在View生成前先将FragemnentManger创建好&#xff0c;就不会报错了

Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f解析

先看日志报错这个错误纠结我两天了&#xff0c;真的要崩溃了~_~ 关于android.content.res.Resources$NotFoundException: Resource ID的问题&#xff0c;那行代码是onCreate加载.xml布局&#xff0c;是加载的R.layout.xxxx&#xff0c;不是R.id.xxxx&#xff0c;布局文件存在&a…

关于No view found for id 0x7f080135 (com.xxx.xxx:id/viewpager) for fragment PopupWindow

最近在开发项目中&#xff0c;遇到了一个问题。PopupWindow中无法嵌套viewpagerFragment&#xff0c;现在进行总结一下。 问题描述&#xff1a;在Fragment中弹出一个PopupWindow,PopupWindow中用viewpager加载多个Fragment时出现上面问题。 网上搜的都是那些什么没有设置id之…

流水灯设计

流水灯设计 目的与要求 通过采用单片机控制8个LED发光二极管顺序点亮的流水灯系统设计与制作&#xff0c;让读者了解C语言的数据类型、常量与变量、运算符和表达式等基本概念及使用方法。 设计要求&#xff1a;首先点亮连接到P1.7引脚的发光二极管&#xff0c;延时一定时间后…

IT管理人才必备的十大能力

公众号回复&#xff1a;干货&#xff0c;领取价值58元/套IT管理体系文档 公众号回复&#xff1a;ITIL教材&#xff0c;领取最新ITIL4中文教材 正文 作为IT技术人员&#xff0c;相信没有一个人愿意永远在底层编写程序或做简单的系统维护。经过一段时间的技术和经验的积累&#x…

他,连续 3 年担任新星计划导师,这次的内容有点特别

一、新星计划 新星计划是一个发掘潜力新人、培养优质博主为目标的创作活动&#xff0c;通过为期两周的时间&#xff0c;明白为什么要写博客&#xff0c;写作的意义是什么&#xff1f;制定学习计划&#xff0c;完善Java知识体系。 二、学习计划 创作打卡阶段第1周&#xff08…

Python 彻底甩掉 Java,位居 48 种编程语言之首!

Python 彻底甩掉 Java&#xff0c;位居 48 种编程语言之首&#xff01; 昨日&#xff0c;IEEE Spectrum 杂志发布了一年一度的编程语言排行榜&#xff0c;这个排行榜已经连续发布了五年。对于每位开发者而言&#xff0c;想要衡量编程语言流行度则需要依赖相对流行的网站统计数据…

java并发问题概述

转自 https://www.jb51.net/article/131411.htm java并发问题概述 转载 更新时间&#xff1a;2017年12月25日 09:28:54 作者&#xff1a;人圭先生 我要评论 这篇文章主要介绍了java并发问题概述&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。 1什么是…

【Java基础系列教程】第一章 编程入门

一、计算机概述 1.1 计算机简介 计算机&#xff08;computer&#xff09;俗称电脑&#xff0c;是现代一种用于高速计算的电子计算机器&#xff0c;可以进行数值计算&#xff0c;又可以进行逻辑计算&#xff0c;还具有存储记忆功能。是能够按照程序运行&#xff0c;自动、高速处…

关于程序员这14条经典定律,我全中~

定律1:最难定位的问题要么是最疑难的问题,要么是最低级的问题,这两种问题都有一个共同特征,就是让你意想不到。 举一个例子,一次代码编译不过,报函数没有定义,开始怀疑是类没有“;”结束符,然后怀疑有没有匹配的“{”,折腾了好久,最后才发现是开头的“#ifndef”定义…

系统性能优化的十大策略(强烈推荐,建议收藏)

点击关注公众号&#xff0c;实用技术文章及时了解 上篇 提升系统性能&#xff0c;榨干计算机资源是程序员的极致追求&#xff0c;今天跟大家聊聊性能优化。分为上中下三篇&#xff0c;由浅及深的写了关于性能优化的方方面面&#xff0c;并不仅仅局限于代码层面&#xff0c;希望…

JAVA工程师的十大借口,你知道哪些?

他们是近几十年来出现的新物种。他们的着装可能经常会遭到别人的吐槽&#xff0c;他们的玩笑可能别人也经常get不到笑点&#xff0c;他们心照不宣的执着让外人觉得莫名其妙。但同时&#xff0c;他们也拥有无与伦比的耐力&#xff0c;超越时代的智商&#xff0c;和横穿社会的自虐…

二八定律全面分析

二八定律 也叫 巴莱多定律 &#xff0c;是19世纪末20世纪初 意大利 经济学家巴莱多发明的。他认为&#xff0c;在任何一组东西中&#xff0c;最重要的只占其中一小部分&#xff0c;约20%&#xff0c;其余80%的尽管是多数&#xff0c;却是次要的&#xff0c;因此又称二八法则。 …