S3C2440 实时时钟RTC
时间:11-21
来源:互联网
点击:
实时时钟(RTC)单元可以在当系统电源关闭后通过备用电池工作。RTC可以通过使用STRB/LDRB ARM操
作发送8位二-十进制交换码(BCD)值数据给CPU。这些数据包括年、月、日、星期、时、分和秒的时间信息。
RTC 单元工作在外部32.768kHz晶振并且可以执行闹钟功能。
RTC操作比较简单,寄存器的设置在数据手册上写的很详细,就不写了,贴一个RTC代码,该程序参考了天翔的RTC程序代码,主要是他写的比较好,都模块化了,我修改了他的代码,有闹钟(利用蜂鸣器),在TQ2440 板子上能运行,程序功能:串口每秒显示一次时间并且LED1闪一次,在闹钟设置中,秒为20时,显示闹钟时间并蜂鸣器发声几秒钟。
- #include"2440addr.h"
- #include"Option.h"
- #include"2440lib.h"
- #include"def.h"
- #defineLED1_ON(rGPBDAT&=~(1<5))
- #defineLED1_OFF(rGPBDAT|=(1<5))
- void__irqRTC_tickHandler(void);
- void__irqRTC_alarmHandler(void);
- U8alarmflag=0;
- typedefstructDate//定义一个表示日期时间的结构体
- {U16year;
- U8month;
- U8day;
- U8week_day;
- U8hour;
- U8minute;
- U8second;
- }date;
- dateC_date;
- char*week_num[7]={"SUN","MON","TUES","WED","THURS","FRI","SAT"};//定义一个指针数组
- voidBeep_Freq_Set(U32freq)
- {
- rGPBCON&=~3;
- rGPBCON|=2;//设置GPB0为OUT0
- rGPBUP=0x0;//使能上拉
- rTCFG0&=~0xff;
- rTCFG0|=15;//预分频值为15
- rTCFG1&=~0x0f;
- rTCFG1|=0x02;//分频值为8
- rTCNTB0=(PCLK>>7)/freq;//设定定时器0计数缓冲器的值
- rTCMPB0=rTCNTB0>>1;//定时器0比较缓冲器的值,PWM输出占空比50%
- rTCON&=~0x1f;
- rTCON|=0xb;//自动重载,关闭变相,手动更新,开启定时器0
- rTCON&=~2;//清除手动更新位
- }
- voidBeep_Stop(void)
- {
- rGPBCON&=~3;//setGPB0asoutput
- rGPBCON|=1;
- rGPBDAT&=~1;//输出低电平
- }
- voiddelay(intx)
- {
- inti,j;
- for(i=0;i
- for(j=0;j<1000000;j++);
- }
- /********************************
- *
- *设置实时时钟日期、时间
- *
- *********************************/
- voidRTC_setdate(date*p_date)
- {
- rRTCCON=0x01;//RTC读写使能,BCD时钟、计数器、无复位
- rBCDYEAR=p_date->year;
- rBCDMON=p_date->month;
- rBCDDATE=p_date->day;
- rBCDDAY=p_date->week_day;//设置日期时间
- rBCDHOUR=p_date->hour;
- rBCDMIN=p_date->minute;
- rBCDSEC=p_date->second;
- rRTCCON=0x00;//RTC读写禁止,BCD时钟、计数器、无复位
- }
- /********************************
- *
- *读取实时时钟日期、时间
- *
- *********************************/
- voidRTC_getdate(date*p_date)
- {
- rRTCCON=0x01;//RTC读写使能,BCD时钟、计数器、无复位
- p_date->year=rBCDYEAR+0x2000;
- p_date->month=rBCDMON;
- p_date->day=rBCDDATE;
- p_date->week_day=rBCDDAY;//读取日期时间
- p_date->hour=rBCDHOUR;
- p_date->minute=rBCDMIN;
- p_date->second=rBCDSEC;
- rRTCCON=0x00;//RTC读写禁止,BCD时钟、计数器、无复位
- }
- /********************************
- *
- *TICK中断初始化
- *
- *********************************/
- voidRTC_tickIRQ_Init(U8tick)
- {
- ClearPending(BIT_TICK);//清除标志位
- EnableIrq(BIT_TICK);//使能中断源
- pISR_TICK=(unsigned)RTC_tickHandler;//中断函数入口地址
- rRTCCON=0x00;
- rTICNT=(tick&0x7f)|0x80;//使能中断
- }
- /********************************
- *
- *设置闹钟日期、时间及其闹钟唤醒模式
- *
- *********************************/
- voidRTC_alarm_setdate(date*p_date,U8mode)
- {
- rRTCCON=0x01;
- rALMYEAR=p_date->year;
- rALMMON=p_date->month;
- rALMDATE=p_date->day;
- rALMHOUR=p_date->hour;
- rALMMIN=p_date->minute;
- rALMSEC=p_date->second;
- rRTCALM=mode;//RTC闹钟控制寄存器
- rRTCCON=0x00;
- ClearPending(BIT_RTC);//清除标志位
- EnableIrq(BIT_RTC);//openRTCalarmINTERRUPT
- pISR_RTC=(unsigned)RTC_alarmHandler;
- }
- voidMain(void)
- {
- SelectFclk(2);//设置系统时钟400M
- ChangeClockDivider(2,1);//设置分频1:4:8
- CalcBusClk();//计算总线频率
- rGPHCON&=~((3<4)|(3<6));
- rGPHCON|=(2<4)|(2<6);//GPH2--TXD[0];GPH3--RXD[0]
- rGPHUP=0x00;//使能上拉功能
- Uart_Init(0,115200);
- Uart_Select(0);
- rGPBCON&=~((3<10)|(3<12)|(3<14)|(3<16));//对GPBCON[10:17]清零
- rGPBCON|=((1<10)|(1<12)|(1<14)|(1<16));//设置GPB5~8为输出
- rGPBUP&=~((1<5)|(1<6)|(1<7)|(1<8));//设置GPB5~8的上拉功能
- rGPBDAT|=(1<5)|(1<6)|(1<7)|(1<8);//关闭LED
- Beep_Stop();//蜂鸣器停止发声,蜂鸣器用作闹钟声
- C_date.year=0x12;
- C_date.month=0x05;
- C_date.day=0x09;
- C_date.week_day=0x03;//设置当前日期时间
- C_date.hour=0x12;
- C_date.minute=0x00;
- C_date.second=0x10;
- RTC_setdate(&C_date);
- C_date.second=0x20;
- RTC_alarm_setdate(&C_date,0x41);//0x41表示使能RTC闹钟,以及使能秒时钟闹钟
- RTC_tickIRQ_Init(127);//设置1秒钟tick一次
- Uart_Printf("\n---实
S3C2440实时时钟RT 相关文章:
- 五 ARM9(S3C2440)的实时时钟(RTC)-理论知识及程序实例讲解(11-27)
- s3c2440实时时钟的应用(11-19)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)