您的位置 首页 数字

STM32 RTC小结

RTC可以用来设置实时时钟,并产生秒中断或闹钟中断。在芯片有电源供电的情况下,系统掉电后仍能保持时钟计时。RTC设置需要涉及对电源(PWR…

RTC能够用来设置实时时钟,并发生秒中止或闹钟中止。在芯片有电源供电的情况下,体系掉电后仍能坚持时钟计时。

RTC设置需求触及对电源(PWR)、备份区域(BKP)和RCC部分寄存器的改写。

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(&NV%&&&&&%_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. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/275307.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部