RTC 实时时钟实验

news/2024/12/3 6:59:09/
利用 ALIENTEK 2.8 TFTLCD 模块来显示日期和时间,实现一个简单的时钟。
STM32F1 RTC 时钟简介
STM32 的实时时钟( RTC )是一个独立的定时器。 STM32 RTC 模块拥有一组连续计数
的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当
前的时间和日期。
RTC 模块和时钟配置系统 (RCC_BDCR 寄存器 ) 是在后备区域,即在系统复位或从待机模式
唤醒后 RTC 的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和 RTC
以防止对后备区域 (BKP) 的意外写操作。所以在要设置时间之前, 先要取消备份区域( BKP
写保护。
RTC 由两个主要部分组成,第一部分 (APB1 接口 ) 用来和 APB1 总线相连。此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总线时钟驱动,用来与 APB1 总线连接。
另一部分 (RTC 核心 )由一组可编程计数器组成,分成两个主要模块。
第一个模块是 RTC 的预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。
第二个模块是一个 32 位的可编程计数器,可被 初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记录 4294967296 秒,约合 136 年左右,这已经是足够了的。
RTC 还有一个闹钟寄存器 RTC_ALR,用于产生闹钟。系统时间按 TR_CLK 周期累加并与存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
RTC 正常工作的一般配置步骤:
1. 使能电源时钟和备份区域时钟。
要访问 RTC 和备份区域就必须先使能电源时钟和备份区域时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
2. 取消备份区写保护。
要向备份区域写入数据,就要先取消备份区域写保护(写保护在每次硬复位之后被使能),否则是无法向备份区域写入数据的。我们需要用到向备份区域写入一个字节,来标记时钟已经配置过了,这样避免每次复位之后重新配置时钟。
PWR_BackupAccessCmd(ENABLE); // 使能 RTC 和后备寄存器访问
3. 复位备份区域,开启外部低速振荡器。
在取消备份区域写保护之后,我们可以先对这个区域复位,以清除前面的设置,当然这个
操作不要每次都执行,因为备份区域的复位将导致之前存在的数据丢失,所以要不要复位,要
看情况而定。然后我们使能外部低速振荡器,注意这里一般要先判断 RCC_BDCR LSERDY
位来确定低速振荡器已经就绪了才开始下面的操作。
BKP_DeInit();// 复位备份区域
RCC_LSEConfig(RCC_LSE_ON);// 开启外部低速振荡器
4. 选择 RTC 时钟,并使能。
这里我们将通过 RCC_BDCR RTCSEL 来选择选择外部 LSI 作为 RTC 的时钟。然后通过
RTCEN 位使能 RTC 时钟。
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);      //选择 LSE 作为 RTC 时钟
RCC_RTCCLKCmd(ENABLE); // 使能 RTC 时钟
5. 设置 RTC 的分频,以及配置 RTC 时钟。
在开启了 RTC 时钟之后,我们要做的就是设置 RTC 时钟的分频数,通过 RTC_PRLH
RTC_PRLL 来设置,然后等待 RTC 寄存器操作完成,并同步之后,设置秒钟中断。然后设置
RTC 的允许配置位( RTC_CRH CNF 位),设置时间(其实就是设置 RTC_CNTH 和 RTC_CNTL两个寄存器)
RTC_EnterConfigMode();/// 允许配置
RTC_ExitConfigMode();// 退出配置模式,更新配置
void RTC_SetPrescaler(uint32_t PrescalerValue);   // 设置 RTC 时钟分频数
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); // 设置秒中断允许
RTC_ITConfig(RTC_IT_SEC, ENABLE);  //使能 RTC 秒中断
(这个函数的第一个参数是设置秒中断类型,这些通过宏定义定义的。)
void RTC_SetCounter(uint32_t CounterValue)  //  最后在配置完成之后
// 设置时间实际上就是设置 RTC 的计数值,时间与计数值之间是需要换算的
6. 更新配置,设置 RTC 中断分组
RTC_ExitConfigMode();// 退出配置模式,更新配置
在退出配置模式更新配置之后我们在备份区域 BKP_DR1 中写入 0X5050 代表我们已经初始化
过时钟了,下次开机(或复位)的时候,先读取 BKP_DR1 的值,然后判断是否是 0X5050
决定是不是要配置。接着我们配置 RTC 的秒钟中断,并进行分组。
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) // 往备份区域写用户数据的函数 (这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的)
同时,有写便有读,读取备份区域指定寄存器的用户数据的函数
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR)
设置中断分组的方法之前已经详细讲解过,调用 NVIC_Init 函数即可,
7. 编写中断服务函数。
在秒钟中断产生的时候,读取当前的时间值,并显示到
TFTLCD 模块上。

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

相关文章

基于Springboot开发的时光兼职网

一、功能介绍 时光兼职网包含管理员、用户、商家三个角色以及前后台系统。 前台系统功能 首页、兼职信息推荐、查看更多等 职位申请、申请日期、上传简历、点击下载简历、留言反馈等 个人中心、上传图片、更新信息等 后台系统功能 用户登录: 个人中心、修改密码…

Linux 各个目录作用

刚毕业的时候学习Linux基础知识,发现了一份特别好的文档快乐的 Linux 命令行,翻译者是happypeter,作者当年也在慕课录制了react等前端相关的视频,通俗易懂,十分推荐 关于Linux的目录,多数博客已有详细介绍…

信奥赛CSP-J复赛集训(dfs专题-刷题题单及题解)(2):洛谷P1162:填涂颜色

信奥赛CSP-J复赛集训(dfs专题-刷题题单及题解)(2):洛谷P1162:填涂颜色 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成…

最新保姆级Linux下安装与使用conda:从下载配置到使用全流程

目录 1.前言 2.什么是conda 3.miniconda和anaconda的对比与选择 4.安装前需要确认的东西(非常重要) (1)安装的目录 (2)安装目录剩余的空间大小 (3)bashrc配置文件位置&#xff0…

CSS底层基础:小白速来

1. CSS简介 CSS (Cascading Style Sheets) 是一种用来描述HTML或XML文档样式的语言。它使得开发者能够控制网页的布局和外观,包括字体、颜色、间距等。CSS通过选择器来指定要应用样式的元素,并定义这些元素的具体样式属性。 基本结构示例: …

《大道平渊》· 卅 —— 凡做事皆應抓其關鍵

《大道平淵》 凡做事皆應抓其關鍵, 切中肯綮, 統籌兼顧, 其輕重緩急心中應自有丘壑。思維混亂且摸不清頭緒的人, 往往只關注事情無關緊要的部分, 卻對其核心熟視無睹。他們把大量時間和耐心全部浪費在了既無關緊要又細枝末節的小事上, 而對那些重要的事情卻抽不出時間來處理。 …

无线网络技术的发展与技术

无线网络技术在过去几十年中取得了巨大的进步,从最初的2G到如今的5G,无线通信已经深刻改变了我们的生活和工作方式。 本文将详细介绍无线网络技术的演进历程和相关的技术细节,包括无线传输原理、频谱利用、多址技术、调制与解调技术等&#…

Go学习笔记之数据类型转换

Go数据类型转换 整型与浮点型转换 package mainimport ("fmt""strconv" )func main() {// 类型转换建议是从低位的类型转换到高位的类型,比如从int转换到float64,从float32转换到float64d : 10f : 3.14fmt.Println(float64(d) f)}其他类转换成字符串 //…