RTC时钟

一、RTC介绍
 

实时时钟的缩写是RTC(Real_Time Clock)。RTC 是集成电路,通常称为时钟芯片。

实时时钟芯片是日常生活中应用最为广泛的消费类电子产品之一。它为人们提供精确的实时时间,或者为电子系统提供精确的时间基准,实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时,还可以工作,需要外加电池供电。

  • 那么为什么我们需要一个单独的RTC?

原因是CPU的定时器时钟功能只在“通电时”运行,断电时停止。当然,如果时钟不能连续跟踪时间,则必须手动设置时间。如今,通过接收标准电波(传输各国标准时间的电波)来自动调整时间的手表越来越多,但它是一种不应该在室内携带的电子设备。

RTC有一个与CPU单独分离的电源,如纽扣电池(备用电池),即使主机电源关闭,它也保持滴答作响,随时可以实时显示时间。然后,当计算机再次打开时,计算机内置的定时器时钟从RTC读取当前时间,并在此基础上供电的同时,时间在其自身机制下显示。

同时RTC单元外接32.768 kHZ晶振,具有定时报警功能。

 

二、I.MX6ull RTC介绍
 

 低功耗(电池支持)部分包含一个安全实时计数器,一个单调计数器和一个通用寄存器。SNVS的LP部分由电池供电,该电池在芯片断电时保持SNVS_LP寄存器的状态。

 

 SNVS_HP部分实现了启用系统通信和SNVS_LP部分配置的所有功能

 SNVS_LP部分提供安全存储和保护敏感数据的硬件。

 2.1 SNVS_HP (high power domain)

 SNVS_HP is partitioned into the following functional units(SNVS_HP分为以下功能单元):

• IP bus interface(IP总线接口)

• SNVS_LP interface(SNVS_LP接口)

• Real time counter with alarm (带报警功能的实时计数器)

• Control and status registers(控制和状态寄存器)

 SNVS_HP位于芯片的电源供应域中,因此与芯片的其余部分一起接收电源。SNVS_HP提供了SNVS_LP和系统其余部分之间的接口;除了通过SNVS_HP,没有办法访问SNVS_LP寄存器。为了访问SNVS_LP寄存器,SNVS_HP必须上电。它使用寄存器访问权限策略来确定是否允许访问特定的寄存器。

 2.2 SNVS_LP (low power domain)

 SNVS_LP是一个数据存储子系统。它的目的是存储和保护系统数据,而不管系统主电源状态如何。

SNVS_LP处于始终上电的域,该域是一个独立的电源域,拥有自己的电源。

 2.3 SNVS interrupts and alarms

 

 2.3.1 Time counter alarm

 SNVS_HP非安全RTC有自己的时间警报寄存器。任何应用程序都可以更新此寄存器。SNVS_HP时间警报可以生成中断以提醒主机处理器,并可以从其低功耗模式之一唤醒主机处理器。请注意,如果电源关闭,则无法唤醒整个系统,因为此警报也会关闭。

 2.3.2 Periodic interrupt

 SNVS_HP非安全RTC包含周期性中断。当RTC的选定位发生零到一或一到零转换时,就会产生周期性中断。周期性中断源是根据HP控制寄存器中的PI_FREQ字段设置从HP RTC的16位中选择的。这种位选择还定义了周期性中断的频率。

 

 编程思路

  • 设置寄存器访问不受权限限制
  •  使能SNVS时钟
  •  停止RTC计数器,等待RTC计数器停止成功
  •  设置日期
  • 开启RTC计数器,等待RTC计数器开启成功
### RTC时钟概述 实时时间计数器(Real-Time Clock,简称RTC)是一个独立运行的硬件模块,通常集成于微控制器中。它通过内部的一个连续计数器来记录时间,并能够经过适当配置实现时钟日历功能[^1]。 #### 设置RTC时钟的关键要素 为了使RTC正常工作并显示当前的时间和日期,需要完成以下几个方面的初始化与操作: - **结构体定义** 需要先声明两个主要的数据结构 `RTC_TimeTypeDef` 和 `RTC_DateTypeDef` 来分别存储时间和日期的信息[^2]。 - **获取时间与日期** 利用HAL库中的函数 `HAL_RTC_GetTime()` 获取当前时间数据到之前定义好的 `r_time` 结构变量里;同理,调用 `HAL_RTC_SetDate()` 函数读取日期至 `r_data` 中。 以下是基于STM32 HAL库的一段典型代码示例展示如何具体实施上述过程: ```c // 定义全局变量用于保存时间/日期信息 RTC_TimeTypeDef r_time; RTC_DateTypeDef r_data; void DisplayDateTime(void){ char text[20]; // 调用API获得实际的时间和日期数值 HAL_RTC_GetTime(&hrtc, &r_time, FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &r_data, RTC_FORMAT_BIN); // 将小时、分钟以及秒转换成字符串形式以便后续处理 sprintf(text,"%02d:%02d:%02d",r_time.Hours,r_time.Minutes,r_time.Seconds); OLED_ShowString(0,0,(uint8_t *)text,16); // 同样地对于年份、月份还有天也做相同的操作 sprintf(text,"%04d-%02d-%02d",r_data.Year+r_data.Month,r_data.Date); OLED_ShowString(0,2,(uint8_t *)text,16); } ``` 此代码片段展示了怎样从RTC提取当前时刻并将之呈现在OLED屏幕上。其中运用到了标准C语言里的`sprintf`函数来进行格式化输出,而最终的结果会以十六进制字节数组的形式传递给显示屏驱动程序接口[`OLED_ShowString`]进行渲染。 另外值得注意的是,除了基本的时间追踪外,某些型号的RTC还具备自动唤醒机制,这允许设备即使处于极低能耗状态也能周期性恢复执行特定任务,比如更新屏幕上的时间显示或者触发其他事件响应。 ### 总结 综上所述,正确配置RTC不仅涉及简单的寄存器写入动作,还需要合理安排相关外围电路配合才能达到预期效果。希望以上介绍能帮助理解RTC的工作原理及其应用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值