[ARM嵌入式]炫目的日历

目录

一、学习指南

二、RTC时钟原理 

1、RCT实时时钟特征与原理 

1.1RCT特征

1.2RTC工作原理图 

1.3RTC组成 

1.4、RTC时钟源原理

2、BKP备份寄存器 

3、常用寄存器 

4、相关库函数讲解 

5、配置 

三、程序解析 

1、RTC工作原理框图

2、 RTC结构体及硬件电路设计讲解

2.1时间结构

2.2 日期结构

 2.3闹钟结构

2.4代码演示 

四、日历显示 

 五,项目总结


一、学习指南

RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片. RTC是PC主板上的晶振及相关电路组成的时钟电路的生成脉冲,RTC经过8254电路的变频产生一个频率较低一点的OS(系统)时钟TSc,系统时钟每一个cpu周期加一,每次系统时钟在系统初起时通过RTC初始化。

RTC通常情况下需要外接32.768kHz晶体,匹配电容、备份电源等元件。RTC除了I/0口的定位不同,还有功能上的区别,比如与MCU的接口,现在常用的是I2C接口(距离短,可以与其他器件共用)还有RAM的数量、静态功耗大小、中断的数量,特别是精度的区别。RTC的精度可以说与温度有很大的关系,而温度会影响晶体的频率。所以就产生实时时钟的衍生产品:时钟模块(内置晶体、电容、电池等等),其精度可保持在每天误差小于 0.50秒。但时钟模块相比时钟芯片而言会高出许多。RTC最重要的功能是提供到2099年内的日历功能,对于时间来说,无论快慢都是误差,而匹配电容在 RTC的外围器件上其他非常重要的作用,它可以适当修正晶体与 RTC之间匹配问题。特别是像H1208这样的RTC,把匹配电容内置,这样就可以保证RTC精度的一致性,不会出现有的 RTC走得快,有些又走得慢。

它的主要作用就是提供稳定的时钟信号给后续电路用。主要功能有:时钟&日历,闹钟,周期性中断输出,32KHz时钟输出。

二、RTC时钟原理 

1、RCT实时时钟特征与原理 

RTC是个独立的定时器,RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能,修改计数器的值可以重新设置当前时间和日期

RTC模块和时钟配置系统(RCC BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变·但是在系统复位后,会自动禁止访问后备寄存器和RTC ,以防止对后备区域(BKP)的意外写操作·所以在要设置时间之前,先要取消备份区域(BKP)写保护。

1.1RCT特征

1.2RTC工作原理图 

1.3RTC组成 

APB1接口:用来和 APB1总线相连·通过 APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC核心:由一组可编程计数器组成分两个主要模块:

第一个是 RTC预分频模块,它可以编程产生最长1秒的RTC时间基TR_CLK·如果设置了秒中断允许位,可以产生秒中断。

第二个是32位的可编程计数器,可被初始化为当前时间,系统时间按TR CLK周期累加并与存储在RTC ALR寄存器中的可编程时间相比当匹配时候如果设置了闹钟中断允许位,可以产生闹钟中断。

RTC内核完全独立于 APB1接口,软件通过 APB1接口对 RTC相关寄存器访问·但是相关寄存器只在 RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新·所以软件必须先等待寄存器同步标志位(RTC CRL的 RSF位)被硬件置1才读。

1.4、RTC时钟源原理

2、BKP备份寄存器 

备份寄存器是42个16位的寄存器,可用来存储84个字节数据。它们处在备份区域,当 VDD电源切断,仍然由 VeAt维持供电。当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。

执行以下操作将使能对后备寄存器和 RTC访问:

设置寄存器RCC APB1ENR的 PWREN 和 BKPEN 位,使能电源和后备时钟、设置寄存器 PWR CR.的 DBP位,使能对RTC和后备寄存器的访问。

3、常用寄存器 

4、相关库函数讲解 

5、配置 

三、程序解析 

1、RTC工作原理框图

工作原理主要依赖于一个独立的定时器和一个用于存储时间信息的寄存器组。RTC是一个集成电路,通常称为时钟芯片,它拥有一个连续计数的计数器,这个计数器可以在相应的软件配置下提供时钟日历的功能。RTC模块和时钟配置系统(RCC_BDCR寄存器)位于后备区域,这意味着在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。然而,在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。因此,在设置时间之前,需要先取消备份区域(BKP)的写保护。12

RTC的工作模式包括读取、设置和校准时间等操作,这些操作通过读写寄存器实现。寄存器组通常包括秒、分、时、日、月、年等时间字段,以及一些控制寄存器和状态寄存器。RTC模块还包含一系列用于存储时间信息的寄存器,这些寄存器允许时间的读取、设置和校准。

此外,RTC的精度可以通过调整石英晶振频率的方法来校准,例如使用固定的OSCI电容或通过调整OSCI引脚与地的微调电容来确保加电时CLKOUT引脚输出准确的32.768KHz信号。芯片时钟精度的校准还涉及到推荐使用特定负载电容的晶体,并通过测量OSCI引脚的输出和CLKOUT引脚的时钟频率来进行调整。

总的来说,RTC通过其内部的定时器和寄存器组,以及通过软件配置和校准方法,提供了一个独立于系统主时钟的高精度时间源,即使在系统断电或复位后也能保持时间的准确性和连续性。

2、 RTC结构体及硬件电路设计讲解

2.1时间结构

RTC(实时时钟)通常用于嵌入式系统,以保持计算机在没有外部实时时钟源时间的情况下的时间同步。RTC时间通常存储在只读存储器(ROM)或备份电池供电的RAM中。

在C语言中,RTC时间通常用struct结构体来表示,其中包含年、月、日、小时、分钟和秒等字段。以下是一个简单的RTC时间结构体示例:

struct rtc_time {

int tm_sec; /* 秒,范围0-59 */

int tm_min; /* 分钟,范围0-59 */

int tm_hour; /* 小时,范围0-23 */

int tm_mday; /* 月份中的日期,范围1-31 */

int tm_mon; /* 月份,范围0-11 */

int tm_year; /* 年份,从1900年起 */

int tm_wday; /* 星期几,范围0-6 */

int tm_yday; /* 年份中的一天,范围0-365 */

int tm_isdst; /* 夏令时标记 */

};

使用此结构体,您可以读取和设置RTC时间。例如,设置RTC时间的函数可能如下所示:

void set_rtc_time(struct rtc_time *new_time) {

// 这里应该是将new_time设置到RTC硬件的代码

}

获取RTC时间的函数可能如下所示:

void get_rtc_time(struct rtc_time *current_time) {

// 这里应该是从RTC硬件读取时间到current_time的代码

}

2.2 日期结构

 

我们可以使用结构体来创建一个RTC日期。下面是一个简单的例子:

struct rtc_date {

int year;

int month;

int day;

};

int main() {

struct rtc_date today;

today.year = 2023;

today.month = 3;

today.day = 21;

// 打印今天的日期

printf("Today's date is: %d-%d-%d\n", today.year, today.month, today.day);

return 0;

}

在这个例子中,我们定义了一个名为rtc_date的结构体,它有三个成员:yearmonthday。然后我们在main函数中创建了一个rtc_date类型的实例,并设置了今天的日期。最后,我们使用printf函数打印出了今天的日期。

这只是一个基本的例子,实际的RTC可能需要更复杂的操作,例如设置日期,从RTC读取当前日期等。

 2.3闹钟结构

2.4代码演示 

// 假设使用嵌入式C++和简单的图形界面库
#include "ui.h"
#include "time.h"

class CalendarView {
public:
    void displayCurrentMonth() {
        // 获取当前时间的月份和日期
        time_t now = time(0);
        tm* current = localtime(&now);
        
        // 在UI上显示月份和日期
        setCursorPosition(0, 0); // 假设是屏幕左上角
        printString(current->tm_mon + 1, "月"); // 显示中文月份
        printNumber(current->tm_mday, "日"); // 显示日期
        
        // 可能会添加更多炫酷效果,如动态滚动或动画
    }
};

int main() {
    CalendarView calendar;
    calendar.displayCurrentMonth();
    while (true) {
        // 持续更新日历显示,比如每分钟刷新一次
        calendar.displayCurrentMonth();
        delay(60000); // 延迟1分钟
    }

四、日历显示 

 

 五,项目总结

ARM嵌入式系统中的日历总结通常关注在嵌入式设备上实现日期和时间管理的功能,这在物联网(IoT)、智能家居、移动设备以及工业控制等领域非常重要。以下是几个关键点的概述:

1. 时间同步:ARM设备可能需要与网络服务器或内部时钟源进行时间同步,确保日历信息准确无误。

2. 日历算法:使用C语言或者其他适合嵌入式环境的编程语言实现复杂的日期计算,如闰年判断、节假日处理等。

3. 实时日期显示:在用户界面中,如LCD显示屏或触摸屏上显示当前日期和时间,可能包括小时、分钟、秒和星期几。

4. 历史记录与事件提醒:一些设备可能需要存储用户的预约、纪念日等,并在特定日期提供提醒。

5. 电池寿命管理:考虑到设备的低功耗需求,优化日历功能以减少对电池的影响。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值