×
嵌入式 > 技术百科 > 详情

stm8 rtc时钟

发布时间:2020-06-20 发布时间:
|

stm8 rtc时钟可以使用内部低频时钟源,或者外部低速32768Hz时钟源,关于rtc部分代码如下:


  1. #include   

  2. #include   

  3.   

  4. void init_rtc(void)  

  5. {  

  6.     RTC_InitTypeDef RTC_InitStr;  

  7.     RTC_TimeTypeDef RTC_TimeStr;  

  8.     RTC_DateTypeDef RTC_DateStr;  

  9.   

  10. #if 0  

  11.     /* LSI */  

  12.     CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1);  

  13.     CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);  

  14.   

  15.     RTC_InitStr.RTC_HourFormat = RTC_HourFormat_24;  

  16.     RTC_InitStr.RTC_AsynchPrediv = 0x7C;  

  17.     RTC_InitStr.RTC_SynchPrediv = 0x012F;  

  18.     RTC_Init(&RTC_InitStr);  

  19. #else  

  20.     /* LSE */  

  21.     CLK_LSEConfig(CLK_LSE_ON);  

  22.     while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET);  

  23.     CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);  

  24.     CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);  

  25.   

  26.     RTC_InitStr.RTC_HourFormat = RTC_HourFormat_24;  

  27.     RTC_InitStr.RTC_AsynchPrediv = 127;  

  28.     RTC_InitStr.RTC_SynchPrediv = 255;  

  29.     RTC_Init(&RTC_InitStr);  

  30. #endif  

  31.   

  32.     RTC_TimeStructInit(&RTC_TimeStr);  

  33.     RTC_TimeStr.RTC_Hours = 00;  

  34.     RTC_TimeStr.RTC_Minutes = 00;  

  35.     RTC_TimeStr.RTC_Seconds = 00;  

  36.     RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);  

  37.   

  38.     RTC_DateStructInit(&RTC_DateStr);  

  39.     RTC_DateStr.RTC_WeekDay = RTC_Weekday_Tuesday;  

  40.     RTC_DateStr.RTC_Date = 2;  

  41.     RTC_DateStr.RTC_Month = RTC_Month_February;  

  42.     RTC_DateStr.RTC_Year = 16;  

  43.     RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);  

  44. }  

  45.   

  46. void rtc_get_time(char *buf)  

  47. {  

  48.     RTC_TimeTypeDef RTC_TimeStr;  

  49.   

  50.     while (RTC_WaitForSynchro() != SUCCESS);  

  51.   

  52.     RTC_GetTime(RTC_Format_BIN, &RTC_TimeStr);  

  53.   

  54.     sprintf(buf, "%02d:%02d:%02d",  

  55.         RTC_TimeStr.RTC_Hours & 0xff, RTC_TimeStr.RTC_Minutes & 0xff, RTC_TimeStr.RTC_Seconds & 0xff);  

  56. }  

  57.   

  58. void rtc_get_date(char *buf)  

  59. {  

  60.     RTC_DateTypeDef RTC_DateStr;  

  61.   

  62.     while (RTC_WaitForSynchro() != SUCCESS);  

  63.   

  64.     RTC_GetDate(RTC_Format_BIN, &RTC_DateStr);  

  65.   

  66.     sprintf(buf, "%04d-%02d-%02d",  

  67.         (RTC_DateStr.RTC_Year & 0xff) + 2000, RTC_DateStr.RTC_Month & 0xff, RTC_DateStr.RTC_Date & 0xff);  

  68. }  

关于rtc定时唤醒,进入halt模式使用编译器提供的halt()函数就可以了,如果需要定时唤醒,需要对rtc做相应的配置,代码如下:

  1. /* maximum wakeup time is (0xFFFF + 1) * 31.25ms = 2048s */  

  2. void init_rtc(void)  

  3. {  

  4.     CLK_LSEConfig(CLK_LSE_ON);  

  5.   

  6.     while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET);  

  7.   

  8.     CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_64);  

  9.   

  10.     CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);  

  11.   

  12.     RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);  

  13.   

  14.     RTC_ITConfig(RTC_IT_WUT, ENABLE);  

  15.   

  16.     enableInterrupts();  

  17.       

  18.     RTC_SetWakeUpCounter(800);  

  19.       

  20.     RTC_WakeUpCmd(ENABLE);  

  21. }  

这里配置的是800×31.25=25s唤醒一次,唤醒之后,触发rtc唤醒中断,可以在中断函数中做相关处理,如果需要再次进入halt模式,重新调用halt()函数就可以了。

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分拣机器人的工作原理是什么