summaryrefslogtreecommitdiff
path: root/app/time/time.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/time/time.c')
-rw-r--r--app/time/time.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/app/time/time.c b/app/time/time.c
new file mode 100644
index 0000000..4159f44
--- /dev/null
+++ b/app/time/time.c
@@ -0,0 +1,160 @@
+
+#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);
+}