嵌入式 实验5 RTC实验 下载本文

内容发布更新时间 : 2024/5/4 19:09:58星期一 下面是文章的全部内容请认真阅读。

实验5-1 实时时钟设计实验

1、实验目的

", 了解 S3C2410A 的实时时钟硬件控制原理及设计方法。 ", 掌握 S3C2410A 的实时时钟的使用方法

2、实验内容

", 编程实现实时时钟功能,每秒显示实时时钟 ", 实现实时时钟 Alarm,控制蜂鸣器

3、实验设备

GEC2410 开发板

", ADS1.2 集成开发环境,ARM 仿真器、串口连接线

4、实验原理

实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作 各种计算机系统的时钟信号和参数设置存储电路。RTC 具有计时准确、耗电低和体积小的 特点,特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程、电力 自动化、工业控制等自动化程度高的领域无人职守环境。随着集成电路技术的不断发展, RTC 器件的新品也不断推出,这些新品不仅具有准确的RTC,还有大容量的存储器、温度 传感器和A/D 数据采集通道等。

4.1 S3C2410A 实时时钟模块介绍

S3C2410A 实时时钟单元模块在系统电源掉电的时候可以通过备份电源来完成供电。

RTC 提供8bit 时间数据。其中包括秒、分、时、日、星期、月、年等时间信息。RTC 要有 外部晶振提供32.768kHZ 的外部时钟。RTC 也可以提供闹钟定时的功能。

1. 特点:

", BCD 数字,:秒、分、时、日、星期、月、年. ", 定时功能。

", 解除了千年虫的问题。 ", 独立的电源引脚 ", 支持毫秒时钟

2. 读/写寄存器

访问 RTC 模块的寄存器,首先要设RTCCON 的bit0 为1,CPU 通过读取RTC 模块中 寄存器BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDMON 和BCDYEAR 的值,得 到当前的相应时间值,然而,由于多个寄存器依次读出,所以有可能产生错误。

例如:用户依次读取年(18)、月(12)、日(31)、时(23)、分(59)、秒(59)。当秒数为1 到59时没有任何问题,但是当秒数为0 时,但前时间和日期就变成了19 年1 月1 日0 时0 分。这种情况下(秒数为0),用户应该重新读取年份到分钟的值。

3. 闹钟功能

RTC 在制定的时间产生报警信号,包括CPU 工作在正常模式和休眠模式(power off) 下,在正常工作模式下,报警中断信号(ALMINT)被激活。在休眠模式,报警中断信号和

唤醒信号(PMWKUP)同时被激活。RTC 报警寄存器(RTCALM)决定报警功能的使能/ 屏蔽和完成报警时间检测。

4. 时间片中断

RTC 时间片中断用于中断请求。寄存器TICNT 有一个中断使能位和中断计数。中断计 数自动递减,当达到0 时,则产生中断,中断周期按照下列公式计算: Period=(n+1)/128 second

其中,n 为RTC 时钟中断计数,课取值1~127

4.2 实时时钟的寄存器

实时时钟的特殊寄存器主要有RTC控制寄存器(RTCCON)、TICK计数寄存器(TICNT)、 RTC 定时寄存器(RTCALM)还有6 个定时时间寄存器和7 个BCD 时间寄存器。主要时用

来设置时间常数和读取当前的时间。

在具体应用的过程中主要时注意三个控制寄存器的应用: RTCCON――实时时钟控制寄存器

这个寄存器中比较关键的是 RTCEN 位,这一位用来使能RTC 模块时间寄存器的读写, 在对RTC 的寄存器操作之前一定要把这一位置1,在系统电源关闭的时候这一位要置0,用 来防止对寄存器的误操作。

TICNT ――Tick 时钟计数寄存器

这个寄存器主要时来控制产生实时时钟中断的频率,可以设置的频率是1 到128。寄存 器中还有一位是中断使能位。 BCDSEC――BCD 秒数据寄存器 BCDMIN――BCD 分数据寄存器 BCDGOUR――BCD 小时数据寄存器 BCDDATE――BCD 日数据寄存器 BCDDAY――BCD 星期数据寄存器 BCDMON――BCD 月数据寄存器 BCDYEAR――BCD 年数据寄存器 RTCALM ――RTC 定时控制寄存器

这个寄存器用来使能定时功能。在这个寄存器中可以对年、月、日、分、秒等时间信息 分别定时控制,可以最大限度满足用户的需求。 ALMSEC――闹钟秒数据寄存器 ALMMIN――闹钟分钟数据寄存器 ALMHOUR――闹钟小时数据寄存器 ALMDATE――闹钟日数据寄存器 ALMMON――闹钟月份寄存器

ALMYEAR――闹钟年份数据寄存器

5、程序实现

5.1 设置闹钟时间

void setRTCalm(U8 almyear,U8 almmon,U8 almdate,

U8 almhour,U8 almmin,U8 almsec)//年、月、日、时、分、秒

{ rRTCCON=0x0001; rALMYEAR = almyear; rALMMON = almmon; rALMDATE = almdate; rALMHOUR = almhour; rALMMIN = almmin; rALMSEC = almsec;

rRTCCON = 0; //disable RTC write }

5.2 设置时钟时间

void setRTCtime(U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,

U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec)//年、月、日、星期、时、分、秒 {

rRTCCON=0x01; rBCDYEAR = wRTCyear; rBCDMON = wRTCmon; rBCDDATE = wRTCdate; rBCDDAY = wRTCday; rBCDHOUR = wRTChour; rBCDMIN = wRTCmon; rBCDSEC = wRTCsec;

rRTCCON = 0x00; //disable RTC write }

5.3 时钟和闹钟的开关操作

//开实时时钟 void OpenRtc(void) {

pISR_TICK=(unsigned)Tick_Isr;

rTICNT=0xFF;//Tick time interrupt enable;Tick time count value=127 EnableIrq(BIT_TICK);//open RTC TICK INTERRUPT }

//关实时时钟 void CloseRtc(void) {

rTICNT &= ~(1<<7); DisableIrq(BIT_TICK); }

//开闹钟函数 void OpenAlarm() {

pISR_RTC = (unsigned)IsrAlarm; ClearPending(BIT_RTC);