微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440 实时时钟RTC

S3C2440 实时时钟RTC

时间:11-21 来源:互联网 点击:
实时时钟RTC)单元可以在当系统电源关闭后通过备用电池工作。RTC可以通过使用STRB/LDRB ARM操

作发送8位二-十进制交换码(BCD)值数据给CPU。这些数据包括年、月、日、星期、时、分和秒的时间信息。
RTC 单元工作在外部32.768kHz晶振并且可以执行闹钟功能。

RTC操作比较简单,寄存器的设置在数据手册上写的很详细,就不写了,贴一个RTC代码,该程序参考了天翔的RTC程序代码,主要是他写的比较好,都模块化了,我修改了他的代码,有闹钟(利用蜂鸣器),在TQ2440 板子上能运行,程序功能:串口每秒显示一次时间并且LED1闪一次,在闹钟设置中,秒为20时,显示闹钟时间并蜂鸣器发声几秒钟。

  1. #include"2440addr.h"
  2. #include"Option.h"
  3. #include"2440lib.h"
  4. #include"def.h"
  5. #defineLED1_ON(rGPBDAT&=~(1<5))
  6. #defineLED1_OFF(rGPBDAT|=(1<5))
  7. void__irqRTC_tickHandler(void);
  8. void__irqRTC_alarmHandler(void);
  9. U8alarmflag=0;
  10. typedefstructDate//定义一个表示日期时间的结构体
  11. {U16year;
  12. U8month;
  13. U8day;
  14. U8week_day;
  15. U8hour;
  16. U8minute;
  17. U8second;
  18. }date;
  19. dateC_date;
  20. char*week_num[7]={"SUN","MON","TUES","WED","THURS","FRI","SAT"};//定义一个指针数组
  21. voidBeep_Freq_Set(U32freq)
  22. {
  23. rGPBCON&=~3;
  24. rGPBCON|=2;//设置GPB0为OUT0
  25. rGPBUP=0x0;//使能上拉
  26. rTCFG0&=~0xff;
  27. rTCFG0|=15;//预分频值为15
  28. rTCFG1&=~0x0f;
  29. rTCFG1|=0x02;//分频值为8
  30. rTCNTB0=(PCLK>>7)/freq;//设定定时器0计数缓冲器的值
  31. rTCMPB0=rTCNTB0>>1;//定时器0比较缓冲器的值,PWM输出占空比50%
  32. rTCON&=~0x1f;
  33. rTCON|=0xb;//自动重载,关闭变相,手动更新,开启定时器0
  34. rTCON&=~2;//清除手动更新位
  35. }
  36. voidBeep_Stop(void)
  37. {
  38. rGPBCON&=~3;//setGPB0asoutput
  39. rGPBCON|=1;
  40. rGPBDAT&=~1;//输出低电平
  41. }
  42. voiddelay(intx)
  43. {
  44. inti,j;
  45. for(i=0;i
  46. for(j=0;j<1000000;j++);
  47. }
  48. /********************************
  49. *
  50. *设置实时时钟日期、时间
  51. *
  52. *********************************/
  53. voidRTC_setdate(date*p_date)
  54. {
  55. rRTCCON=0x01;//RTC读写使能,BCD时钟、计数器、无复位
  56. rBCDYEAR=p_date->year;
  57. rBCDMON=p_date->month;
  58. rBCDDATE=p_date->day;
  59. rBCDDAY=p_date->week_day;//设置日期时间
  60. rBCDHOUR=p_date->hour;
  61. rBCDMIN=p_date->minute;
  62. rBCDSEC=p_date->second;
  63. rRTCCON=0x00;//RTC读写禁止,BCD时钟、计数器、无复位
  64. }
  65. /********************************
  66. *
  67. *读取实时时钟日期、时间
  68. *
  69. *********************************/
  70. voidRTC_getdate(date*p_date)
  71. {
  72. rRTCCON=0x01;//RTC读写使能,BCD时钟、计数器、无复位
  73. p_date->year=rBCDYEAR+0x2000;
  74. p_date->month=rBCDMON;
  75. p_date->day=rBCDDATE;
  76. p_date->week_day=rBCDDAY;//读取日期时间
  77. p_date->hour=rBCDHOUR;
  78. p_date->minute=rBCDMIN;
  79. p_date->second=rBCDSEC;
  80. rRTCCON=0x00;//RTC读写禁止,BCD时钟、计数器、无复位
  81. }
  82. /********************************
  83. *
  84. *TICK中断初始化
  85. *
  86. *********************************/
  87. voidRTC_tickIRQ_Init(U8tick)
  88. {
  89. ClearPending(BIT_TICK);//清除标志位
  90. EnableIrq(BIT_TICK);//使能中断源
  91. pISR_TICK=(unsigned)RTC_tickHandler;//中断函数入口地址
  92. rRTCCON=0x00;
  93. rTICNT=(tick&0x7f)|0x80;//使能中断
  94. }
  95. /********************************
  96. *
  97. *设置闹钟日期、时间及其闹钟唤醒模式
  98. *
  99. *********************************/
  100. voidRTC_alarm_setdate(date*p_date,U8mode)
  101. {
  102. rRTCCON=0x01;
  103. rALMYEAR=p_date->year;
  104. rALMMON=p_date->month;
  105. rALMDATE=p_date->day;
  106. rALMHOUR=p_date->hour;
  107. rALMMIN=p_date->minute;
  108. rALMSEC=p_date->second;
  109. rRTCALM=mode;//RTC闹钟控制寄存器
  110. rRTCCON=0x00;
  111. ClearPending(BIT_RTC);//清除标志位
  112. EnableIrq(BIT_RTC);//openRTCalarmINTERRUPT
  113. pISR_RTC=(unsigned)RTC_alarmHandler;
  114. }
  115. voidMain(void)
  116. {
  117. SelectFclk(2);//设置系统时钟400M
  118. ChangeClockDivider(2,1);//设置分频1:4:8
  119. CalcBusClk();//计算总线频率
  120. rGPHCON&=~((3<4)|(3<6));
  121. rGPHCON|=(2<4)|(2<6);//GPH2--TXD[0];GPH3--RXD[0]
  122. rGPHUP=0x00;//使能上拉功能
  123. Uart_Init(0,115200);
  124. Uart_Select(0);
  125. rGPBCON&=~((3<10)|(3<12)|(3<14)|(3<16));//对GPBCON[10:17]清零
  126. rGPBCON|=((1<10)|(1<12)|(1<14)|(1<16));//设置GPB5~8为输出
  127. rGPBUP&=~((1<5)|(1<6)|(1<7)|(1<8));//设置GPB5~8的上拉功能
  128. rGPBDAT|=(1<5)|(1<6)|(1<7)|(1<8);//关闭LED
  129. Beep_Stop();//蜂鸣器停止发声,蜂鸣器用作闹钟声
  130. C_date.year=0x12;
  131. C_date.month=0x05;
  132. C_date.day=0x09;
  133. C_date.week_day=0x03;//设置当前日期时间
  134. C_date.hour=0x12;
  135. C_date.minute=0x00;
  136. C_date.second=0x10;
  137. RTC_setdate(&C_date);
  138. C_date.second=0x20;
  139. RTC_alarm_setdate(&C_date,0x41);//0x41表示使能RTC闹钟,以及使能秒时钟闹钟
  140. RTC_tickIRQ_Init(127);//设置1秒钟tick一次
  141. Uart_Printf("\n---实

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top