×
单片机 > 单片机程序设计 > 详情

S3C6410裸机RTC实时时钟

发布时间:2020-05-18 发布时间:
|

相对于STM32,6410的RTC是相当的简单.


  1. /************************************************************************************************************* 

  2.  * 文件名: RTC.c 

  3.  * 功能:      S3C6410 RTC底层驱动函数 

  4.  * 作者:      cp1300@139.com 

  5.  * 创建时间:    2012年3月28日21:52 

  6.  * 最后修改时间:2012年3月28日 

  7.  * 详细:      RTC相关底层驱动函数 

  8. *************************************************************************************************************/  

  9. #include "system.h"  

  10. #include "rtc.h"  

  11.   

  12. Time_TypeDef Timer;//存放全局时间  

  13.   

  14. //内部静态变量声明  

  15. static bool uAutoTimeUpdate = FALSE;    //标记是否自动由中断更新时间  

  16. static bool uSecEnd = FALSE;            //秒结束标志,结束后就可以更新时间了  

  17.   

  18.   

  19. /************************************************************************************************************************* 

  20. *函数        :    void RTC_Install(u8 ENABLE) 

  21. *功能        :    RTC设置使能与失能 

  22. *参数        :    Enable:使能时钟设置,Disable:使能时钟设置 

  23. *返回        :    无 

  24. *依赖     :   底层宏定义 

  25. *作者        :    cp1300@139.com 

  26. *时间     :   20120328 

  27. *最后修改时间:    20120329 

  28. *说明     :   平时不设置时应该设置为Disable 

  29. *************************************************************************************************************************/  

  30. void RTC_Install(u8 ENABLE)  

  31. {  

  32.     if(ENABLE)  

  33.         RTC->CON |=  BIT0;//RTC时钟设置使能  

  34.     else  

  35.         RTC->CON &=  ~BIT0;//RTC时钟设置失能  

  36. }  

  37.   

  38. /************************************************************************************************************************* 

  39. *函数        :    u8 BCD_to_DEC(u8 BCD_Code) 

  40. *功能        :    BCD码转DEC码 

  41. *参数        :    BCD码 

  42. *返回        :    DEC码 

  43. *依赖        :    无 

  44. *作者        :    cp1300@139.com 

  45. *时间        :    20120329 

  46. *最后修改时间:    20120329 

  47. *说明        :    用于将BCD码时间转换为十进制时间,长度为8bit 

  48. *************************************************************************************************************************/  

  49. u8 BCD_to_DEC(u8 BCD_Code)  

  50. {  

  51.     return ((BCD_Code >> 4) * 10 + (BCD_Code & 0x0f));  

  52. }  

  53.   

  54.   

  55. /************************************************************************************************************************* 

  56. *函数        :    __inline u8 GetSec(void) 

  57. *功能        :    获取秒 

  58. *参数        :    无 

  59. *返回        :    秒 

  60. *依赖        :    无 

  61. *作者        :    cp1300@139.com 

  62. *时间        :    20120329 

  63. *最后修改时间:    20120329 

  64. *说明        :    将BCD秒获取后转化为DEC秒 

  65. *************************************************************************************************************************/  

  66. __inline u8 GetSec(void)  

  67. {  

  68.     return (BCD_to_DEC(RTC->BCDSEC));//获取秒  

  69. }  

  70.   

  71. /************************************************************************************************************************* 

  72. *函数        :    __inline u8 GetMin(void) 

  73. *功能        :    获取分 

  74. *参数        :    无 

  75. *返回        :    分 

  76. *依赖        :    无 

  77. *作者        :    cp1300@139.com 

  78. *时间        :    20120329 

  79. *最后修改时间:    20120329 

  80. *说明        :    将BCD分获取后转化为DEC分 

  81. *************************************************************************************************************************/  

  82. __inline u8 GetMin(void)  

  83. {  

  84.     return (BCD_to_DEC(RTC->BCDMIN));//获取分  

  85. }  

  86.   

  87. /************************************************************************************************************************* 

  88. *函数        :    __inline u8 GetHour(void) 

  89. *功能        :    获取时 

  90. *参数        :    无 

  91. *返回        :    时 

  92. *依赖        :    无 

  93. *作者        :    cp1300@139.com 

  94. *时间        :    20120329 

  95. *最后修改时间:    20120329 

  96. *说明        :    将BCD时获取后转化为DEC时 

  97. *************************************************************************************************************************/  

  98. __inline u8 GetHour(void)  

  99. {  

  100.     return (BCD_to_DEC(RTC->BCDHOUR));//获取时  

  101. }  

  102.   

  103. /************************************************************************************************************************* 

  104. *函数        :    __inline u8 GetWeek(void) 

  105. *功能        :    获取星期 

  106. *参数        :    无 

  107. *返回        :    星期 

  108. *依赖        :    无 

  109. *作者        :    cp1300@139.com 

  110. *时间        :    20120329 

  111. *最后修改时间:    20120329 

  112. *说明        :    将BCD星期获取后转化为DEC星期,1-7:星期一-星期日 

  113. *************************************************************************************************************************/  

  114. __inline u8 GetWeek(void)  

  115. {  

  116.     return (BCD_to_DEC(RTC->BCDDAY));//获取星期  

  117. }  

  118.   

  119.   

  120. /************************************************************************************************************************* 

  121. *函数        :    __inline u8 GetDate(void) 

  122. *功能        :    获取日 

  123. *参数        :    无 

  124. *返回        :    日 

  125. *依赖        :    无 

  126. *作者        :    cp1300@139.com 

  127. *时间        :    20120329 

  128. *最后修改时间:    20120329 

  129. *说明        :    将BCD日获取后转化为DEC日 

  130. *************************************************************************************************************************/  

  131. __inline u8 GetDate(void)  

  132. {  

  133.     return (BCD_to_DEC(RTC->BCDDATE));//获取日  

  134. }  

  135.   

  136.   

  137. /************************************************************************************************************************* 

  138. *函数        :    __inline u8 GetMonth(void) 

  139. *功能        :    获取月 

  140. *参数        :    无 

  141. *返回        :    月 

  142. *依赖        :    无 

  143. *作者        :    cp1300@139.com 

  144. *时间        :    20120329 

  145. *最后修改时间:    20120329 

  146. *说明        :    将BCD月获取后转化为DEC月 

  147. *************************************************************************************************************************/  

  148. __inline u8 GetMonth(void)  

  149. {  

  150.     return (BCD_to_DEC(RTC->BCDMON));//获取月  

  151. }  

  152.   

  153.   

  154.   

  155. /************************************************************************************************************************* 

  156. *函数        :    __inline u8 GetYear(void) 

  157. *功能        :    获取年 

  158. *参数        :    无 

  159. *返回        :    年 

  160. *依赖        :    无 

  161. *作者        :    cp1300@139.com 

  162. *时间        :    20120329 

  163. *最后修改时间:    20120329 

  164. *说明        :    将BCD年获取后转化为DEC年 

  165. *************************************************************************************************************************/  

  166. __inline u8 GetYear(void)  

  167. {  

  168.     return (BCD_to_DEC(RTC->BCDYEAR));//获取年  

  169. }  

  170.   

  171.   

  172.   

  173. /************************************************************************************************************************* 

  174. *函数        :    void UpdateTimer(void) 

  175. *功能        :    更新时间 

  176. *参数        :    无 

  177. *返回        :    无 

  178. *依赖        :    底层函数 

  179. *作者        :    cp1300@139.com 

  180. *时间        :    20120329 

  181. *最后修改时间:    20120329 

  182. *说明        :    将时间放在了全局的结构Timer中 

  183. *************************************************************************************************************************/  

  184. void UpdateTimer(void)  

  185. {  

  186.     Timer.w_year = 2000 + GetYear();    //更新年,起点为2000年  

  187.     Timer.w_month = GetMonth(); //更新月  

  188.     Timer.w_date = GetDate();   //更新日  

  189.     Timer.week = GetWeek();     //更新星期  

  190.     Timer.hour = GetHour();     //更新时  

  191.     Timer.min = GetMin();       //更新分  

  192.     Timer.sec = GetSec();       //更新秒  

  193. }  

  194.   

  195.   

  196. /************************************************************************************************************************* 

  197. *函数        :    u8 DEC_to_BCD(u8 DEC_Code) 

  198. *功能        :    DEC码转BCD码 

  199. *参数        :    DEC码 

  200. *返回        :    BCD码 

  201. *依赖        :    无 

  202. *作者        :    cp1300@139.com 

  203. *时间        :    20120329 

  204. *最后修改时间:    20120329 

  205. *说明        :    用于将DEC码时间转换为BCD时间,长度为8bit 

  206. *************************************************************************************************************************/  

  207. u8 DEC_to_BCD(u8 DEC_Code)  

  208. {  

  209.     u8 temp;  

  210.       

  211.     if(DEC_Code > 99)  

  212.         return 0;  

  213.     temp = DEC_Code / 10;  

  214.     temp <<= 4;  

  215.     temp += DEC_Code % 10;  

  216.     return temp;  

  217. }  

  218.   

  219.   

  220. /************************************************************************************************************************* 

  221. *函数        :    void SetSec(u8 DEC_Sec) 

  222. *功能        :    设置秒 

  223. *参数        :    秒 

  224. *返回        :    无 

  225. *依赖        :    无 

  226. *作者        :    cp1300@139.com 

  227. *时间        :    20120329 

  228. *最后修改时间:    20120329 

  229. *说明        :    设置时间,注意需要先开启写保护,否则无法写入 

  230. *************************************************************************************************************************/  

  231. void SetSec(u8 DEC_Sec)  

  232. {  

  233.     RTC->BCDSEC = DEC_to_BCD(DEC_Sec);//设置取秒  

  234. }  

  235.   

  236. /************************************************************************************************************************* 

  237. *函数        :    void SetMin(u8 DEC_Min) 

  238. *功能        :    设置分 

  239. *参数        :    分 

  240. *返回        :    无 

  241. *依赖        :    无 

  242. *作者        :    cp1300@139.com 

  243. *时间        :    20120329 

  244. *最后修改时间:    20120329 

  245. *说明        :    设置时间,注意需要先开启写保护,否则无法写入 

  246. *************************************************************************************************************************/  

  247. void SetMin(u8 DEC_Min)  

  248. {  

  249.     RTC->BCDMIN = DEC_to_BCD(DEC_Min);//设置分  

  250. }  

  251.   

  252. /************************************************************************************************************************* 

  253. *函数        :    void SetHour(u8 DEC_Hour) 

  254. *功能        :    设置时 

  255. *参数        :    时 

  256. *返回        :    无 

  257. *依赖        :    无 

  258. *作者        :    cp1300@139.com 

  259. *时间        :    20120329 

  260. *最后修改时间:    20120329 

  261. *说明        :    设置时间,注意需要先开启写保护,否则无法写入 

  262. *************************************************************************************************************************/  

  263. void SetHour(u8 DEC_Hour)  

  264. {  

  265.     RTC->BCDHOUR = DEC_to_BCD(DEC_Hour);//设置时  

  266. }  

  267.   

  268. /************************************************************************************************************************* 

  269. *函数        :    void SetWeek(u8 DEC_Week) 

  270. *功能        :    设置星期 

  271. *参数        :    星期 

  272. *返回        :    无 

  273. *依赖        :    无 

  274. *作者        :    cp1300@139.com 

  275. *时间        :    20120329 

  276. *最后修改时间:    20120329 

  277. *说明        :    设置时间,注意需要先开启写保护,否则无法写入 

  278. *************************************************************************************************************************/  

  279. void SetWeek(u8 DEC_Week)  

  280. {  

  281.     RTC->BCDDAY = DEC_to_BCD(DEC_Week);//设置星期  

  282. }  

  283.   

  284.   

  285. /************************************************************************************************************************* 

  286. *函数        :    void SetDate(u8 DEC_Date) 

  287. *功能        :    设置日 

  288. *参数        :    日 

  289. *返回        :    无 

  290. *依赖        :    无 

  291. *作者        :    cp1300@139.com 

  292. *时间        :    20120329 

  293. *最后修改时间:    20120329 

  294. *说明        :    设置时间,注意需要先开启写保护,否则无法写入 

  295. *************************************************************************************************************************/  

  296. void SetDate(u8 DEC_Date)  

  297. {  

  298.     RTC->BCDDATE = DEC_to_BCD(DEC_Date);//设置日  

  299. }  

  300.   

  301.   

  302. /************************************************************************************************************************* 

  303. *函数        :    void SetMonth(u8 DEC_Month) 

  304. *功能        :    设置月 

  305. *参数        :    月 

  306. *返回        :    无 

  307. *依赖        :    无 

  308. *作者        :    cp1300@139.com 

  309. *时间        :    20120329 

  310. *最后修改时间:    20120329 

  311. *说明        :    设置时间,注意需要先开启写保护,否则无法写入 

  312. *************************************************************************************************************************/  

  313. void SetMonth(u8 DEC_Month)  

  314. {  

  315.     RTC->BCDMON = DEC_to_BCD(DEC_Month);//设置月  

  316. }  

  317.   

  318.   

  319.   

  320. /************************************************************************************************************************* 

  321. *函数        :    void SetYear(u8 DEC_Year) 

  322. *功能        :    设置年 

  323. *参数        :    年 

  324. *返回        :    无 

  325. *依赖        :    无 

  326. *作者        :    cp1300@139.com 

  327. *时间        :    20120329 

  328. *最后修改时间:    20120329 

  329. *说明        :    设置时间,注意需要先开启写保护,否则无法写入 

  330. *************************************************************************************************************************/  

  331. void SetYear(u8 DEC_Year)  

  332. {  

  333.     RTC->BCDYEAR = DEC_to_BCD(DEC_Year);//设置年  

  334. }  

  335.   

  336.   

  337.   

  338. /************************************************************************************************************************* 

  339. *函数        :    void InstallData(u16 Year,u8 Month,u8 Date,u8 Week) 

  340. *功能        :    设置日期 

  341. *参数        :    年,月,日,星期 

  342. *返回        :    无 

  343. *依赖        :    底层函数 

  344. *作者        :    cp1300@139.com 

  345. *时间        :    20120329 

  346. *最后修改时间:    20120329 

  347. *说明        :    设置会自动去除写保护,年范围为2000-2099 

  348. *************************************************************************************************************************/  

  349. void InstallData(u16 Year,u8 Month,u8 Date,u8 Week)  

  350. {  

  351.     RTC_Install(ENABLE);    //允许更新时间  

  352.     SetYear(Year-2000);         //设置年  

  353.     SetMonth(Month);        //设置月  

  354.     SetDate(Date);          //设置日  

  355.     SetWeek(Week);          //设置星期  

  356.     RTC_Install(DISABLE);   //禁止更新时间  

  357. }  

  358.   

  359.   

  360. /************************************************************************************************************************* 

  361. *函数        :    void InstallTime(u8 Hour,u8 Min,u8 Sec) 

  362. *功能        :    设置时间 

  363. *参数        :    时,分,秒 

  364. *返回        :    无 

  365. *依赖        :    底层函数 

  366. *作者        :    cp1300@139.com 

  367. *时间        :    20120329 

  368. *最后修改时间:    20120329 

  369. *说明        :    设置会自动去除写保护 

  370. *************************************************************************************************************************/  

  371. void InstallTime(u8 Hour,u8 Min,u8 Sec)  

  372. {  

  373.     RTC_Install(ENABLE);    //允许更新时间  

  374.     SetHour(Hour);          //设置时  

  375.     SetMin(Min);            //设置分  

  376.     SetSec(Sec);            //设置秒  

  377.     RTC_Install(DISABLE);   //禁止更新时间  

  378. }  

  379.   

  380.   

  381. /************************************************************************************************************************* 

  382. *函数        :    __inline ClearIntP(void) 

  383. *功能        :    清除INTP中断标志 

  384. *参数        :    无 

  385. *返回        :    无 

  386. *依赖        :    底层函数 

  387. *作者        :    cp1300@139.com 

  388. *时间        :    20120331 

  389. *最后修改时间:    20120331 

  390. *说明        :    无 

  391. *************************************************************************************************************************/  

  392. __inline ClearIntP(void)  

  393. {  

  394.     RTC->INTP |= BIT0;   //写1清除TIC中断  

  395. }  

  396.   

  397. /************************************************************************************************************************* 

  398. *函数        :    bool RTC_SecEnd(void) 

  399. *功能        :    判断秒是否到达 

  400. *参数        :    无 

  401. *返回        :    TRUE:秒到达;FALSE:未到达 

  402. *依赖        :    底层函数 

  403. *作者        :    cp1300@139.com 

  404. *时间        :    20120331 

  405. *最后修改时间:    20120331 

  406. *说明        :    无 

  407. *************************************************************************************************************************/  

  408. bool RTC_SecEnd(void)  

  409. {  

  410.     if(uAutoTimeUpdate == TRUE) //开启了自动更新时间  

  411.     {  

  412.         if(uSecEnd == TRUE)     //秒结束  

  413.         {  

  414.             uSecEnd = FALSE;    //清除标志  

  415.             return TRUE;  

  416.         }  

  417.         else  

  418.             return FALSE;  

  419.     }  

  420.     if(RTC->INTP & BIT0) //TIC中断标志置位  

  421.     {  

  422.         ClearIntP();        //清除中断标志  

  423.         return TRUE;  

  424.     }  

  425.     return FALSE;  

  426. }  

  427.   

  428.   

  429.   

  430. //TIC中断服务程序,用于自动更新时间  

  431. void __irq Isr_RTC_InspectTick(void)  

  432. {  

  433.     uSecEnd = TRUE;                 //秒结束时间成立  

  434.     UpdateTimer();                  //更新所有时间  

  435.     ClearIntP();                    //清除中断标志  

  436.     VICInterruptEnd();  //中断退出  

  437. }  

  438.   

  439.   

  440.   

  441.   

  442. /************************************************************************************************************************* 

  443. *函数        :    void RTC_Init(u8 AutoUpdate) 

  444. *功能        :    初始化RTC 

  445. *参数        :    EnableInt:是否开启中断 

  446. *返回        :    无 

  447. *依赖        :    无 

  448. *作者        :    cp1300@139.com 

  449. *时间        :    20120329 

  450. *最后修改时间:    20120331 

  451. *说明        :    判断时钟是否写保护,如果没,则写开启保护,并更新时间 

  452. *************************************************************************************************************************/  

  453. void RTC_Init(FunctionalState EnableInt)  

  454. {  

  455.     RTC->TICNT = 32768-1;  

  456.     RTC->CON = BIT8;     //使能标记定时器,32768分频  

  457.     RTC_Install(DISABLE);   //开启时钟写保护  

  458.     UpdateTimer();          //更新所有时间  

  459.     if(EnableInt == ENABLE)         //使能自动更新时间  

  460.     {  

  461.         uAutoTimeUpdate = TRUE;//标志有效  

  462.         Set_IsrAddr(INT_RTC_TIC,(u32)Isr_RTC_InspectTick);//设置中断向量地址  

  463.         Set_IntEnable(INT_RTC_TIC,ENABLE);//使能TIC中断  

  464.     }  

  465.     else  

  466.     {  

  467.         uAutoTimeUpdate = FALSE;  

  468.         Set_IntEnable(INT_RTC_TIC,DISABLE);//关闭TIC中断  

  469.     }  

  470. }  


  1. /************************************************************************************************************* 

  2.  * 文件名: RTC.H 

  3.  * 功能:      S3C6410 RTC底层驱动函数 

  4.  * 作者:      陈鹏 

  5.  * 创建时间:    2012年3月28日21:52 

  6.  * 最后修改时间:2012年3月28日 

  7.  * 详细:      RTC相关底层驱动函数 

  8. *************************************************************************************************************/  

  9. #ifndef _RTC_H_  

  10. #define _RTC_H_  

  11.   

  12.   

  13.  //时间结构体  

  14. typedef struct   

  15. {  

  16.     u8 hour;    //小时  

  17.     u8 min;     //分钟  

  18.     u8 sec;     //秒           

  19.     //公历日月年周  

  20.     u16 w_year;     //年  

  21.     u8  w_month;    //月  

  22.     u8  w_date;     //日  

  23.     u8  week;       //星期  

  24. #if _Lunar_calendar  

  25.     //农历日月年节气  

  26.     u8 l_year;      //年  

  27.     u8 l_month;     //月  

  28.     u8 l_data;      //日  

  29.     u8 SolarTerms;  //农历节气   

  30. #endif  

  31. }Time_TypeDef;  

  32.   

  33. extern Time_TypeDef Timer;//存放全局时间  

  34.   

  35. void UpdateTimer(void); //更新全部时间  

  36. void RTC_Init(FunctionalState EnableInt);   //初始化RTC  

  37. void InstallData(u16 Year,u8 Month,u8 Date,u8 Week);    //设置日期  

  38. void InstallTime(u8 Hour,u8 Min,u8 Sec);                //设置时间  

  39. bool RTC_SecEnd(void);                          //判断秒是否到达  

  40.   

  41.   

  42.   

  43. #endif  







『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向