S3C2440 實(shí)時(shí)時(shí)鐘RTC
作發(fā)送8位二-十進(jìn)制交換碼(BCD)值數(shù)據(jù)給CPU。這些數(shù)據(jù)包括年、月、日、星期、時(shí)、分和秒的時(shí)間信息。
RTC 單元工作在外部32.768kHz晶振并且可以執(zhí)行鬧鐘功能。
RTC操作比較簡(jiǎn)單,寄存器的設(shè)置在數(shù)據(jù)手冊(cè)上寫的很詳細(xì),就不寫了,貼一個(gè)RTC代碼,該程序參考了天翔的RTC程序代碼,主要是他寫的比較好,都模塊化了,我修改了他的代碼,有鬧鐘(利用蜂鳴器),在TQ2440 板子上能運(yùn)行,程序功能:串口每秒顯示一次時(shí)間并且LED1閃一次,在鬧鐘設(shè)置中,秒為20時(shí),顯示鬧鐘時(shí)間并蜂鳴器發(fā)聲幾秒鐘。
- #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//定義一個(gè)表示日期時(shí)間的結(jié)構(gòu)體
- {U16year;
- U8month;
- U8day;
- U8week_day;
- U8hour;
- U8minute;
- U8second;
- }date;
- dateC_date;
- char*week_num[7]={"SUN","MON","TUES","WED","THURS","FRI","SAT"};//定義一個(gè)指針數(shù)組
- voidBeep_Freq_Set(U32freq)
- {
- rGPBCON&=~3;
- rGPBCON|=2;//設(shè)置GPB0為OUT0
- rGPBUP=0x0;//使能上拉
- rTCFG0&=~0xff;
- rTCFG0|=15;//預(yù)分頻值為15
- rTCFG1&=~0x0f;
- rTCFG1|=0x02;//分頻值為8
- rTCNTB0=(PCLK>>7)/freq;//設(shè)定定時(shí)器0計(jì)數(shù)緩沖器的值
- rTCMPB0=rTCNTB0>>1;//定時(shí)器0比較緩沖器的值,PWM輸出占空比50%
- rTCON&=~0x1f;
- rTCON|=0xb;//自動(dòng)重載,關(guān)閉變相,手動(dòng)更新,開啟定時(shí)器0
- rTCON&=~2;//清除手動(dòng)更新位
- }
- voidBeep_Stop(void)
- {
- rGPBCON&=~3;//setGPB0asoutput
- rGPBCON|=1;
- rGPBDAT&=~1;//輸出低電平
- }
- voiddelay(intx)
- {
- inti,j;
- for(i=0;i
- for(j=0;j<1000000;j++);
- }
- /********************************
- *
- *設(shè)置實(shí)時(shí)時(shí)鐘日期、時(shí)間
- *
- *********************************/
- voidRTC_setdate(date*p_date)
- {
- rRTCCON=0x01;//RTC讀寫使能,BCD時(shí)鐘、計(jì)數(shù)器、無復(fù)位
- rBCDYEAR=p_date->year;
- rBCDMON=p_date->month;
- rBCDDATE=p_date->day;
- rBCDDAY=p_date->week_day;//設(shè)置日期時(shí)間
- rBCDHOUR=p_date->hour;
- rBCDMIN=p_date->minute;
- rBCDSEC=p_date->second;
- rRTCCON=0x00;//RTC讀寫禁止,BCD時(shí)鐘、計(jì)數(shù)器、無復(fù)位
- }
- /********************************
- *
- *讀取實(shí)時(shí)時(shí)鐘日期、時(shí)間
- *
- *********************************/
- voidRTC_getdate(date*p_date)
- {
- rRTCCON=0x01;//RTC讀寫使能,BCD時(shí)鐘、計(jì)數(shù)器、無復(fù)位
- p_date->year=rBCDYEAR+0x2000;
- p_date->month=rBCDMON;
- p_date->day=rBCDDATE;
- p_date->week_day=rBCDDAY;//讀取日期時(shí)間
- p_date->hour=rBCDHOUR;
- p_date->minute=rBCDMIN;
- p_date->second=rBCDSEC;
- rRTCCON=0x00;//RTC讀寫禁止,BCD時(shí)鐘、計(jì)數(shù)器、無復(fù)位
- }
- /********************************
- *
- *TICK中斷初始化
- *
- *********************************/
- voidRTC_tickIRQ_Init(U8tick)
- {
- ClearPending(BIT_TICK);//清除標(biāo)志位
- EnableIrq(BIT_TICK);//使能中斷源
- pISR_TICK=(unsigned)RTC_tickHandler;//中斷函數(shù)入口地址
- rRTCCON=0x00;
- rTICNT=(tick&0x7f)|0x80;//使能中斷
- }
- /********************************
- *
- *設(shè)置鬧鐘日期、時(shí)間及其鬧鐘喚醒模式
- *
- *********************************/
- 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);//清除標(biāo)志位
- EnableIrq(BIT_RTC);//openRTCalarmINTERRUPT
- pISR_RTC=(unsigned)RTC_alarmHandler;
- }
- voidMain(void)
- {
- SelectFclk(2);//設(shè)置系統(tǒng)時(shí)鐘400M
- ChangeClockDivider(2,1);//設(shè)置分頻1:4:8
- CalcBusClk();//計(jì)算總線頻率
- 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));//對(duì)GPBCON[10:17]清零
- rGPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));//設(shè)置GPB5~8為輸出
- rGPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));//設(shè)置GPB5~8的上拉功能
- rGPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8);//關(guān)閉LED
- Beep_Stop();//蜂鳴器停止發(fā)聲,蜂鳴器用作鬧鐘聲
- C_date.year=0x12;
- C_date.month=0x05;
- C_date.day=0x09;
- C_date.week_day=0x03;//設(shè)置當(dāng)前日期時(shí)間
- 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鬧鐘,以及使能秒時(shí)鐘鬧鐘
- RTC_tickIRQ_Init(127);//設(shè)置1秒鐘tick一次
- Uart_Printf("n---實(shí)時(shí)時(shí)鐘測(cè)試程序---n");
- while(Uart_GetKey()!=ESC_KEY)
- {
- LED1_OFF;
- RTC_getdate(&C_date);
- if(alarmflag)
- {
- alarmflag=0;
- Uart_Printf("nRTCALARM%02x:%02x:%02xn",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:%02xn",C_date.year,C_date.month,C_date.day,week_num[C_date.week_day],C_date.hour,C_date.minute,C_date.second);
- }
- /********************************
- *
- *TICK中斷
- *
- *********************************/
- void__irqRTC_alarmHandler(void)
- {
- alarmflag=1;
- ClearPending(BIT_RTC);
- }
評(píng)論