rtc.c 4.1 KB

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