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

相关推荐
shansz202020 小时前
暂时无法解决的关于STM32F103的RTC日期更新问题
stm32·嵌入式硬件·实时音视频
ZEGO即构开发者2 天前
如何用一句话让AI集成 ZEGO 产品
ai·实时互动·实时音视频·rtc
视频技术分享5 天前
2026年实时音视频服务选型深度解析
音视频·实时音视频·视频
摸摸电5 天前
RTC电路电池寿命计算?
实时音视频
深圳市友昊天创科技有限公司9 天前
友昊天创推出8K ,4K 120Hz 100米延长器方案
音视频·实时音视频·视频编解码
视频技术分享9 天前
国产化视频会议安全加密技术行业应用案例集
音视频·实时音视频
深圳市友昊天创科技有限公司9 天前
ASM4242 雷电扩展坞 CV4242 PCIE扩展坞
音视频·实时音视频·视频编解码
CjWjPexPQY9 天前
引入模糊神经网络对123等级负荷进行功率分配的风光MPPT+VCS逆变并网simiulink/...
实时音视频
深圳市友昊天创科技有限公司9 天前
友昊天创推出延长器方案GSV5600+HDBase VS010**/VS100**
音视频·实时音视频·视频编解码
TEL1892462247713 天前
IT6227:USB-C(DP Alt 模式)及电源传输控制器 内置 4 通道 DP 1.4 转 HDMI 2.1 转换器
音视频·实时音视频·视频编解码