rtc.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "rtc.h"
  2. #include "led.h"
  3. //#include "delay.h"
  4. #include "dwt.h"
  5. #include <time.h>
  6. //////////////////////////////////////////////////////////////////////////////////
  7. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  8. // ALIENTEK STM32F407开发板
  9. // RTC 驱动代码
  10. //正点原子@ALIENTEK
  11. //技术论坛:www.openedv.com
  12. //创建日期:2014/5/5
  13. //版本:V1.1
  14. //版权所有,盗版必究。
  15. // Copyright(C) 广州市星翼电子科技有限公司 2014-2024
  16. // All rights reserved
  17. //********************************************************************************
  18. //修改说明
  19. // V1.1 20140726
  20. //新增:RTC_Get_Week函数,用于根据年月日信息,得到星期信息.
  21. //////////////////////////////////////////////////////////////////////////////////
  22. NVIC_InitTypeDef NVIC_InitStructure;
  23. // RTC时间设置
  24. // hour,min,sec:小时,分钟,秒钟
  25. // ampm:@RTC_AM_PM_Definitions :RTC_H12_AM/RTC_H12_PM
  26. //返回值:SUCEE(1),成功
  27. // ERROR(0),进入初始化模式失败
  28. ErrorStatus RTC_Set_Time(u8 hour, u8 min, u8 sec, u8 ampm)
  29. {
  30. RTC_TimeTypeDef RTC_TimeTypeInitStructure;
  31. RTC_TimeTypeInitStructure.RTC_Hours = hour;
  32. RTC_TimeTypeInitStructure.RTC_Minutes = min;
  33. RTC_TimeTypeInitStructure.RTC_Seconds = sec;
  34. RTC_TimeTypeInitStructure.RTC_H12 = ampm;
  35. return RTC_SetTime(RTC_Format_BIN, &RTC_TimeTypeInitStructure);
  36. }
  37. // RTC日期设置
  38. // year,month,date:年(0~99),月(1~12),日(0~31)
  39. // week:星期(1~7,0,非法!)
  40. //返回值:SUCEE(1),成功
  41. // ERROR(0),进入初始化模式失败
  42. ErrorStatus RTC_Set_Date(u8 year, u8 month, u8 date, u8 week)
  43. {
  44. RTC_DateTypeDef RTC_DateTypeInitStructure;
  45. RTC_DateTypeInitStructure.RTC_Date = date;
  46. RTC_DateTypeInitStructure.RTC_Month = month;
  47. RTC_DateTypeInitStructure.RTC_WeekDay = week;
  48. RTC_DateTypeInitStructure.RTC_Year = year;
  49. return RTC_SetDate(RTC_Format_BIN, &RTC_DateTypeInitStructure);
  50. }
  51. // RTC初始化
  52. //返回值:0,初始化成功;
  53. // 1,LSE开启失败;
  54. // 2,进入初始化模式失败;
  55. u8 MyRTC_Init(void)
  56. {
  57. RTC_InitTypeDef RTC_InitStructure;
  58. u16 retry = 0X1FFF;
  59. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR时钟
  60. PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
  61. if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x5050) //是否第一次配置?
  62. {
  63. RCC_LSEConfig(RCC_LSE_ON); // LSE 开启
  64. while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
  65. {
  66. retry++;
  67. ms_delay(10);
  68. }
  69. if (retry == 0)
  70. return 1; // LSE 开启失败.
  71. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
  72. RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
  73. RTC_InitStructure.RTC_AsynchPrediv = 0x7F; // RTC异步分频系数(1~0X7F)
  74. RTC_InitStructure.RTC_SynchPrediv = 0xFF; // RTC同步分频系数(0~7FFF)
  75. RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; // RTC设置为,24小时格式
  76. RTC_Init(&RTC_InitStructure);
  77. RTC_Set_Time(16, 18, 56, RTC_H12_AM); //设置时间
  78. RTC_Set_Date(19, 2, 15, 6); //设置日期
  79. RTC_WriteBackupRegister(RTC_BKP_DR0, 0x5050); //标记已经初始化过了
  80. }
  81. return 0;
  82. }
  83. /*
  84. * Description:本地时间生成Unix时间戳
  85. * Parameter:
  86. * Return:
  87. * Others:
  88. */
  89. u32 GetCur_TimeStamp(void)
  90. {
  91. struct tm TmStruct;
  92. u32 UnixNum;
  93. RTC_DateTypeDef RTC_DateStruct;
  94. RTC_TimeTypeDef RTC_TimeStruct;
  95. RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
  96. RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
  97. TmStruct.tm_year = RTC_DateStruct.RTC_Year + 100;
  98. TmStruct.tm_mon = RTC_DateStruct.RTC_Month - 1;
  99. TmStruct.tm_mday = RTC_DateStruct.RTC_Date;
  100. TmStruct.tm_hour = RTC_TimeStruct.RTC_Hours - 8;
  101. TmStruct.tm_min = RTC_TimeStruct.RTC_Minutes;
  102. TmStruct.tm_sec = RTC_TimeStruct.RTC_Seconds;
  103. UnixNum = mktime(&TmStruct);
  104. return UnixNum;
  105. }