实时时钟实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.6 实时时钟实验
5.6.1 实验目的
1. 了解实时时钟在嵌入式系统中的作用;
2. 掌握实时时钟的使用。
5.6.2 实验内容
1. 编程实现实时时钟功能,每秒显示实时时钟;
2. 编程实现实时时钟告警功能。
5.6.3 预备知识
1. 了解ADT IDE集成开发环境的基本功能;
2. 学习S3C44B0X的实时时钟模块的使用。
5.6.4 实验设备
1. 硬件:JX44B0教学实验箱、PC机;
2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE集成开发环境。
5.6.5 基础知识
1. 实时时钟在嵌入式系统中的作用
在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。
2. S3C44B0X的实时时钟单元
如图5-12为S3C44B0X的实时时钟框图。它具有以下特点:
图5-12 S3C44B0X的实时时钟框图
1)时钟数据采用BCD编码;
2)能够对闰年的年月日进行自动处理;
3)具有告警功能,当系统处于关机状态时,能产生告警中断;
4)具有独立的电源输入;
5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。
3. S3C44B0X的实时时钟寄存器
1) 控制寄存器
表5-16 控制寄存器
2) 告警控制寄存器
表5-17 告警控制寄存器
3) 实时时钟计数器
表5-18 实时时钟计数器
4) 告警时间寄存器
包括年、月、日、时、分、秒。它们都以BCD的格式表示,地址见下表:
表5-19 告警时间寄存器
5) 实时时钟寄存器
包括年、月、日、时、分、秒。它们都以BCD的格式表示,地址见下表:
表5-20 实时时钟寄存器
注意事项:
1. 以上各寄存器都只能以字节模式进行读写操作;
2. 当系统使用BIG-ENDIAN模式时,各寄存器对应的地址为会有所改变,具体值请参考S3C44B0X的数据手册。
4. 实验参考代码及说明
本实验测试S3C44B0X的实时时钟功能,包括:
1) 时钟滴答功能测试,通过LED显示TIME TICK;
2) 时间告警功能测试。
/* 包含文件 */
#include "44b.h"
#include "44blib.h"
#include "rtc.h"
/* 表示日期、时间的数据结构 */
typedef struct ST_DATE
{
short year; // 年
char mon; // 月
char day; // 日
char week_day; // 星期
char hour; // 时
char min; // 分
char sec; // 秒
} st_date;
typedef (*ISR_ROUTINE_ENTRY)(void);
/* 全局变量 */
int led_index = 0;
int ext0_count = 0;
/* 数码管显示码表,请参考led实验 */
unsigned char seg7table[16] =
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,
};
/* functions */
void rtc_tick_isr(void);
void rtc_int_isr(void);
void IsrIRQ() __attribute__ ((interrupt("IRQ")));
/***************************************************************************** // Function name : rtc_set_date
// Description : 修改实时时钟当前时间、日期
// Return type : void
// Argument : p_date, 待设置的日期
*****************************************************************************/ void rtc_set_date(st_date* p_date)
{
rRTCCON = 0x01;
rBCDYEAR = p_date->year;
rBCDMON = p_date->mon;
rBCDDAY = p_date->day;
rBCDDATE = p_date->week_day;
rBCDHOUR = p_date->hour;
rBCDMIN = p_date->min;
rBCDSEC = p_date->sec;
rRTCCON = 0x00;
}
/***************************************************************************** // Function name : rtc_get_date
// Description : 获取实时时钟当前时间、日期
// Return type : void
// Argument : p_date, 返回日期的指针
*****************************************************************************/ void rtc_get_date(st_date* p_date)