实时时钟参考程序

合集下载

可校准的实时时钟设计说明

可校准的实时时钟设计说明

“可校准实时时钟”设计说明1程序设计框架说明本案例程序设计主要分为:DS1302、按键扫描三个模块。

1.1宏定义#define uchar unsigned char //宏定义#define uint unsigned int#define ADC_CHS1_7 0X07/***********时分秒写寄存器**************/#define DS1302_SECOND_WRITE 0x80#define DS1302_MINUTE_WRITE 0x82#define DS1302_HOUR_WRITE 0x84#define DS1302_WEEK_WRITE 0x8A#define DS1302_DAY_WRITE 0x86#define DS1302_MONTH_WRITE 0x88#define DS1302_YEAR_WRITE 0x8C#define ADC_POWER 0X80#define ADC_FLAG 0X10 //当A/D转换完成后,ADC_FLAG要软件清零#define ADC_START 0X08#define ADC_SPEED_90 0X60/***********时分秒读寄存器**************/#define DS1302_SECOND_READ 0x81#define DS1302_MINUTE_READ 0x83#define DS1302_HOUR_READ 0x85#define DS1302_WEEK_READ 0x8B#define DS1302_DAY_READ 0x87#define DS1302_MONTH_READ 0x89#define DS1302_YEAR_READ 0x8D#define P1_7_ADC 0x802.2引脚定义/********DS1302*******/sbit Rtc_sclk = P1^5; //时钟线引脚,控制数据的输入与输出sbit Rtc_rst = P1^6; //CE线引脚,读、写数据时必须置为高电平sbit Rtc_io = P5^4; //实时时钟的数据线引脚/********数码管显示******/sbit L ed_sel = P2^3; //流水灯和数码管选通引脚sbit S el0 = P2^0; //Sel0、Sel1、Sel2三位二进制进行数码管位选0-7 sbit S el1 = P2^1;sbit S el2 = P2^2;sbit K EY1=P3^2; //Key1对应引脚1.3 变量定义typedef struct __SYSTEMTIME__{uchar Second;uchar Minute;uchar Hour;uchar Week;uchar Day;uchar Month;uchar Year;}SYSTEMTIME; //定义的时间类型SYSTEMTIME t;/*时、分、秒标志*/bit set_H_flag;bit set_Ms_flag;bit set_S_flag;/*时、分、秒值*/uint set_H_val;uint set_Ms_val;uint set_S_val;bit set_HMS_done; //时分秒设置完bit show_set_HMS; //显示时分秒bit show_HMS; //显示时分秒bit show_key_val;unsigned char key_val;uchar flag; //所选择点亮的数码管0-7标志位uchar temp; //要写入到DS1302的数据uchar duanxuan[];uchar weixuan[];2、程序函数说明延时程序void Delayms(char i);DS1302读写函数void Ds1302_write(uchar temp);uchar Ds1302_read();void WriteDS1302(uchar Addr, uchar Data);uchar ReadDS1302(uchar cmd)SYSTEMTIME DS1302_GetTime();系统初始化void Init();void Init_key();ADC转换unsigned char GetADC();检测导航键unsigned char Fun_Keycheck();监听功能键,完成时分秒相关值的设置void Fun_Key_task_HMS();监听按键1,完成时分秒设置void Fun_key1();完成相关设置功能的操作void Key_OFFON();初始化DS1302void Initial_DS1302(void);中断显示程序void timer0() interrupt 1初始化ADCvoid Init_ADC();2程序设计框架及关键技巧说明2.1 I/O引脚及相关寄存器配置2.1.1 I/O引脚:(1)数码管位选引脚整个设置P2口的值;(2)数码管使能引脚sbit led_sel = P2^3 ;(3)DS1302引脚sbit rtc_sclk=P1^5; //时钟线引脚sbit rtc_rst=P1^6; // CE线引脚sbit rtc_io=P5^4; //实时时钟的数据线引脚(4)按键引脚sbit KEY1 = P3^2 ; //设置时间2.1.2寄存器:(1)DS1302相关寄存器其中:①控制字寄存器:写地址0x8E,读地址0x8F位7:必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

STM32系列MCU硬件实时时钟(RTC)应用笔记说明书

STM32系列MCU硬件实时时钟(RTC)应用笔记说明书

2017年6月Doc ID 018624 Rev 1 [English Rev 5]1/45AN3371应用笔记在 STM32 F0、F2、F3、F4 和 L1 系列MCU 中使用硬件实时时钟(RTC )前言实时时钟 (RTC) 是记录当前时间的计算机时钟。

RTC 不仅应用于个人计算机、服务器和嵌入式系统,几乎所有需要准确计时的电子设备也都会使用。

支持 RTC 的微控制器可用于精密计时器、闹钟、手表、小型电子记事薄以及其它多种设备。

本应用笔记介绍超低功耗中等容量、超低功耗大容量、F0、F2和 F4 系列器件微控制器中嵌入式实时时钟 (RTC) 控制器的特性,以及将 RTC 用于日历、闹钟、定时唤醒单元、入侵检测、时间戳和校准应用时所需的配置步骤。

本应用笔记提供了含有配置信息的示例,有助于您快速准确地针对日历、闹钟、定时唤醒单元、入侵检测、时间戳和校准应用配置 RTC 。

注:所有示例和说明均基于 STM32L1xx 、STM32F0xx 、STM32F2xx 、STM32F4xx 和STM32F3xx 固件库,以及 STM32L1xx (RM0038)、STM32F0xx (RM0091)、STM32F2xx (RM0033)、STM32F4xx (RM0090)、STM32F37x (RM0313) 和 STM32F30x(RM0316) 的参考手册。

本文提到的STM32 指超低功耗中等容量、超低功耗大容量、F0、F2 和 F4 系列器件。

超低功耗中等 (ULPM) 容量器件包括 STM32L151xx 和 STM32L152xx 微控制器,Flash 容量在 64 KB 到 128 KB 之间。

超低功耗大 (ULPH) 容量器件包括 STM32L151xx 、STM32L152xx 和 STM32L162xx 微控制器,Flash 容量为 384 KB 。

F2 系列器件包括 STM32F205xx 、STM32F207xx 、STM32F215xx 和 STM32F217xx 微控制器。

51单片机ds1302实时时钟程序

51单片机ds1302实时时钟程序

51单⽚机ds1302实时时钟程序#ifndef __DS1302_H_#define __DS1302_H_//---包含头⽂件---//#include#include//---重定义关键词---//#ifndefuchar#define uchar unsigned char#endif#ifndefuint#define uint unsigned int#endif//---定义ds1302使⽤的IO⼝---//sbit DSIO=P3^4;sbit RST=P3^5;sbit SCLK=P3^6;//---定义全局函数---//void Ds1302Write(ucharaddr, uchardat); uchar Ds1302Read(ucharaddr);void Ds1302Init();void Ds1302ReadTime();//---加⼊全局变量--//extern uchar TIME[7]; //加⼊全局变量#endif #include"ds1302.h"//---DS1302写⼊和读取时分秒的地址命令---////---秒分时⽇⽉周年最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2013年1⽉1⽇星期⼆12点00分00秒。

---////---存储顺序是秒分时⽇⽉周年,存储格式是⽤BCD码---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};/************************************************************************ * 函数名: Ds1302Write* 函数功能: 向DS1302命令(地址+数据)* 输⼊: addr,dat* 输出: ⽆************************************************************************* void Ds1302Write(ucharaddr, uchardat){uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。

8225A芯片实现实时闹钟信息工程专业单片机课程设计报告

8225A芯片实现实时闹钟信息工程专业单片机课程设计报告

华东交通大学信息工程专业单片机课程设计报告目录目录................................................................. I 摘要................................................................ II 第一章设计要求.. (1)1.1课程设计项目名称 (1)1.2项目设计目的及技术要求 (1)第二章总体方案 (2)2.2硬件电路设计 (2)2.2.1单片机最小系统电路 (2)2.2.2复位电路 (5)2.2.3 8255可编程并行I/O口接口芯片 (6)2.2.4蜂鸣器的工作原理 (8)2.3软件设计 (9)2.3.1时间调节原理框图 (9)2.3.2主程序流程图 (10)第三章总结 (11)第四章参考文献 (12)附录 (13)一、仿真图: (13)二、程序清单: (13)华东交通大学信息工程专业单片机课程设计报告摘要20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。

由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。

尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于数字钟电路的基本组成包含了数字电路的主要组成部分,因此进行数字钟的设计是必要的,研究数字钟及扩大其应用,有着非常现实的意义。

单片机数字时钟就是其中的一款设计。

它具有编程灵活,便于电子钟功能的扩充,即可用该电子钟发出各种控制信号,精确度高等特点,同时可以用该电子钟发出各种控制信号。

周立功—I2C 总线实验

周立功—I2C 总线实验

I2C 总线实验(实时时钟、EEPROM 和ZLG7290 的实验)一.实验目的加深用户对I2C 总线的理解,熟悉I2C 器件的使用,提供用户实际开发的能力。

二.实验设备及器件IBM PC 机一台DP-51PROC 单片机综合仿真实验仪一台三.实验内容进行I2C 总线控制的实时时钟、EEPROM、ZLG7290 键盘LED 控制器实验。

四.实验要求熟练掌握I2C 总线的控制,灵活运用I2C 主控器软件包,深刻理解实时时钟、EEPROM、ZLG7290 键盘LED 控制的各种功能。

五.实验步骤1.使用导线连接D5 区的SCL、SDA 到A2 区的P16、P17(SCL~P16、SDA~P17),连接D5 区的RST_L、INT_KEY 到A2 区的P10、INT0(RST_L~P10、INT_KEY~INT0),短接D5 区的JP1 跳线。

2.把模拟I2C 软件包“VIIC_C51.C”文件加入到Keil C51 的项目中,程序源文件的开头包含“VIIC_C51.H”头文件。

修改VIIC_C51.C 文件中的sbit SDA=P1^7;和sbit SCL=P1^6;。

图3.21 RTC原理图3.使用函数ISendStr(uchar sla,uchar suba,uchar *s,uchar no)对PCF8563T实时时钟进行设置初始时间,再使用IRcvStr(uchar sla,uchar suba,uchar*s,uchar no)对PCF8563T 实时时钟的时间进行读取。

EEPROM 原理图4.使用函数ISendStr(uchar sla,uchar suba,uchar *s,uchar no);对24WC02EEPROM 进行写入,再使用IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);对24WC02 EEPROM 进行读取。

ZLG7290 原理图5.对ZLG7290 键盘LED 控制器的操作也同理,只是在程序开始的地方增加复位操作和程序中间增加查询是否有键按下。

第8章 S7-200系列PLC的功能指令

第8章 S7-200系列PLC的功能指令

1、BCD码转换成整数及整数转换成BCD码指令
2、双整数至整数、整数至双整数及双整数至实数指令
3、整数至字节及字节至整数指令
4、取整指令及截断指令
5、译码指令和编码指令
6、七段码显示指令
将字节型输入数据(IN)的低四位有效数字产生相应的七段显示码, 并将其输出到OUT指定的数据单元,直接在LED数码显示。
8.2.1 四则运算指令
2.乘法指令
当使能端EN有效时,将输入IN1、IN2中的数据有进行乘法运算, 结果存储在OUT指定的数据中。
8.2.1 四则运算指令
3.除法指令
当使能端EN有效时,将输入IN1、IN2中的数据有进行除法运算,结 果存储在OUT指定的数据中。
四则运算指令应用举例
执行图中程序,
8.1.2 移位指令
◆当使能端EN有效时,指令将输入数据(IN)向右或向左移动一定 的位数(N)。移动后的结果在输出寄存器 (OUT)中输出。 ◆移位指令属于开环移位,包括字节、字、双字等的右移或左移移位
8.1.3 循环移位指令
◆将输入数据(IN)按指定的移动位数(N)向右或向左循环移动,
结果输出到输出寄存器(OUT)中。
8.2.3 逻辑运算指令
将输入数据IN1、IN2对应位进行与(或、异或、取反)运算,结果输 出到OUT中去,指令格式说明如表8-10。
逻辑运算应用举例
想一想 练一练
设有一台5层电梯,使用PLC编写控制程序,轿厢内呼叫按 钮状态存储在IB0中,楼层上呼叫按钮状态存储在IB1,楼 层下呼叫按钮状态存储在IB2中,电梯目前停层的状态存储 在MB0中,试用逻辑运算指令编写电梯轿厢应答呼叫停层 程序。 编程思路:电梯轿厢应答呼叫停层是下面3个条件的“或”。 当IB0与MB0相与为1时; 当IB1与MB0相与为1且电梯保持上行状态时; 当IB2与MB0相与为1且电梯保持下行状态时。

实时时钟,日历芯片-BM8563,兼容PCF8563,参考源代码


_nop_(); _nop_(); }
/******************************************************************** 函 数 名:Stop_I2C(void) 功 能:停止 I2C 总线的传输 说 明: 调 用: 入口参数:无 返 回 值:无 ***********************************************************************/ void Stop_I2C(void) { SCL=0; _nop_(); SCL=1; SomeNOP(); SDA=1; SomeNOP(); }
/******************************************************************** 函 数 名: GetBM8563(void) 功 能:从 BM8563 的内部寄存器(时间、状态、报警等寄存器)读取数据 说 明:该程序函数用来读取 BM8563 的内部寄存器,譬如时间,报警,状态等寄存器 采用页写的方式,设置数据的个数为 no,no 参数设置为 1 就是单字节方式 调 用:Start_I2C(),SendByte(),RcvByte(),Ack_I2C(),Stop_I2C() 入口参数:sla(BM8563 从地址) , suba(BM8563 内部寄存器地址) *s(设置读取数据存储的指针) , no(传输数据的个数) 返 回 值:有,返回布尔量(bit)用来鉴定传输成功否 ***********************************************************************/ bit GetBM8563(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; Start_I2C(); SendByte(sla); if(ack==0)return(0); SendByte(suba); if(ack==0)return(0); Start_I2C(); SendByte(sla+1); if(ack==0)return(0); for (i=0;i<no-1;i++) { *s=RcvByte(); Ack_I2C(0); s++; } *s=RcvByte(); Ack_I2C(1); Stop_I2C();//除最后一个字节外,其他都要从 MASTER 发应答。 return(1); }

实时时钟显示程序

基于c8051f020单片机最小系统的实时时钟显示程序2009-08-25 08:35// 关键字:c8051f020 FYD12864-0402B LCD显示按键电子时钟//#include <c8051f020.h>#include<lcd.h>#include <intrins.h>#define uchar unsigned charvoid lcd_ini();void DISPInitial();void ascii_change(void);void delay();void wri_add(uchar com);void wri_dat(uchar com1);void shan(void);void disp();void tkey(void);void PORT_Init (void);sbit cs=P1^7;sbit sid=P1^6;sbit sclk=P1^5;bit flag=1;uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态uchar data clock[3]={24,00,00};uchar code clockname[10]={"北京时间:"};uchar data num[6];/*******主程序*************/void main(){lcd_ini();count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒TMOD=0x01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;IT0=1;EX0=1;TR0=1;while(1){back:ascii_change();disp();delay();if(flag==1)goto back;tkey();shan();delay();}}/****lcd初始化*******//*void lcd_ini(){wri_add(0x30);delay();wri_add(0x0c);delay();wri_add(0x01);delay();wri_add(0x06);delay();}*/void PORT_Init (void){XBR0 = 0x00; //不让他连上IO口XBR1 = 0x14; //允许外部中断连在端口上XBR2 = 0x40; // Enable crossbar and weak pull-upsP0MDOUT |= 0x00; // enable TX0 as a push-pull output// P1MDOUT |= 0x07; // enable P1.6 (LED) as push-pull output P2MDOUT=0xfe; //为了驱动步进电机的控制线//P3MDOUT = 0xFF;P74OUT=0x00; //配置成漏极方式可以让LCD显示成功,我试了配置成推挽方式不能正常显示}/********定时程序*************/void timer1() interrupt 1 using 2{TL0=0XB0;TH0=0X3C;count--;if(count==0){count=10;clock[2]++;//秒//}elsegoto out;if(clock[2]==60){clock[2]=0;clock[1]++;//分//}if(clock[1]==60){clock[1]=0;clock[0]++;}if(clock[0]==24)//时//clock[0]=0;out:_nop_();}/*******十位个位转换成ASCII码************/ void ascii_change(void){num[5]=clock[2]-(clock[2]/10)*10+0x30; num[4]=clock[2]/10+0x30;num[3]=clock[1]-(clock[1]/10)*10+0x30; num[2]=clock[1]/10+0x30;num[1]=clock[0]-(clock[0]/10)*10+0x30; num[0]=clock[0]/10+0x30;}/********廷时程序*************/void delay(){uchar i,j;for (i=250;i>0;i--)for (j=250;j>0;j--);}/*****Write address*********/void wri_add(uchar com){uchar i,j,k;cs=0;cs=1;dat=0xf8;for(i=1;i<=8;i++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com;dat=dat&0xf0;for(j=1;j<=8;j++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&0xf0;for(k=1;k<=8;k++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}}/*********Write data*************/ void wri_dat(uchar com1){uchar i,j,k;cs=0;cs=1;dat=0xfa;for(i=1;i<=8;i++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com1;dat=dat&0xf0;for(j=1;j<=8;j++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com1;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&0xf0;for(k=1;k<=8;k++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}}/******display program***********/ //显示时间void disp(){uchar i,k=0;wri_add(0x80);for (i=1;i<=9;i++)wri_dat(clockname[i-1]);wri_add(0x90);for (i=1;i<=6;i++){k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。

STM32实时时钟RTC按键修改时间

tcp_client_reconnect();//尝试连接到TCP Server端,用于TCP Client
while (1)
{ Display_Time();
uip_polling();//处理uip事件,必须插入到用户程序的循环体中
//key=KEY_Scan();
if(tcp_client_tsta!=tcp_client_sta)//TCP Client状态改变
timer.w_month=(s8)Process_date(0,0,str[5],str[6]);
timer.w_date=(s8)Process_date(0,0,str[8],str[9]);
timer.hour=(s8)Process_date(0,0,str[11],str[12]);
timer.min=(s8)Process_date(0,0,str[14],str[15]);
case 6:LCD_ShowString(1,7,"六");break;
}
LCD_Shownum(1,0,timer.hour);
LCD12684_Wdat(0x3a);
LCD_Shownum1(timer.min);
LCD12684_Wdat(0x3a);
LCD_Shownum1(timer.sec);
if(BUF->type == htons(UIP_ETHTYPE_IP))//是否是IP包?
{
uip_arp_ipin();//去除以太网头结构,更新ARP表
uip_input();//IP包处理
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len > 0
//需要发送的数据在uip_buf,长度是uip_len (这是2个全局变量)

35. RTC实时时钟实验[11页]

STM32F1的RTC,就需要了解它内部的结构。如图32.1.1所示:(大家也 可以查看《STM32F10x中文参考手册》-16实时时钟(RTC)章节内容
普中STM32开发板带您进入ARM世界
系统复位后, 默认禁止访问后备寄存器和 RTC,防止对后备区域 (BKP)的意外写操作。执行以下操作使能对后备寄存器和 RTC 的访问: (1) 设置 RCC_APB1ENR 寄存器的 PWREN 和 BKPEN 位来使能电源和后备
普中STM32开发板带您进入ARM世界
(5)更新配置,设置 RTC 中断分组 RTC_ExitConfigMode();//退出配置模式,更新配置 void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); BKP_WriteBackupRegister(BKP_DR1, 0XA0A0); uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
3.硬件电路
本实验使用到硬件资源如下: (1)D1指示灯 (2)串口1 (3)RTC
D1指示灯、串口1电路在前面章节都介绍过,这里就不多说,至于RTC 它属于STM32F1芯片内部的资源,只要通过软件配置好即可使用。D1指示 灯用来提示系统运行状态。串口1将读取的RTC时间日期信息打印出来。
这里需要注意RTC 不能断电,否则时间数据将会丢失,如果想让时间 在断电后还可以继续走,那么必须确保开发板上的纽扣电池有电。
普中STM32开发板带您进入ARM世界
(6)编写RTC中断服务函数 RTC_IRQHandler FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG); RTC_ClearITPendingBit(RTC_IT_SEC);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5.6 实时时钟实验5.6.1 实验目的1. 了解实时时钟在嵌入式系统中的作用;2. 掌握实时时钟的使用。

5.6.2 实验内容1. 编程实现实时时钟功能,每秒显示实时时钟;2. 编程实现实时时钟告警功能。

5.6.3 预备知识1. 了解ADT集成开发环境的基本功能;2. 学习S3C24X0的实时时钟模块的使用。

5.6.4 实验设备1. 硬件:JXARM9-2440教学实验箱、PC机;2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE开发环境。

5.6.5 基础知识1. 实时时钟在嵌入式系统中的作用在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日;即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。

2. S3C24X0的实时时钟单元下图为S3C24X0的实时时钟框图。

它具有以下特点:图5-12 S3C24X0的实时时钟框图1)时钟数据采用BCD编码;2)能够对闰年的年月日进行自动处理;3)具有告警功能,当系统处于关机状态时,能产生告警中断;4)具有独立的电源输入;5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。

3. S3C24X0的实时时钟寄存器1) 控制寄存器表5-16 控制寄存器寄存器地址读/写状态描述复位值RTCCON 0x57000040 R/W 实时时钟控制寄存器0x0RTCCON 位描述复位值CLKRST [3] 实时时钟计数器复位0-不复位 1-复位CNTSEL [2] BCD计数选择,将计数器设置为BCD模式0-选择BCD模式 1-保留CLKSEL [1] BCD时钟选择0-将输入时钟进行1/215分频 1-保留RTCEN [0] RTC读写使能0-禁止 1-使能2) 告警控制寄存器3) 实时时钟计数器表5-18 实时时钟计数器4) 告警时间寄存器包括年、月、日、时、分、秒。

它们都以BCD的格式表示,地址见下表:表5-19 告警时间寄存器5) 实时时钟寄存器包括年、月、日、时、分、秒。

它们都以BCD的格式表示,地址见下表:注意事项:1. 以上各寄存器都只能以字节模式进行读写操作;2. 当系统使用BIG-ENDIAN模式时,各寄存器对应的地址为会有所改变,具体值请参考S3C44B0X的数据手册。

4. 实验参考代码及说明:/* 包含文件 */#include "2410addr.h"#include "2410lib.h"#include "2410RTC.h"#include "interrupt.h"/* 表示日期、时间的数据结构 */typedef struct ST_DATE{short year; // 年char mon; // 月char day; // 日char week_day; // 星期char hour; // 时char min; // 分char sec; // 秒} st_date;/* 全局变量 */int led_index = 0;int ext0_count = 0;/* functions */void rtc_tick_isr(void);void rtc_int_isr(void);/***************************************************************************** // 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){rRTCCON = 0x01;p_date->year = rBCDYEAR ;p_date->mon = rBCDMON ;p_date->day = rBCDDAY ;p_date->week_day= rBCDDATE ;p_date->hour = rBCDHOUR ;p_date->min = rBCDMIN ;p_date->sec = rBCDSEC ;rRTCCON = 0x00;}/*****************************************************************************// Function name : rtc_tick_init// Description : 初始化S3C2410的TICK定时器// Return type : void// Argument : tick, 设置的TICK频率(时钟滴答的周期为 (1+tick)/128秒)*****************************************************************************/void rtc_tick_init( char tick ){Irq_Request(IRQ_TICK, rtc_tick_isr);rRTCCON = 0x0; //No reset[3], Merge BCD counters[2], BCD clock select XTAL[1], RTC Control disable[0]rTICNT = (tick&0x7f)|0x80; /*TICK 中断使能,周期为(1+tick)/128秒*/Irq_Enable(IRQ_TICK);}/*****************************************************************************// Function name : rtc_alarm_set// Description : 设置S3C2410的告警时间以及方式// Return type : void// Argument : p_date, 告警的时间// mode, 告警模式*****************************************************************************/void rtc_alarm_set(st_date* p_date, unsigned char mode){Irq_Request(IRQ_RTC, rtc_int_isr);rRTCCON = 0x01;rALMYEAR = p_date->year;rALMMON = p_date->mon;rALMDATE = p_date->day;rALMHOUR = p_date->hour;rALMMIN = p_date->min;rALMSEC = p_date->sec;rRTCALM = mode;rRTCCON = 0x00;Irq_Enable(IRQ_RTC);}/***************************************************************************** // Function name : Main// Description : JXARM9-2440 实时时钟实验主程序// 完成功能:// 时钟滴答:每秒钟刷新数码管显示// 设置当前日期、时间// 动态刷新当前日期、时间,通过串口打印出来// 时间告警功能:每分钟的第5秒告警,并进行跑马灯显示// Return type : void// Argument : void*****************************************************************************/ void Main(void){int old_index ;st_date m_date;/* 配置系统时钟 */ChangeClockDivider(2,1);U32 mpll_val = 0 ;mpll_val = (92<<12)|(1<<4)|(1);ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);/* 中断初始化 */Isr_Init();/* 初始化串口 */Uart_Init(0,115200);Uart_Select(0);/* 打印提示信息 */Uart_Printf("\n---实时时钟测试程序---\n");Uart_Printf("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200, 8, N, 1)\n");Uart_Printf("\n实时时钟测试开始\n");/* 采用BCD编码,如2004年需要设置的值为0x2004 */m_date.year = 0x2000+0x04 ;m_date.mon = 0x03 ;m_date.day = 0x02 ;m_date.week_day = 0x02 ;m_date.hour = 0x15 ;m_date.min = 0x40 ;m_date.sec = 0x00 ;/* 修改当前日期和时间 */rtc_set_date(&m_date);m_date.sec = 0x05 ;/* 设置告警的时间及方式,0x41表示使能RTC告警,以及使能秒时钟告警 */rtc_alarm_set(&m_date, 0x41);rtc_tick_init(127);old_index = led_index;Uart_Printf("\r\n\r\n");while(1){if(old_index != led_index) /* 每隔一秒更新一次数据*/{rtc_get_date(&m_date);old_index = led_index;Uart_Printf( /* 时钟数据为BCD码格式,以16进制显示 */"\b\b\b\b\b\b\b\b%02x:%02x:%02x", m_date.hour, m_date.min,m_date.sec);}};}/***************************************************************************** // Function name : rtc_tick_isr// Description : TICK中断处理程序,程序中设置每秒钟引发一次中断// Return type : int// Argument : void*****************************************************************************/ void rtc_tick_isr(void){Irq_Clear(IRQ_TICK); /* 清除TICK中断 */led_index++;}/***************************************************************************** // Function name : rtc_int_isr// Description : rtc中断处理程序,程序中设置每分钟的第5秒引发该中断// Return type : int// Argument : void*****************************************************************************/ void rtc_int_isr(void){Irq_Clear(IRQ_RTC); /*清除RTC中断*/ext0_count++;Uart_Printf("\r\nAlarm\r\n ");}本实验测试S3C24X0的实时时钟功能,包括:1) 时钟滴答功能测试,通过LED显示TIME TICK;2) 时间告警功能测试。

相关文档
最新文档