新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 RTC小結

        STM32 RTC小結

        作者: 時間:2016-11-11 來源:網絡 收藏
        RTC可以用來設置實時時鐘,并產生秒中斷或鬧鐘中斷。在芯片有電源供電的情況下,系統掉電后仍能保持時鐘計時。

        RTC設置需要涉及對電源(PWR)、備份區域(BKP)和RCC部分寄存器的改寫。

        本文引用地址:http://www.104case.com/article/201611/317055.htm

        RTC所需的晶振在RCC部分的寄存器中選擇。在芯片時鐘系統中對RTC的時鐘提供如下圖所示。RTC時鐘可以從LSI, LSE和HSE分頻中選擇。這些需要對RCC寄存器的一些位進行設置。

        RTC的預分頻器、計數器和鬧鐘寄存器在備份區域中,以保證系統掉電后,在電池供電時仍能計數,如下圖所示。在電源部分,系統復位后,將禁止向備份區域寫入內容,因此,若要配置RTC,需要在電源部分允許對備份區域的寫入。

        備份區中有留給用戶寫入數據的空間。由于掉電后備份區中的內容仍保持,可以通過對用戶寫入數據的比較,知道備份區中的設置(尤其是RTC設置)是否存在。若不存在,需要清空備份區并重新寫入;若存在,則只需再次寫入備份區之外的RTC_CR。

        由于用戶是通過APB1接口讀寫RTC寄存器,在上電之后,需要先等待APB1接口與RTC同步完成,否則讀取的RTC值可能有誤;完成同步以RTC_CRL的RSF位置1為標志。對于寫RTC寄存器,先查詢RTC_CRL的RTOFF位,直到為1,說明上一次操作已經完成;再CNF置1,進入配置模式;寫寄存器;CNF置0,退出配置模式;等待RTOFF位為1,說明本次寫入已經完成。

        下面貼一個可以跑通的簡化流程,完成按秒計數的功能。

        1. #include"stm32f10x.h"
        2. #include"stm32_eval.h"
        3. #include
        4. #include"stm3210c_eval_lcd.h"
        5. volatileuint32_tTimeDisplay=0;
        6. intmain(void)
        7. {
        8. /*!
        9. thisisdonethroughSystemInit()functionwhichiscalledfromstartup
        10. file(startup_stm32f10x_xx.s)beforetobranchtoapplicationmain.
        11. ToreconfigurethedefaultsettingofSystemInit()function,referto
        12. system_stm32f10x.cfile
        13. */
        14. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
        15. PWR_BackupAccessCmd(ENABLE);
        16. NVIC_Configuration();
        17. STM3210C_LCD_Init();
        18. LCD_Clear(LCD_COLOR_WHITE);
        19. LCD_SetTextColor(LCD_COLOR_BLUE);
        20. if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)
        21. {
        22. RTC_Configuration();
        23. Time_Adjust();
        24. BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
        25. }
        26. else
        27. {
        28. RTC_WaitForSynchro();
        29. RTC_WaitForLastTask();
        30. RTC_ITConfig(RTC_IT_SEC,ENABLE);
        31. RTC_WaitForLastTask();
        32. }
        33. RCC_ClearFlag();
        34. Time_Show();
        35. }
        36. voidNVIC_Configuration(void)
        37. {
        38. NVIC_InitTypeDefNVIC_InitStructure;
        39. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        40. NVIC_InitStructure.NVIC_IRQChannel=RTC_IRQn;
        41. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        42. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        43. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        44. NVIC_Init(&NVIC_InitStructure);
        45. }
        46. voidRTC_Configuration(void)
        47. {
        48. BKP_DeInit();
        49. RCC_LSEConfig(RCC_LSE_ON);
        50. while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)
        51. {}
        52. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
        53. RCC_RTCCLKCmd(ENABLE);
        54. RTC_WaitForSynchro();
        55. RTC_WaitForLastTask();
        56. RTC_ITConfig(RTC_IT_SEC,ENABLE);
        57. RTC_WaitForLastTask();
        58. RTC_SetPrescaler(32767);/*RTCperiod=RTCCLK/RTC_PR=(32.768KHz)/(32767+1)*/
        59. RTC_WaitForLastTask();
        60. }
        61. uint32_tTime_Regulate(void)
        62. {
        63. uint32_tTmp_HH=0x00,Tmp_MM=0x00,Tmp_SS=0x00;
        64. return((Tmp_HH*3600+Tmp_MM*60+Tmp_SS));
        65. }
        66. voidTime_Adjust(void)
        67. {
        68. RTC_WaitForLastTask();
        69. RTC_SetCounter(0);//Time_Regulate());
        70. RTC_WaitForLastTask();
        71. }
        72. voidTime_Display(uint32_tTimeVar)
        73. {
        74. uint32_tTHH=0,TMM=0,TSS=0;
        75. charbuf[15];
        76. /*ResetRTCCounterwhenTimeis23:59:59*/
        77. if(TimeVar==0x0001517F)
        78. {
        79. RTC_WaitForLastTask();
        80. RTC_SetCounter(0x0);
        81. /*WaituntillastwriteoperationonRTCregistershasfinished*/
        82. RTC_WaitForLastTask();
        83. }
        84. /*Computehours*/
        85. THH=TimeVar/3600;
        86. /*Computeminutes*/
        87. TMM=(TimeVar%3600)/60;
        88. /*Computeseconds*/
        89. TSS=(TimeVar%3600)%60;
        90. sprintf(buf,"%0.2d:%0.2d:%0.2d/r",THH,TMM,TSS);
        91. LCD_DisplayStringLine(LCD_LINE_2,buf);
        92. //printf("Time:%0.2d:%0.2d:%0.2d/r",THH,TMM,TSS);
        93. }
        94. /**
        95. *@briefShowsthecurrenttime(HH:MM:SS)ontheHyperterminal.
        96. *@paramNone
        97. *@retvalNone
        98. */
        99. voidTime_Show(void)
        100. {
        101. //printf("/n/r");
        102. /*Infiniteloop*/
        103. while(1)
        104. {
        105. /*If1shasbeenelapased*/
        106. if(TimeDisplay==1)
        107. {
        108. uint32_tCounter=0;
        109. Counter=RTC_GetCounter();
        110. Time_Display(Counter);
        111. TimeDisplay=0;
        112. }
        113. }
        114. }
        115. voidRTC_IRQHandler(void)
        116. {
        117. if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)
        118. {
        119. RTC_WaitForLastTask();
        120. /*CleartheRTCSecondinterrupt*/
        121. RTC_ClearITPendingBit(RTC_IT_SEC);
        122. /*ToggleLED1*/
        123. //STM_EVAL_LEDToggle(LED1);
        124. /*Enabletimeupdate*/
        125. TimeDisplay=1;
        126. /*WaituntillastwriteoperationonRTCregistershasfinished*/
        127. RTC_WaitForLastTask();
        128. }
        129. }




        關鍵詞: STM32RTC小

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 金堂县| 新源县| 宁明县| 宁晋县| 宜兰市| 沂水县| 微博| 金华市| 德格县| 社会| 兴和县| 长汀县| 湘潭县| 浦城县| 孝昌县| 南漳县| 响水县| 朝阳县| 历史| 元朗区| 仁寿县| 昆明市| 浪卡子县| 项城市| 柘荣县| 正宁县| 广东省| 甘南县| 永和县| 玉树县| 滁州市| 娄烦县| 慈利县| 东丰县| 汉寿县| 丹江口市| 拉孜县| 沙雅县| 兰坪| 视频| 文山县|