嵌入式软件开发基础实验报告实时时钟(20200930093534)

时间:2020-10-04 15:37:01 手机站 来源:网友投稿

上海电力学院

嵌入式软件开发基础实验报告

题目

【ARM实时时钟实验

专业:

电子科学与技术

年级:

姓名:

学号:

一、 实验目的

1、了解实时时钟的硬件控制原理及设计方法。

2、掌握S3C44B0X处理器的RTC模块程序设计方法。

二、 实验设备

1、 硬件:Embest EduKit-HI 实验平台,Embest ARM标准/增强型仿真器套件, PC 机。

2、 软件: Embest IDE Pro ARM 集成开发环境, Windows 98/2000/NT/XP 。

三、 实验内容

学习和掌握 Embest EduKit-III 实验平台中 RTC 模块的使用,进行以下操作:

1、 编写应用程序,修改时钟日期及时间的设置。

2、 使用EMBEST ARI教学系统的串口,在超级终端显示当前系统时间。

四、 实验原理

实时时钟( RTC)

实时时钟(RTC器件是一种能提供日历/时钟、数据存储等功能的专用集成

电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。 RTC具有计时

准确、耗电低和体积小等特点, 特别是在各种嵌入式系统中用于记录事件发生的 时间和相关信息, 如通信工程、 电力自动化、 工业控制等自动化程度高的领域的 无人值守环境。

 随着集成电路技术的不断发展, RTC 器件的新品也不断推出, 这 些新品不仅具有准确的RTC还有大容量的存储器、温度传感器和 A/D数据采集 通道等,已成为集RTC数据采集和存储于一体的综合功能器件,特别适用于以 微控制器为核心的嵌入式系统。

RTC 器件与微控制器之间的接口大都采用连线简单的串行接口,诸如 I2C、

SPI、MICROWIRECAN等串行总线接口。这些串口由2?3根线连接,分为同步 和异步。

S3C44B0X 实时时钟(RTC单元

S3C44B0X实时时钟(RTC单元是处理器集成的片内外设。由开发板上的后

备电池供电,可以在系统电源关闭的情况下运行。 RTC发送8位BCD码数据到

CPU传送的数据包括秒、分、小时、星期、日期、月份和年份。 RTC单元时钟

源由外部 晶振提供,可以实现闹钟(报警)功能。

S3C44B0X实时时钟(RTC单元特性:

BCD数据:秒、分、小时、星期、日期、月份和年份

1、闹钟(报警)功能:产生定时中断或激活系统

2、自动计算闰年

3、无 2000 年问题

4、独立的电源输入

5、支持毫秒级时间片中断,为RTOS提供时间基准

读 / 写寄存器

访问RTC模块的寄存器,首先要设RTCCON勺bitO 为1。CPU通过读取RTC模块 中寄存器 BCDSEQBCDMIN BCDHOUFBCDDAYBCDDATEBCDMO和 BCDYEAF的 值,得到当前的相应时间值。然而,由于多个寄存器依次读出,所以有可能产生 错误。比如:用户依次读取年 ( 1 989)、月( 1 2)、日(3 1 )、时( 23)、分( 59)、 秒(59)。当秒数为 1 到59 时,没有任何问题,但是,当秒数为 O 时,当前时 间和日期就变成了 1990年1月1日0时0分。这种情况下(秒数为0),用户应 该重新读取年份到分钟的值(参考程序设计)。

后备电池:

RTC单元可以使用后备电池通过管脚 RTCVDDtt电。当系统关闭电源以后,CPU和 RTC的接口电路被阻断,后备电池只需要驱动晶振和BCD计数器,从而达到最小 的功耗。

闹钟功能RTC在指定的时间产生报警信号,包括CPU工作在正常模式和休眠 (power down)模式下。在正常工作模式,报警中断信号(ALMINT被激活。在 休眠模式,报警中断信号和唤醒信号(PMWKUP同时被激活。RTC报警寄存器

(RTCALM决定报警功能的使能/屏蔽和完成报警时间检测。

时间片中断

RTC 时间片中断用于中断请求。

 寄存器 TICNT 有一个中断使能位和中断计数。

 该 中断计数自动递减,当达到 0 时,则产生中断。中断周期按照下列公式计算: Period = ( n+1 ) / 128 second

其中,n为RTC时钟中断计数,可取值为(1-127)

置零计数功能

RTC 的置零计数功能可以实现 30、 40 和50 秒步长重新计数, 供某些专用系统使 用。当使用 50秒置零设置时, 如果当前时间是 11:59:49 ,则下一秒后时间将变为 12:00:00 。

注意:所有的 RTC 寄存器都是字节型的,必须使用字节访问指令( STRB、 LDRB) 或字符型指针访问。

五、 实验设计

硬件电路设计

软件程序设计

(1)时钟设置 时钟设置程序必须实现时钟工作情况以及数据设置有效性检测功能。

 具体实现可以参考示例 程序设计。

(2)时钟显示

时钟参数通过实验系统串口 0 输出到超级终端, 显示内容包括年月日时分秒。

 参数以 BCD 码 形式传送,用户使用串口通信函数(参见串口通信实验)将参数取出显示。

/*******************************************************************************************

**

* name: rtc_read

* func: read data from rtc

* para: none

* ret: none

* modify:

* comment:

********************************************************************************************

*/

void rtc_read(void)

{

while(1)

{

准备实验环境

使用 Embest 仿真器连接目标板,使用 Embest EduKit-III 实验板附带的串口线,连接实验 板上的UARTO和PC机的串口。

串口接收设置

在 PC 机上运行 windows 自带的超级终端串口通信程序 (波特率 115200、1 位停止位、 无校 验位、无硬件流控制);或者使用其它串口通信程序。

打开实验例程

1) 拷贝光盘 CD1\Software\EduKit44b0 文件夹到 目录下;

2) 使用Embest IDE通过Embest JTAG仿真器连接实验板,打开实验例程目录子目录下的 例

程,编译链接工程;

3) 点击IDE的Debug菜单,选择Remote Connect项或F8键,远程连接目标板;

4) 点击IDE的Debug菜单,选择Download下载调试代码到目标系统的 RAM中;

5) 点击Debug菜单的Go或F5键运行程序。

观察实验结果

. 在 PC 机上观察超级终端程序主窗口,可以看到如下界面: boot success...

RTC Test Example

RTC Check(Y/N)

. 用户可以选择是否对 RTC 进行检查,检查正确的话,继续执行程序,检查不正确时也会 提示是否重检查:

RTC Check(Y/N) y

Set Default Time at 2004-12-31 FRI 23:59:59

Set Alarm Time at 2005-01-01 00:00:01

... RTC Alarm Interrupt . ...

Current Time is 2005-01-01 SAT 00:00:01

RTC Working now. To set date(Y/N)

. 用户可以选择是否重新进行时钟设置,当输入不正确时也会提示是否重新设置:

RTC Working now. To set date(Y/N) y Current date is (2005,01,01, SAT).

input new date (yy-mm-dd w): 5-2-23 3

Current date is: 2005-02-23 WED

RTC Working now. To set time(Y/N) y Current time is (00:02:57).

To set time(hh:mm:ss): 19:32:5

. 最终超级终端输出信息如下:

Current Time is 2005-02-23 WED 19:32:05

19:32:07

七、 实验参考程序

1. 环境及函数声明

ARM7基础实验教程 int g_nYear;

- 196 - int

/* g_nMonth,g_nDay,g_nWeekday,g_nHour,g_nMin,g

_nSec;

*/ /*

/* global variables */

/* */

/* function declare */

*/ /*

********

******** for( i = nTmp; i >= 0; i--)

*/

int test_rtc_alarm(void);

void rtc_init(void);

void read_rtc(void);

void display_rtc(void);

void test_rtc_tick(void);

void rtc_int(void);

void rtc_tick(void);

2. 时钟设置控制程序 /******************************************

*******************************************

********

* name: rtc_set_date

* func: get and check the DATEstring from uart channel to set rtc

* para: none

* ret: cN09 = 0 : invalid string

* cN09 = 1 : set date by input string and ok

* modify:

* comment:

******************************************* *******************************************

*******/

int rtc_set_date(char *pString)

{

char cYn,cN09=1;

char szStr[12]; // xxxx-xx-xx x

int i,nTmp;

memcpy((void *)szStr, pString, 12);

// check the format of the data

nTmp = 0;

cN09 = 1;

for(i = 0;((i <12)&(szStr[i] != '\0')); i++)



{

if((szStr[i] == '-')|(szStr[i] == ' '))

nTmp += 1;

}

if(nTmp < 3) // at least 2 '-' and 1 ' '

{

ARM7基础实验教程

- 197 -

cN09 = 0;

uart_printf(" InValid format!!\n\r");

}

else // check if number 0 - 9

{

nTmp = i - 1; // adjust the account number

// 1:MON 2:TUE 3:WED 4:THU 5:FRI 6:SAT 7:SUN if((szStr[nTmp] < '1' | szStr[nTmp] > '7')) //

check weekday cN09 = 0;

for( i = nTmp; i >= 0; i--)

{

if(!((szStr[i] == '-')|(szStr[i] == ' ')))

if((szStr[i] < '0' | szStr[i] > '9')) cN09 = 0;

}

}

// write the data into rtc register

if(cN09)

{

rRTCCON = 0x01; // R/W enable, 1/32768,

Normal(merge), No reset

i = nTmp;

nTmp = szStr[i]&0x0f;

if(nTmp == 7)

rBCDDATE = 1; // s3c44b0x: SUN:1 MON:2

TUE:3 WED:4 THU:5 FRI:6 SAT:7else

TUE:3 WED:4 THU:5 FRI:6 SAT:7

else

rBCDDATE = nTmp+1; // -> weekday; nTmp = szStr[i-=2]&0x0f;

if(szStr[--i] != '-')

nTmp |= (szStr[i--]<<4)&0xff;

if(nTmp > 0x31)

cN09 = 0;

rBCDDAY = nTmp; // -> day;

nTmp = szStr[--i]&0x0f; if(szStr[--i] != '-') nTmp |= (szStr[i--]<<4)&0xff;

if(nTmp > 0x12)

cN09 = 0;

rBCDMON = nTmp; // -> month;

nTmp = szStr[--i]&0x0f;

if(i)

nTmp |= (szStr[--i]<<4)&0xff;

if(nTmp > 0x99)

cN09 = 0;

rBCDYEAR = nTmp; // -> year; rRTCCON = 0x00; // R/W disable uart_printf(" Current date 20%02x-%02x-%02x %s\n"

}

if(nTmp != 2) // at least 3 ':'

{

cN09 = 0;

uart_printf(" InValid format!!\n\r");

}

else

{

nTmp = i - 1;

* name: rtc_set_time

* func: get and check the TIME string from uart channel to set rtc

* para: none

* ret: cN09 = 0 : invalid string

* cN09 = 1 : set time by input string and ok

* modify:

* comment:

*******************************************

*******************************************

*******/

int rtc_set_time(char *pString)

{

char cYn,cN09=1;

char szStr[8]; // xx:xx:xx

int i,nTmp;

memcpy((void *)szStr, pString, 8);

// check the format of the data

nTmp = 0;

cN09 = 1;

for(i = 0;((i < 8)&(szStr[i] != '\0')); i++)

{

is: if(szStr[i] == ':')

nTmp += 1;

,rBCDYEAR,rBCDMON,rBCDDAY,f_szdate[rBCDDATE ]);

if(!cN09) uart_printf(" Wrong value!\n");

}else uart_printf(" Wrong value!\n");

return (int)cN09;

}

/******************************************

*******************************************

{

if(szStr[i] != ':') if((szStr[i] < '0' | szStr[i] > '9')) cN09 = 0;

}

}

// write the data into rtc register if(cN09)

{

rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset

i = nTmp; nTmp = szStr[i]&0x0f; if(szStr[--i] != ':') nTmp |= (szStr[i--]<<4)&0xff; if(nTmp > 0x59) cN09 = 0;

rBCDSEC = nTmp; // -> second; nTmp = szStr[--i]&0x0f; 八、实验体会

if(szStr[--i] != ':')

nTmp |= (szStr[i--]<<4)&0xff; if(nTmp > 0x59) cN09 = 0;

rBCDMIN = nTmp; // -> min; nTmp = szStr[--i]&0x0f;

if(i)

nTmp |= (szStr[--i]<<4)&0xff; if(nTmp > 0x24) cN09 = 0;

rBCDHOUR = nTmp; // -> hour; rRTCCON = 0x00; // R/W disable if(!cN09)

uart_printf(" Wrong value!\n");

ARM7基础实验教程

- 200 -

}else uart_printf(" Wrong value!\n") return (int)cN09;

}

第一、对ARM勺相关理论知识有了初步的了解。了解工作原理和程序步骤 等。这些知识不仅在课堂上有效, 对这次的实践的学习加深了印象, 而且在将来 的工作中也一定会有帮助。

第二、自己的动手能力和自学能力有了很大的提高。实践出真知,今天,我 其实才深刻感受到这句话的实在意义。包括在遇到问题的时候,我通过问老师, 问同学、自己找资料的方式得出了答案,更加深了我的理解和认知。

推荐访问:实验报告 时钟 嵌入式 实时 嵌入式软件开发基础实验报告实时时钟(20200930093534)

版权声明 :以上文章中选用的图片文字均来源于网络或用户投稿 ,如果有侵权请立即联系我们 , 我们立即删除 。