实时时钟(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—实时时钟测验程序—\n”);
- while(Uart_GetKey()!=ESC_KEY)
- {
- LED1_OFF;
- RTC_getdate(&C_date);
- if(alarmflag)
- {
- alarmflag=0;
- Uart_Printf(“\nRTCALARM%02x:%02x:%02x\n”,C_date.hour,C_date.minute,C_date.second);
- Beep_Freq_Set(1000);
- delay(5);
- Beep_Stop();
- }
- }
- }
- /********************************
- *
- *TICK中止
- *
- *********************************/
- void__irqRTC_tickHandler(void)
- {
- ClearPending(BIT_TICK);
- LED1_ON;//改写LED1
- Delay(500);
- RTC_getdate(&C_date);
- Uart_Printf(“RTCTIME:%04x-%02x-%02x%s%02x:%02x:%02x\n”,C_date.year,C_date.month,C_date.day,week_num[C_date.week_day],C_date.hour,C_date.minute,C_date.second);
- }
- /********************************
- *
- *T%&&&&&%K中止
- *
- *********************************/
- void__irqRTC_alarmHandler(void)
- {
- alarmflag=1;
- ClearPending(BIT_RTC);
- }