单片机
返回首页

stm8 rtc时钟

2017-02-04 来源:eefocus

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()函数就可以了。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 开关电源的基本组成及工作原理

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何构建一个触摸传感器电路

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章