rtc.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:9k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : rtc.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 09/30/2003
  5. * Description        : This file provides all the RTC software functions
  6. ********************************************************************************
  7. * History:
  8. *  01/01/2004 : V1.2
  9. *  14/07/2004 : V1.3
  10. *******************************************************************************/
  11. #include "rtc.h"
  12. // Global interrupt
  13. #define RTC_GI_Mask   0x0008
  14. #define RTC_GI_Index  3
  15. // OverFlow interrupt
  16. #define RTC_OWI_Mask  0x0004
  17. #define RTC_OWI_Index 2
  18. // Alarm interrupt
  19. #define RTC_AI_Mask   0x0002
  20. #define RTC_AI_Index  1
  21. // Second interrupt
  22. #define RTC_SI_Mask   0x0001
  23. // Configuration Flag Mask
  24. #define RTC_CNF_Mask  0x0010
  25. // Operation OFF flag
  26. #define RTC_RTOFF_Mask   0x0020
  27. /*******************************************************************************
  28. * Function Name  : RTC_Delay
  29. * Description    : This routine is used to insert a delay
  30. * Input          : None
  31. * Return         : None
  32. *******************************************************************************/
  33. void RTC_Delay( void )
  34. {
  35.   u16 _Tmp;
  36.   for (_Tmp = 0x0; _Tmp < 0x7F; _Tmp ++);
  37. }
  38. /*******************************************************************************
  39. * Function Name  : RTC_ClearCounter
  40. * Description    : This routine is used to clear the RTC counter value
  41. * Input          : None
  42. * Return         : None
  43. *******************************************************************************/
  44. void RTC_ClearCounter (void)
  45. {
  46.   // Wait For Last Task Completion
  47.   RTC_WaitForLastTask();
  48.   // Enter In Configuration Mode
  49.   RTC_EnterCfgMode();
  50.   // Wait For Last Task Completion
  51.   RTC_WaitForLastTask();
  52.   // Clears RTC counter
  53.   RTC->CNTH =0x0000;
  54.   // Wait For Last Task Completion
  55.   RTC_WaitForLastTask();
  56.   RTC->CNTL =0x0000;
  57.   // Exit From Configuration Mode
  58.   RTC_ExitCfgMode ();
  59.   // Wait For Last Task Completion
  60.   RTC_WaitForLastTask();
  61.   // Wait For Last Task Completion
  62.   RTC_WaitForLastTask ();
  63. }
  64. /*******************************************************************************
  65. * Function Name  : RTC_PrescalerConfig
  66. * Description    : This routine is used to set the Prescaler Value
  67. * Input          : The New prescaler Value
  68. * Return         : None
  69. *******************************************************************************/
  70. void RTC_PrescalerConfig (u32 Xprescaler)
  71. {
  72.   if ( RTC_PrescalerValue () != Xprescaler )
  73.   {
  74.     // Wait For Last Task Completion
  75.     RTC_WaitForLastTask ();
  76.     // Enter In Configuration Mode
  77.     RTC_EnterCfgMode ();
  78.     // Wait For Last Task Completion
  79.     RTC_WaitForLastTask();
  80.     // Set the prescaler MSB  part
  81.     RTC->PRLH = (Xprescaler & 0x000F0000) >> 16;
  82.     // Wait For Last Task Completion
  83.     RTC_WaitForLastTask();
  84.     // Set the prescaler LSB  part
  85.     RTC->PRLL = (Xprescaler & 0x0000FFFF);
  86.     // Wait For Last Task Completion
  87.     RTC_WaitForLastTask();
  88.     // Exit From Configuration Mode
  89.     RTC_ExitCfgMode ();
  90.     // Wait For Last Task Completion
  91.     RTC_WaitForLastTask ();
  92.   }
  93. }
  94. /*******************************************************************************
  95. * Function Name  : RTC_AlarmConfig
  96. * Description    : This routine is used to set the RTC alarm Value
  97. * Input          : an u32 value that holds the Real Time clock alarm time.
  98. * Return         : None
  99. *******************************************************************************/
  100. void RTC_AlarmConfig (u32 Xalarm)
  101. {
  102.   // Wait For Last Task Completion
  103.   RTC_WaitForLastTask ();
  104.   // Enter In Configuration Mode
  105.   RTC_EnterCfgMode ();
  106.   // Wait For Last Task Completion
  107.   RTC_WaitForLastTask();
  108.   // Set The MSB part of the Alarm Time
  109.   RTC->ALRH = (Xalarm & 0xFFFF0000) >> 16;
  110.   // Wait For Last Task Completion
  111.   RTC_WaitForLastTask();
  112.   // Set The LSB part of the Alarm Time
  113.   RTC->ALRL = (Xalarm & 0x0000FFFF);
  114.   // Wait For Last Task Completion
  115.   RTC_WaitForLastTask();
  116.   // Exit From Configuration Mode
  117.   RTC_ExitCfgMode ();
  118.   // Wait For Last Task Completion
  119.   RTC_WaitForLastTask ();
  120. }
  121. /*******************************************************************************
  122. * Function Name  : RTC_FlagClear
  123. * Description    : This routine is used to clear the RTC flags
  124. * Input          : an RTC flag
  125. * Return         : None
  126. *******************************************************************************/
  127. void RTC_FlagClear (RTC_FLAGS Xflag)
  128. {
  129.   // Wait For Last Task Completion
  130.   RTC_WaitForLastTask();
  131.   // Enter In Configuration Mode
  132.   RTC_EnterCfgMode();
  133.   // Wait For Last Task Completion
  134.   RTC_WaitForLastTask();
  135.   // Clear an RTC flag
  136.   RTC->CRL &= ~Xflag;
  137.   // Wait For Last Task Completion
  138.   RTC_WaitForLastTask();
  139.   // Exit From Configuration Mode
  140.   RTC_ExitCfgMode ();
  141.   // Wait For Last Task Completion
  142.   RTC_WaitForLastTask();
  143. }
  144. /*******************************************************************************
  145. * Function Name  : RTC_ITClear
  146. * Description    : This routine is used to clear the RTC interrupts
  147. * Input          : an RTC interrupt
  148. * Return         : None
  149. *******************************************************************************/
  150. void RTC_ITClear (RTC_IT Xrtcit)
  151. {
  152.   // Wait For Last Task Completion
  153.   RTC_WaitForLastTask();
  154.   // Enter In Configuration Mode
  155.   RTC_EnterCfgMode();
  156.   // Clears an RTC interrupt
  157.   RTC->CRL &= ~Xrtcit;
  158.   // Exit From Configuration Mode
  159.   RTC_ExitCfgMode ();
  160.   // Wait For Last Task Completion
  161.   RTC_WaitForLastTask ();
  162. }
  163. /*******************************************************************************
  164. * Function Name  : RTC_EnterCfgMode
  165. * Description    : This routine is used to enter in the Configuration Mode
  166. * Input          : None
  167. * Return         : None
  168. *******************************************************************************/
  169. void RTC_EnterCfgMode(void)
  170. {
  171.   // Set the CNF flag to enter in the Configuration Mode
  172.   RTC->CRL |= RTC_CNF_Mask;
  173.   // Wait For Last Task Completion
  174.   RTC_WaitForLastTask ();
  175. }
  176. /*******************************************************************************
  177. * Function Name  : RTC_ExitCfgMode
  178. * Description    : This routine is used to exit from the Configuration Mode
  179. * Input          : None
  180. * Return         : None
  181. *******************************************************************************/
  182. void RTC_ExitCfgMode(void)
  183. {
  184.   // Reset the CNF flag to exit from the Configuration Mode
  185.   RTC->CRL &= ~RTC_CNF_Mask;
  186.   // Wait For Last Task Completion
  187.   RTC_WaitForLastTask ();
  188. }
  189. /*******************************************************************************
  190. * Function Name  : RTC_WaitForLastTask
  191. * Description    : This routine waits for the last task completion
  192. * Input          : None
  193. * Return         : None
  194. *******************************************************************************/
  195. void RTC_WaitForLastTask(void)
  196. {
  197.   // Loop until the Last operation Completion
  198.   while (!(RTC->CRL & RTC_RTOFF_Mask));
  199. }
  200. /*******************************************************************************
  201. * Function Name  : RTC_SetTime
  202. * Description    : This routine sets the RTC Time
  203. * Input          : None
  204. * Return         : None
  205. *******************************************************************************/
  206. void RTC_SetTime(u8 TmpH, u8 TmpM, u8 TmpS )
  207. {
  208.   u32 Tmp = TmpH * 3600 + TmpM * 60 + TmpS;
  209.   // Wait For Last Task Completion
  210.   RTC_WaitForLastTask();
  211.   // Enter In Configuration Mode
  212.   RTC_EnterCfgMode();
  213.   // Wait For Last Task Completion
  214.   RTC_WaitForLastTask();
  215.   // Wait For Last Task Completion
  216.   RTC->CNTL = Tmp & 0x0000FFFF;
  217.   // Wait For Last Task Completion
  218.   RTC_WaitForLastTask();
  219.   RTC->CNTH = ( Tmp & 0xFFFF0000 ) >> 16;
  220.   // Wait For Last Task Completion
  221.   RTC_WaitForLastTask();
  222.   // Exit From Configuration Mode
  223.   RTC_ExitCfgMode ();
  224. }
  225. /*******************************************************************************
  226. * Function Name  : RTC_SetAlarmTime
  227. * Description    : This routine sets the Alarm Time
  228. * Input          : None
  229. * Return         : None
  230. *******************************************************************************/
  231. void RTC_SetAlarmTime(u8 TmpH, u8 TmpM, u8 TmpS )
  232. {
  233.   u32 Tmp = TmpH * 3600 + TmpM * 60 + TmpS;
  234.   // Wait For Last Task Completion
  235.   RTC_WaitForLastTask();
  236.   // Enter In Configuration Mode
  237.   RTC_EnterCfgMode();
  238.   // Wait For Last Task Completion
  239.   RTC_WaitForLastTask();
  240.   // Wait For Last Task Completion
  241.   RTC->ALRL = Tmp & 0x0000FFFF;
  242.   // Wait For Last Task Completion
  243.   RTC_WaitForLastTask();
  244.   RTC->ALRH = ( Tmp & 0xFFFF0000 ) >> 16;
  245.   // Wait For Last Task Completion
  246.   RTC_WaitForLastTask();
  247.   // Exit From Configuration Mode
  248.   RTC_ExitCfgMode ();
  249. }