#include "time.h" #include "stm32f0xx_conf.h" /* Uncomment the corresponding line to select the RTC Clock source */ #define RTC_CLOCK_SOURCE_LSE /* LSE used as RTC source clock */ //#define RTC_CLOCK_SOURCE_LSI // LSI used as RTC source clock. The RTC Clock // may varies due to LSI frequency dispersion #define BKP_VALUE 0x32F0 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ __IO uint32_t AsynchPrediv = 0, SynchPrediv = 0; /* Private function prototypes -----------------------------------------------*/ static void RTC_Config(void); static void RTC_TimeRegulate(void); // - калибровку RTC как делать? // ---------------------------------------------------------------------------- // // ---------------------------------------------------------------------------- void TimeInit (void) { RTC_InitTypeDef RTC_InitStructure; if (RTC_ReadBackupRegister(RTC_BKP_DR0) != BKP_VALUE) //if (SynchPrediv == 0) { /* RTC configuration */ RTC_Config(); /* Configure the RTC data register and RTC prescaler */ RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv; RTC_InitStructure.RTC_SynchPrediv = SynchPrediv; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; /* Check on RTC init */ if (RTC_Init(&RTC_InitStructure) == ERROR) { // printf("\n\r /!\\***** RTC Prescaler Config failed ********/!\\ \n\r"); } /* Configure the time register */ RTC_TimeRegulate(); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { //printf("\r\n Power On Reset occurred....\n\r"); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { // printf("\r\n External Reset occurred....\n\r"); } //printf("\n\r No need to configure RTC....\n\r"); /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); #ifdef RTC_CLOCK_SOURCE_LSI /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); #endif /* RTC_CLOCK_SOURCE_LSI */ /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Clear the RTC Alarm Flag */ RTC_ClearFlag(RTC_FLAG_ALRAF); /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */ //EXTI_ClearITPendingBit(EXTI_Line17); /* Display the RTC Time and Alarm */ //RTC_TimeShow(); //RTC_AlarmShow(); } } // ---------------------------------------------------------------------------- // // ---------------------------------------------------------------------------- static void RTC_Config(void) { /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); #if defined (RTC_CLOCK_SOURCE_LSI) /* LSI used as RTC source clock*/ /* The RTC Clock may varies due to LSI frequency dispersion. */ /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); SynchPrediv = 0x18F; AsynchPrediv = 0x63; #elif defined (RTC_CLOCK_SOURCE_LSE) /* LSE used as RTC source clock */ /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); SynchPrediv = 0xFF; AsynchPrediv = 0x7F; #else #error Please select the RTC Clock source inside the main.c file #endif /* RTC_CLOCK_SOURCE_LSI */ /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); } // ---------------------------------------------------------------------------- // // ---------------------------------------------------------------------------- static void RTC_TimeRegulate ( void ) { RTC_TimeTypeDef RTC_TimeStructure; RTC_TimeStructure.RTC_Hours = 14; RTC_TimeStructure.RTC_Minutes = 01; RTC_TimeStructure.RTC_Seconds = 00; RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure); /* Indicator for the RTC configuration */ RTC_WriteBackupRegister(RTC_BKP_DR0, BKP_VALUE); }