RTC 实时时钟实验

利用 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 模块上。

相关推荐
AI码上来2 天前
当小智 AI 遇上数字人,我用 WebRTC 打造实时音视频应用
人工智能·webrtc·实时音视频
hazy1k2 天前
STM32H750 RTC介绍及应用
网络·stm32·实时音视频
NYFEA4 天前
RTC实时时钟RX8025SA国产替代FRTC8025S
实时音视频
TSINGSEE6 天前
数据库选择有讲究?SQLite、PostgreSQL还是MySQL?
mysql·音视频·实时音视频·数据库架构·视频编解码
Natsume17109 天前
音视频开发入门:FFmpeg vs GStreamer,新手该如何选择?
c语言·c++·ffmpeg·音视频·webrtc·实时音视频·视频编解码
DogDaoDao9 天前
深入解析quiche开源项目:从QUIC协议到云原生实践
音视频·实时音视频·tcp·quic·视频直播·流媒体协议·quiche
leo__52011 天前
STM32的RTC模块及其应用场景
stm32·嵌入式硬件·实时音视频
智能物联实验室12 天前
如何解决网关断网后时间不再统计的问题?无RTC子设备如何打通主网关的时间同步功能?
嵌入式硬件·网关·实时音视频·智能硬件
DogDaoDao13 天前
视频软解码技术详解:原理、应用与未来发展
ffmpeg·音视频·实时音视频·视频编解码·hevc·视频解码·视频软解码
ZEGO即构开发者17 天前
简单4步,快速搭建数字人实时视频通话功能
实时互动·webrtc·实时音视频·数字人·即时通讯·rtc·视频聊天·虚拟人·社交·音视频技术·ai虚拟人·ai语音驱动·android多人语音·java多人语音通话·zego·泛娱乐·社交泛娱乐·视频美颜·虚拟形象sdk·自动聊天机器人