久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7042|回復: 0
打印 上一主題 下一主題
收起左側

stm32--RTC程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:72519 發表于 2015-1-23 01:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. //程序中的時間(normal time)是根據國際標準時間戳轉換為東八區的北京時間(NORMALTIME)。
  2. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3. #ifndef _RTC_H_
  4. #define _RTC_H_
  5. #include "driver_about.h"
  6. #include <time.h>
  7. #include <stdio.h>
  8. #include <string.h>

  9. typedef struct tm NORMALTIME;//時間類型;把不是很友好的西方時間表示形式,轉換為我們習慣的表示方式
  10.                       //如:1-12月的表示由原來的0-11改為1-12,0表示星期天改為7表示,國際時間改為東八區時間
  11. typedef time_t    TIMESTAMP;//時間戳類型
  12. void              RTC_Init(NORMALTIME t);
  13. void              RTC_Rst(TIMESTAMP ts);//RTC復位
  14. TIMESTAMP         Time_GetTimeStamp(void); //獲取RTC中的時間戳
  15. void              Time_SetTimeStamp(TIMESTAMP ts);//設置RTC中的時間
  16. NORMALTIME        Time_GetTime(void);
  17. void              Time_SetTime(NORMALTIME t);
  18. #endif


  19. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  20. #include "Rtc.h"
  21. /*******************************************************************************
  22. * Function Name  : NVIC_Configuration
  23. * Description    : Configures the RTC.
  24. * Input          : None
  25. * Output         : None
  26. * Return         : None
  27. * Attention : None
  28. *******************************************************************************/
  29. static void RTC_Configuration(void)//RTC的初始化的基本配置(包括RTC的時鐘源選擇和分頻,及秒中斷的使能);為RTC_Init(void)做準備
  30. {
  31.   /* Enable PWR and BKP clocks */
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//開啟PWR和BKP的時鐘
  33.   /* Allow access to BKP Domain */
  34.   PWR_BackupAccessCmd(ENABLE);//允許訪問BKP,對PWR_CR中的DBP位進行寫1,以允許對BKP和RTC模塊的操作
  35.   /* Reset Backup Domain */
  36.   BKP_DeInit();//復位BKP
  37.   /* Enable LSE */
  38.   RCC_LSEConfig(RCC_LSE_ON); //外部低速時鐘使能
  39.   /* Wait till LSE is ready */
  40.   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){}//等待時鐘準備好  
  41.   /* Select LSE as RTC Clock Source */
  42.   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇外部低速時鐘外RTC的時鐘源
  43.   /* Enable RTC Clock */
  44.   RCC_RTCCLKCmd(ENABLE); //使能RTC的時鐘 ,是通過對RCC_BDCR中的RTCEN位的操作來開啟RTC的時鐘的
  45.   /* Wait for RTC registers synchronization */
  46.   RTC_WaitForSynchro();
  47.   /* Wait until last write operation on RTC registers has finished */
  48.   RTC_WaitForLastTask();
  49.   /* Enable the RTC Second */
  50.   //RTC_ITConfig(RTC_IT_SEC, ENABLE);//使能RTC的秒中斷
  51.   /* Wait until last write operation on RTC registers has finished */
  52.   RTC_WaitForLastTask();
  53.   /* Set RTC prescaler: set RTC period to 1sec */
  54.   RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) *///RTC為32767+1分頻,每秒一次溢出中斷
  55.   /* Wait until last write operation on RTC registers has finished */
  56.   RTC_WaitForLastTask();
  57. }

  58. /*******************************************************************************
  59. * Function Name  : NVIC_Configuration
  60. * Description    : Configures the nested vectored interrupt controller.
  61. * Input          : None
  62. * Output         : None
  63. * Return         : None
  64. * Attention : None
  65. *******************************************************************************/
  66. // void NVIC_Configuration(void) //RTC模塊的中斷配置
  67. // {
  68. //   NVIC_InitTypeDef NVIC_InitStructure;
  69. //   /* Configure one bit for preemption priority */
  70. //   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  71. //   /* Enable the RTC Interrupt */
  72. //   NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
  73. //   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  74. //   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  75. //   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  76. //   NVIC_Init(&NVIC_InitStructure);
  77. // }
  78. ///////////////////時間形式的轉換/////////////////////////////////
  79. TIMESTAMP TimeConv_Nomal2Stamp(NORMALTIME t)//正常(北京)時間轉換為時間戳
  80. {
  81. t.tm_year-=1900;//雖然時間戳是以1970年(正數部分0x00000000)開始計時,但時間轉換是轉成1900年(負數第32bit決定)的相對時間
  82. t.tm_mon -=1;
  83. if(t.tm_wday>=7)
  84. t.tm_wday=0;
  85. t.tm_hour-=8;
  86. return mktime(&t);
  87. }
  88. NORMALTIME TimeConv_Stamp2Nomal(TIMESTAMP ts)//時間戳轉換為正常(北京)時間
  89. {
  90. NORMALTIME *pt,t;
  91. pt = localtime(&ts);//函數為把時間戳轉換成從1900開始的相對時間值,需要加上開始的時間
  92. t=*pt;
  93. t.tm_year+=1900;
  94. t.tm_mon +=1;
  95. if(t.tm_wday==0)
  96. t.tm_wday=7;
  97. t.tm_hour+=8;//轉為北京時間
  98. return t;
  99. }
  100. //////////////////時間戳方式獲取時間和設置時間///////////////////////
  101. TIMESTAMP Time_GetTimeStamp(void) //獲取RTC中的時間戳
  102. {
  103. return (TIMESTAMP)RTC_GetCounter();
  104. }

  105. void Time_SetTimeStamp(TIMESTAMP ts)//設置RTC中的時間(時間戳的形式)
  106. {
  107. RTC_Configuration();
  108. RTC_WaitForLastTask();
  109. RTC_SetCounter((u32)ts);
  110. BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//把0xA5A5寫入BKP_DR1寄存器中
  111. RTC_WaitForLastTask();
  112. }

  113. /////////////////常規時間方式獲取和設置時間/////////////////////////
  114. NORMALTIME Time_GetTime(void) //獲取正常(北京)時間
  115. {
  116.   return TimeConv_Stamp2Nomal((TIMESTAMP)RTC_GetCounter());
  117. }

  118. void Time_SetTime(NORMALTIME t)//設置正常(北京)時間
  119. {
  120. Time_SetTimeStamp(TimeConv_Nomal2Stamp(t));
  121. }

  122. //////////////////RTC模塊復位//////////////////////////////////////
  123. void RTC_Rst(TIMESTAMP ts)//RTC復位
  124. {
  125. RTC_Configuration();//如果沒有配置,則進行相應的初始化基本配置
  126. Time_SetTimeStamp(ts);
  127. /* Adjust time by values entred by the user on the hyperterminal */
  128. BKP_WriteBackupRegister(BKP_DR1, 0x0000);//把0x0000寫入BKP_DR1寄存器中
  129. }
  130. //   RTC_EnterConfigMode();
  131. //   /* Set RTC COUNTER MSB word */
  132. //   RTC->CNTH = CounterValue >> 16;
  133. //   /* Set RTC COUNTER LSB word */
  134. //   RTC->CNTL = (CounterValue & RTC_LSB_MASK);
  135. //   RTC_ExitConfigMode();
  136. /*******************************************************************************
  137. * Function Name  : RTC_Init
  138. * Description    : RTC Initialization
  139. *******************************************************************************/
  140. void RTC_Init(NORMALTIME t)//RTC初始化
  141. {
  142.   if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)//判斷RTC模塊是否進行了配置
  143.   {
  144.     RTC_Configuration();//如果沒有配置,則進行相應的初始化基本配置
  145. Time_SetTime(t);//寫入最初的RTC時間
  146. /* Adjust time by values entred by the user on the hyperterminal */
  147.     BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//把0xA5A5寫入BKP_DR1寄存器中
  148.   }
  149.   /*
  150.   else
  151.   {
  152.    //Check if the Power On Reset flag is set
  153.     if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)//判斷是否發生了電源上電復位
  154.     {
  155.       printf("Power On Reset occurred....\r\n");
  156.     }
  157.     // Check if the Pin Reset flag is set
  158.     else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)//判斷是否發生了引腳復位
  159.     {
  160.       printf("External Reset occurred....\r\n");
  161.     }

  162.     printf("No need to configure RTC....\r\n");
  163.     // Wait for RTC registers synchronization
  164.     RTC_WaitForSynchro();

  165.     // Enable the RTC Second
  166.     RTC_ITConfig(RTC_IT_SEC, ENABLE);//使能RTC秒中斷
  167.     // Wait until last write operation on RTC registers has finished
  168.     RTC_WaitForLastTask();
  169.   }

  170.    // NVIC configuration
  171.    NVIC_Configuration();//RTC的嵌套向量中斷配置

  172. #ifdef RTCClockOutput_Enable
  173.   // Enable PWR and BKP clocks
  174.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  175.   // Allow access to BKP Domain
  176.   PWR_BackupAccessCmd(ENABLE);

  177.   // Disable the Tamper Pin
  178.   BKP_TamperPinCmd(DISABLE); // To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled

  179.   // Enable RTC Clock Output on Tamper Pin
  180.   BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
  181. #endif

  182.    // Clear reset flags
  183.   RCC_ClearFlag(); //清除各種復位標志*/
  184.   return;
  185. }

  186. // /*******************************************************************************
  187. // * Function Name  : Time_GetCalendarTime
  188. // * Description    : 從RTC取當前時間的日歷時間(struct tm)
  189. // * Input          : None
  190. // * Output         : None
  191. // * Return         : struct tm
  192. // * Attention : None
  193. // *******************************************************************************/
  194. // struct tm Time_GetCalendarTime(void) //獲取RTC中的日歷時間
  195. // {
  196. // time_t t_t;
  197. // struct tm t_tm;

  198. // t_t = (time_t)RTC_GetCounter();
  199. // t_tm = Time_ConvUnixToCalendar(t_t);
  200. // return t_tm;
  201. // }

  202. /******************************************************************************************************************************
  203. 以下函數為設置RTC時鐘
  204. ******************************************************************************************************************************/
  205. // /*******************************************************************************
  206. // * Function Name  : Time_SetCalendarTime
  207. // * Description    : 將給定的Calendar格式時間轉換成UNIX時間戳寫入RTC
  208. // * Input          : - t: struct tm
  209. // * Output         : None
  210. // * Return         : None
  211. // * Attention : None
  212. // *******************************************************************************/
  213. // void Time_SetCalendarTime(struct tm t)//以日歷的形式設置RTC中的時間
  214. // {
  215. // Time_SetUnixTime(Time_ConvCalendarToUnix(t));
  216. // return;
  217. // }

  218. // /******************************************************************************************************************************
  219. // 以下兩個函數為時間戳和日歷時間之間的轉換(日歷時間為從1900-1-1開始的)
  220. // ******************************************************************************************************************************/
  221. // /*******************************************************************************
  222. // * Function Name  : Time_ConvUnixToCalendar
  223. // * Description    : 轉換UNIX時間戳為日歷時間
  224. // * Input          : - t: 當前時間的UNIX時間戳
  225. // * Output         : None
  226. // * Return         : struct tm
  227. // * Attention : None
  228. // *******************************************************************************/
  229. // struct tm Time_ConvUnixToCalendar(time_t t)//把時間戳轉換為日歷時間(前提是時間戳開始時間和日歷開始計算的時間相同,都是從1900年開始計算)
  230. // {
  231. // struct tm *t_tm;
  232. // t_tm = localtime(&t);//t_tm = localtime(&t);函數為把時間戳轉換成從1900開始的相對時間值,需要加上開始的時間
  233. // t_tm->tm_year += 1900;/* localtime轉換結果的tm_year是相對值,需要轉成絕對值 */
  234. //
  235. // return *t_tm;
  236. // }

  237. // /*******************************************************************************
  238. // * Function Name  : Time_ConvCalendarToUnix
  239. // * Description    : 寫入RTC時鐘當前時間
  240. // * Input          : - t: struct tm
  241. // * Output         : None
  242. // * Return         : time_t
  243. // * Attention : None
  244. // *******************************************************************************/
  245. // time_t Time_ConvCalendarToUnix(struct tm t)//把日歷時間轉換為時間戳
  246. // {
  247. // t.tm_year -= 1900;  /* 外部tm結構體存儲的年份為2008格式*/
  248. // /* 而time.h中定義的年份格式為1900年開始的年份 */
  249. // /* 所以,在日期轉換時要考慮到這個因素。*/
  250. // return mktime(&t);
  251. // }

  252. // /*******************************************************************************
  253. // * Function Name  : Time_Regulate
  254. // * Description    : None
  255. // * Input          : None
  256. // * Output         : None
  257. // * Return         : None
  258. // * Attention : None
  259. // *******************************************************************************/
  260. // void Time_Regulate(void)
  261. // {
  262. //   struct tm time;
  263. //     memset(&time, 0 , sizeof(time) );/* 清空結構體 */
  264. //     
  265. //     time.tm_year =2012;//設定年1970-2037
  266. //   
  267. //     time.tm_mon=1-1;//設定月(1-12)-1

  268. //     time.tm_mday = 1;//設定日1-31

  269. //     time.tm_hour =1;//設定小時0-23

  270. //     time.tm_min = 1;//設定分0-59

  271. //     time.tm_sec =1;//設定秒0-59

  272. //   /* Return the value to store in RTC counter register */
  273. //   Time_SetCalendarTime(time);//根據以上設定對RTC進行設置  
  274. // }
  275. // /*******************************************************************************
  276. // * 本文件實現基于RTC的日期功能,提供年月日的讀寫。(基于ANSI-C的time.h)
  277. // *
  278. // * RTC中保存的時間格式,是UNIX時間戳格式的。即一個32bit的time_t變量(實為u32)
  279. // *
  280. // * ANSI-C的標準庫中,提供了兩種表示時間的數據  型:
  281. // * time_t:   UNIX時間戳(從19xx-1-1起到某時間經過的秒數)
  282. // * typedef unsigned int time_t;
  283. // *
  284. // * struct tm:Calendar格式(年月日形式)
  285. // *   tm結構如下:
  286. // *   struct tm {
  287. // *   int tm_sec;   // 秒 seconds after the minute, 0 to 60(0 - 60 allows for the occasional leap second)
  288. // *   int tm_min;   // 分 minutes after the hour,   0 to 59
  289. // *  int tm_hour;  // 時 hours since midnight, 0 to 23
  290. // *  int tm_mday;  // 日 day of the month, 1 to 31
  291. // *  int tm_mon;   // 月 months since January, 0 to 11
  292. // *  int tm_year;  // 年 years since 1900
  293. // *  int tm_wday;  // 星期 days since Sunday, 0 to 6
  294. // *  int tm_yday;  // 從元旦起的天數 days since January 1, 0 to 365
  295. // * int tm_isdst; // 夏令時??Daylight Savings Time flag
  296. // * ...
  297. // * }
  298. // * 其中wday,yday可以自動產生,軟件直接讀取
  299. // * mon的取值為0-11
  300. // ****注意***:
  301. // *tm_year:在time.h庫中定義為1900年起的年份,即2008年應表示為2008-1900=108
  302. // * 這種表示方法對用戶來說不是十分友好,與現實有較大差異。
  303. // * 所以在本文件中,屏蔽了這種差異。
  304. // * 即外部調用本文件的函數時,tm結構體類型的日期,tm_year即為2008
  305. // * 注意:若要調用系統庫time.c中的函數,需要自行將tm_year-=1900
  306. // *
  307. // * 成員函數說明:
  308. // * struct tm Time_ConvUnixToCalendar(time_t t);
  309. // * 輸入一個Unix時間戳(time_t),返回Calendar格式日期
  310. // * time_t Time_ConvCalendarToUnix(struct tm t);
  311. // * 輸入一個Calendar格式日期,返回Unix時間戳(time_t)
  312. // * time_t Time_GetUnixTime(void);
  313. // * 從RTC取當前時間的Unix時間戳值
  314. // * struct tm Time_GetCalendarTime(void);
  315. // * 從RTC取當前時間的日歷時間
  316. // * void Time_SetUnixTime(time_t);
  317. // * 輸入UNIX時間戳格式時間,設置為當前RTC時間
  318. // * void Time_SetCalendarTime(struct tm t);
  319. // * 輸入Calendar格式時間,設置為當前RTC時間
  320. // *
  321. // * 外部調用實例:
  322. // * 定義一個Calendar格式的日期變量:
  323. // * struct tm now;
  324. // * now.tm_year = 2008;
  325. // * now.tm_mon = 11;//12月
  326. // * now.tm_mday = 20;
  327. // * now.tm_hour = 20;
  328. // * now.tm_min = 12;
  329. // * now.tm_sec = 30;
  330. // *
  331. // * 獲取當前日期時間:
  332. // * tm_now = Time_GetCalendarTime();
  333. // * 然后可以直接讀tm_now.tm_wday獲取星期數
  334. // *
  335. // * 設置時間:
  336. // * Step1. tm_now.xxx = xxxxxxxxx;
  337. // * Step2. Time_SetCalendarTime(tm_now);
  338. // *
  339. // * 計算兩個時間的差
  340. // * struct tm t1,t2;
  341. // * t1_t = Time_ConvCalendarToUnix(t1);
  342. // * t2_t = Time_ConvCalendarToUnix(t2);
  343. // * dt = t1_t - t2_t;
  344. // * dt就是兩個時間差的秒數
  345. // * dt_tm = mktime(dt);//注意dt的年份匹配,ansi庫中函數為相對年份,注意超限
  346. // * 另可以參考相關資料,調用ansi-c庫的格式化輸出等功能,ctime,strftime等
  347. // *
  348. //*******************************************************************************/
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线视频中文字幕 | 成人av免费在线观看 | 中文字幕在线精品 | 免费视频久久久久 | 亚洲国产精品一区 | 99久久精品国产一区二区三区 | 欧美八区 | 国产一级一级毛片 | 国产一卡二卡三卡 | 国产成人精品一区二区 | 欧美一极视频 | 亚洲三级在线 | 99精品在线| 又爽又黄axxx片免费观看 | 男人天堂国产 | 久久国产综合 | 男人的天堂视频网站 | 国产免费一区二区 | 在线欧美小视频 | 国产视频二区在线观看 | 91高清视频在线观看 | 中文字幕爱爱视频 | 美国黄色毛片 | 亚洲国产精品人人爽夜夜爽 | 免费污视频 | 国产成人精品综合 | 日本韩国电影免费观看 | 国产一级大片 | 97国产精品 | 免费观看毛片 | 免费视频一区二区 | 国产一区二区三区日韩 | 精品91久久| 成人性视频免费网站 | 男女啪啪高潮无遮挡免费动态 | 成人在线视频一区二区三区 | 国产成在线观看免费视频 | 欧美午夜剧场 | 欧美成人精品欧美一级 | 产真a观专区 | 国产精品区一区二 |