RTC.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:8k
源码类别:

uCOS

开发平台:

C/C++

  1. //====================================================================
  2. // File Name : RTC.c
  3. // Function  : S3C2440 RTC Head file
  4. // Program   : 
  5. // Date      : May 06, 2002
  6. // Version   : 0.1
  7. // History
  8. //   2410 v0.0 : Programming start (March 11, 2002) -> SOP
  9. //   2440 v0.1 : edited by junon
  10. //====================================================================
  11. #include "2440addr.h"
  12. #include "2440lib.h"
  13. #include "RTC.h"
  14. char *day[8] = {" ","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
  15. volatile int isRtcInt, isInit = 2;              //April 01, 2002 SOP
  16. volatile unsigned int sec_tick;
  17. void * func_rtc_test[][2]=
  18. {
  19. //     "0123456789012345" max 15磊 肺茄沥窍咯 comment窍技夸.
  20. //RTC
  21. (void *)Test_Rtc_Alarm,  "RTC Alarm      ",
  22. (void *)Display_Rtc, "RTC Display    ",   
  23. (void *)Test_Rtc_Tick, "RTC Tick       ",
  24. 0,0
  25. };
  26. void Rtc_Test(void)
  27. {
  28. int i;
  29. Uart_Printf("n======  RTC Test program start ======n");
  30. while(1)
  31. {
  32. i=0;
  33. Uart_Printf("nn");
  34. while(1)
  35. {   //display menu
  36. Uart_Printf("%2d:%s",i,func_rtc_test[i][1]);
  37. i++;
  38. if((int)(func_rtc_test[i][0])==0)
  39. {
  40. Uart_Printf("n");
  41. break;
  42. }
  43. if((i%4)==0)
  44. Uart_Printf("n");
  45. }
  46. Uart_Printf("nPress Enter key to exit : ");
  47. i = Uart_GetIntNum();
  48. if(i==-1) break; // return.
  49. if(i>=0 && (i<((sizeof(func_rtc_test)-1)/8)) ) // select and execute...
  50. ( (void (*)(void)) (func_rtc_test[i][0]) )();
  51. }
  52. Uart_Printf("n====== RTC Test program end ======n");
  53. }
  54. //=======================================
  55. //Period = (n + 1) / 128 second
  56. //   n : Tick time count value (1~127)
  57. //=======================================
  58. //********************[ Display_Rtc ]*********************************
  59. void Display_Rtc(void)
  60. {
  61. //    int year,tmp;
  62.     int year,tmp,key;                   
  63.     int month,date,weekday,hour,min,sec;
  64.     Uart_Printf("[ Display RTC Test ]n");
  65.     Uart_Printf("0. RTC Initialize     1. RTC Time Setting    2. Only RTC Displaynn");
  66.     Uart_Printf("Selet : ");
  67.     key = Uart_GetIntNum();
  68.     Uart_Printf("nn");
  69.     
  70.     isInit = key;
  71.     if(isInit == 0)
  72.     {
  73.         Rtc_Init();
  74.         isInit = 2;
  75.     }
  76.     
  77.     else if(isInit == 1)
  78.     {
  79.         Rtc_TimeSet();
  80.         isInit = 2;        
  81.     }
  82.     rRTCCON = 0x01;    //No reset, Merge BCD counters, 1/32768, RTC Control enable
  83. //  Uart_Printf("This test should be excuted once RTC test(Alarm) for RTC initializationn");
  84.     Uart_Printf("Press any key to exit.nn");
  85.     while(!Uart_GetKey())
  86.     {    
  87.         while(1)
  88.         {
  89. if(rBCDYEAR == 0x99) 
  90. year = 0x1999;
  91. else 
  92. year = 0x2000 + rBCDYEAR;
  93. month  = rBCDMON;
  94. weekday = rBCDDAY;
  95. date = rBCDDATE;
  96. hour = rBCDHOUR;
  97. min  = rBCDMIN;
  98. sec  = rBCDSEC;
  99. if(sec!=tmp)
  100. {
  101. tmp = sec;
  102. break;
  103. }
  104. }   
  105. Uart_Printf("%2x : %2x : %2x %10s,  %2x/%2x/%4xn",hour,min,sec,day[weekday],month,date,year);
  106. //        Uart_Printf("%2x : %2x : %2x  %9s,  %2x/%2x/%4x     rBCDDATE = %x, weekday= %xn",hour,min,sec,day[weekday],month,date,year,rBCDDATE,weekday);        
  107.     }
  108.     rRTCCON = 0x0; //No reset, Merge BCD counters, 1/32768, RTC Control disable(for power consumption)
  109. }
  110. //************************[ Test_Rtc_Alarm ]******************************
  111. void Test_Rtc_Alarm(void)  
  112. {
  113.     Uart_Printf("[ RTC Alarm Test for S3C2440 ]n");
  114.     Rtc_Init();
  115.     rRTCCON  = 0x01;                    //No reset, Merge BCD counters, 1/32768, RTC Control enable
  116.     rALMYEAR = TESTYEAR2 ;
  117.     rALMMON  = TESTMONTH2;
  118.     rALMDATE = TESTDATE2  ;
  119.     rALMHOUR = TESTHOUR2 ;
  120.     rALMMIN  = TESTMIN2  ;
  121.     rALMSEC  = TESTSEC2 + 9; 
  122. Uart_Printf("After 9 sec, alarm interrupt will occur.. n");
  123.     isRtcInt = 0;
  124.     pISR_RTC = (unsigned int)Rtc_Int;
  125.     rRTCALM  = 0x7f;                    //Global,Year,Month,Day,Hour,Minute,Second alarm enable
  126.     rRTCCON  = 0x0;                     //No reset, Merge BCD counters, 1/32768, RTC Control disable
  127.     rINTMSK  = ~(BIT_RTC);
  128.     while(isRtcInt==0);
  129.     
  130.     rINTMSK = BIT_ALLMSK;
  131. //  rRTCCON = 0x0;  //RTC  Control disable(for power consumption), 1/32768, Normal(merge), No reset
  132. }
  133. //************************[ Rtc_Init ]*********************************
  134. void Rtc_Init(void)
  135. {
  136.     rRTCCON  = rRTCCON  & ~(0xf)  | 0x1;            //No reset, Merge BCD counters, 1/32768, RTC Control enable
  137.     
  138.     rBCDYEAR = rBCDYEAR & ~(0xff) | TESTYEAR;
  139.     rBCDMON  = rBCDMON  & ~(0x1f) | TESTMONTH;
  140.     rBCDDATE = rBCDDATE & ~(0x3f) | TESTDATE;         
  141.     rBCDDAY  = rBCDDAY  & ~(0x7)  | TESTDAY;       //SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
  142.     rBCDHOUR = rBCDHOUR & ~(0x3f) | TESTHOUR;
  143.     rBCDMIN  = rBCDMIN  & ~(0x7f) | TESTMIN;
  144.     rBCDSEC  = rBCDSEC  & ~(0x7f) | TESTSEC;
  145.     
  146.     rRTCCON  = 0x0;             //No reset, Merge BCD counters, 1/32768, RTC Control disable    
  147. }
  148. //************************[ Rtc_TimeSet ]*********************************
  149. void Rtc_TimeSet(void)
  150. {
  151.     int syear,smonth,sdate,shour,smin,ssec;
  152.     int sday;
  153.     Uart_Printf("[ RTC Time Setting ]n");
  154.     Rtc_Init();         //RTC Initialize
  155.     Uart_Printf("RTC Time Initialized ...n");
  156.     
  157.     Uart_Printf("Year (Two digit the latest)[0~99] : ");
  158.     syear = Uart_GetIntNum();
  159.     
  160.     Uart_Printf("Month                      [1~12] : ");
  161.     smonth = Uart_GetIntNum();
  162.     
  163.     Uart_Printf("Date                       [1~31] : ");
  164.     sdate = Uart_GetIntNum();
  165.           
  166.     Uart_Printf("n1:Sunday  2:Monday  3:Thesday  4:Wednesday  5:Thursday  6:Friday  7:Saturdayn");
  167.     Uart_Printf("Day of the week                   : ");
  168.     sday = Uart_GetIntNum();
  169.     
  170.     Uart_Printf("Hour                       [0~23] : ");
  171.     shour = Uart_GetIntNum();
  172.     
  173.     Uart_Printf("Minute                     [0~59] : ");
  174.     smin = Uart_GetIntNum();
  175.     
  176.     Uart_Printf("Second                     [0~59] : ");
  177.     ssec = Uart_GetIntNum();
  178.     
  179.     rRTCCON  = rRTCCON  & ~(0xf)  | 0x1;            //No reset, Merge BCD counters, 1/32768, RTC Control enable
  180.     
  181.     rBCDYEAR = ((syear/10)<<4)+(syear%10);
  182.     rBCDMON  = ((smonth/10)<<4)+(smonth%10);
  183.     rBCDDAY  = sday;           //SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
  184.     rBCDDATE = ((sdate/10)<<4)+(sdate%10);
  185.     rBCDHOUR = ((shour/10)<<4)+(shour%10);
  186.     rBCDMIN  = ((smin/10)<<4)+(smin%10);
  187.     rBCDSEC  = ((ssec/10)<<4)+(ssec%10);
  188.     
  189. Uart_Printf("%2d : %2d : %2d %10s,  %2d/%2d/%4dn",shour,smin,ssec,day[sday],smonth,sdate,syear);
  190. Uart_Printf("%2x : %2x : %2x %10s,  %2x/%2x/%4xn"
  191. ,rBCDHOUR,rBCDMIN,rBCDSEC,day[rBCDDAY],rBCDMON,rBCDDATE,rBCDYEAR);
  192.     rRTCCON  = 0x0;    //No reset, Merge BCD counters, 1/32768, RTC Control disable    
  193. }
  194. //************************[ Test_Rtc_Tick ]****************************
  195. void Test_Rtc_Tick(void)
  196. {
  197.     Uart_Printf("[ RTC Tick interrupt(1 sec) test for S3C2440 ]n");
  198.     Uart_Printf("Press any key to exit.n"); 
  199.     Uart_Printf("n");  
  200.     Uart_Printf("n");      
  201.     Uart_Printf("   ");    
  202.         
  203.     pISR_TICK = (unsigned)Rtc_Tick;
  204.     sec_tick  = 1;
  205.     rINTMSK   = ~(BIT_TICK); 
  206.     rRTCCON   = 0x0;            //No reset[3], Merge BCD counters[2], BCD clock select XTAL[1], RTC Control disable[0]
  207.     rTICNT    = (1<<7) + 127;   //Tick time interrupt enable, Tick time count value 127
  208.                                 //Period = (n + 1) / 128 second    n:Tick time count value(1~127)
  209.     Uart_Getch();
  210.     
  211.     rINTMSK   = BIT_ALLMSK;
  212.     rRTCCON   = 0x0;            //No reset[3], Merge BCD counters[2], BCD clock select XTAL[1], RTC Control disable[0]
  213. }
  214. //-----------------------------------------------------------------------
  215. void  EINT0_int(void)
  216. {
  217.     rSRCPND = BIT_EINT0;   
  218.     rINTPND = BIT_EINT0;
  219.     rINTPND;
  220.     rRTCRST = (1<<3) | 3;   //Round second reset enable, over than 30 sec
  221. }
  222. //-----------------------------------------------------------------------
  223. void  Rtc_Int(void)
  224. {
  225.     rSRCPND = BIT_RTC;   
  226.     rINTPND = BIT_RTC;
  227.     rINTPND;
  228.     Uart_Printf("RTC Alarm Interrupt O.K.n");
  229.     isRtcInt = 1;  
  230. }
  231. //---------------------------------------------------------------------
  232. void  Rtc_Tick(void)
  233. {
  234.     rSRCPND = BIT_TICK;   
  235.     rINTPND = BIT_TICK;
  236.     rINTPND;
  237.     Uart_Printf("bbbbbbb%03d sec",sec_tick++);
  238. }