void initRTC() { mSecondsAlarm.AlarmCount = 0; mSecondsAlarm.AlarmInterval = 0; mSecondsAlarm.CurrentValue = 0; mSecondsAlarm.cb_func = 0; mMinutesAlarm.AlarmCount = 0; mMinutesAlarm.AlarmInterval = 0; mMinutesAlarm.CurrentValue = 0; mMinutesAlarm.cb_func = 0; mHoursAlarm.AlarmCount = 0; mHoursAlarm.AlarmInterval = 0; mHoursAlarm.CurrentValue = 0; mHoursAlarm.cb_func = 0; /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) { /* Backup data register value is not correct or not yet programmed (when the first time the program is executed) */ t_print("Configuring RTC....\n"); RTC_Configuration(); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); } else { t_print("RTC has time....\n"); s_DateStructVar.Day = BKP_ReadBackupRegister(BKP_DR2); s_DateStructVar.Month = BKP_ReadBackupRegister(BKP_DR3); s_DateStructVar.Year = BKP_ReadBackupRegister(BKP_DR4); CheckForDaysElapsed(); } /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Interrupt */ NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
/** * @brief COnfiguration of RTC Registers, Selection and Enabling of * RTC clock * @param None * @retval : None */ void RTC_Configuration() { uint16_t WaitForOscSource; /*Allow access to Backup Registers*/ PWR_BackupAccessCmd(ENABLE); BKP_RTCOutputConfig(BKP_RTCOutputSource_None); if(READ_BKP_CONFIGURATION() != CONFIGURATION_DONE) { /*Enables the clock to Backup and power interface peripherals */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR, ENABLE); /* Backup Domain Reset */ BKP_DeInit(); set_time(&s_DateStructVar); set_alarm(&s_AlarmDateStructVar); //EE_Format(); /*Enable 32.768 kHz external oscillator */ RCC_LSEConfig(RCC_LSE_ON); for(WaitForOscSource = 0; WaitForOscSource < 5000; WaitForOscSource++); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* RTC Enabled */ RCC_RTCCLKCmd(ENABLE); RTC_WaitForLastTask(); /*Wait for RTC registers synchronisation */ RTC_WaitForSynchro(); RTC_WaitForLastTask(); /* Setting RTC Interrupts-Seconds interrupt enabled */ /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC , ENABLE); RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1 sec */ RTC_SetPrescaler(32765); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Prescaler is set to 32766 instead of 32768 to compensate for lower as well as higher frequencies*/ RTC_WaitForLastTask(); WRITE_BKP_CONFIGURATION(CONFIGURATION_DONE); } else { /* PWR and BKP clocks selection */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); for(WaitForOscSource = 0; WaitForOscSource < 5000; WaitForOscSource++); RTC_WaitForLastTask(); /* Enable the RTC Alarm */ RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); } /* Check if how many days are elapsed in power down/Low Power Mode- Updates Date that many Times*/ CheckForDaysElapsed(); }
/******************************************************************************* * Function Name : RTC_Configuration * Description : COnfiguration of RTC Registers, Selection and Enabling of * RTC clock * Input : None * Output : None * Return : None *******************************************************************************/ void RTC_Configuration() { u16 u16_WaitForOscSource; /*Allow access to Backup Registers*/ PWR_BackupAccessCmd(ENABLE); if(BKP_ReadBackupRegister(BKP_DR1)==CONFIGURATION_RESET) { /*Enables the clock to Backup and power interface peripherals */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE); /* Backup Domain Reset */ BKP_DeInit(); s_DateStructVar.u8_Month=DEFAULT_MONTH ; s_DateStructVar.u8_Day=DEFAULT_DAY; s_DateStructVar.u16_Year=DEFAULT_YEAR; u16_SummerTimeCorrect = OCTOBER_FLAG_SET; BKP_WriteBackupRegister(BKP_DR7,u16_SummerTimeCorrect); BKP_WriteBackupRegister(BKP_DR2,s_DateStructVar.u8_Month); BKP_WriteBackupRegister(BKP_DR3,s_DateStructVar.u8_Day); BKP_WriteBackupRegister(BKP_DR4,s_DateStructVar.u16_Year); BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE); u8_TamperNumber=0; BKP_WriteBackupRegister(BKP_DR5,u8_TamperNumber); /*Enable 32.768 kHz external oscillator */ RCC_LSEConfig(RCC_LSE_ON); for(u16_WaitForOscSource=0;u16_WaitForOscSource<5000;u16_WaitForOscSource++) { } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* RTC Enabled */ RCC_RTCCLKCmd(ENABLE); RTC_WaitForLastTask(); /*Wait for RTC registers synchronisation */ RTC_WaitForSynchro(); RTC_WaitForLastTask(); /* Setting RTC Interrupts-Seconds interrupt enabled */ /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC , ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); BKP_WriteBackupRegister(BKP_DR6, 1); /* Set RTC prescaler: set RTC period to 1 sec */ RTC_SetPrescaler(32765); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Prescaler is set to 32766 instead of 32768 to compensate for lower as well as higher frequencies*/ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set default system time to 09 : 24 : 00 */ SetTime(DEFAULT_HOURS,DEFAULT_MINUTES,DEFAULT_SECONDS); BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE); } else { //BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_RESET); /* PWR and BKP clocks selection */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); for(u16_WaitForOscSource=0;u16_WaitForOscSource<5000;u16_WaitForOscSource++); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); } /* Check if how many days are elapsed in power down/Low Power Mode- Updates Date that many Times*/ CheckForDaysElapsed(); u8_ClockSource = BKP_ReadBackupRegister(BKP_DR6); u8_TamperNumber = BKP_ReadBackupRegister(BKP_DR5); s_DateStructVar.u8_Month = BKP_ReadBackupRegister(BKP_DR2); s_DateStructVar.u8_Day = BKP_ReadBackupRegister(BKP_DR3); s_DateStructVar.u16_Year = BKP_ReadBackupRegister(BKP_DR4); u16_SummerTimeCorrect = BKP_ReadBackupRegister(BKP_DR7); s_AlarmDateStructVar.u8_Month = BKP_ReadBackupRegister(BKP_DR8); s_AlarmDateStructVar.u8_Day = BKP_ReadBackupRegister(BKP_DR9); s_AlarmDateStructVar.u16_Year = BKP_ReadBackupRegister(BKP_DR10); }
/** * @brief COnfiguration of RTC Registers, Selection and Enabling of * RTC clock * @param None * @retval : None */ void RTC_Configuration() { uint16_t WaitForOscSource; /*Allow access to Backup Registers*/ PWR_BackupAccessCmd(ENABLE); if(BKP_ReadBackupRegister(BKP_DR1)==CONFIGURATION_RESET) { /*Enables the clock to Backup and power interface peripherals */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE); if(TotalMenuPointer == 1) { /* Backup Domain Reset */ BKP_DeInit(); s_DateStructVar.Month=DEFAULT_MONTH ; s_DateStructVar.Day=DEFAULT_DAY; s_DateStructVar.Year=DEFAULT_YEAR; SummerTimeCorrect = OCTOBER_FLAG_SET; BKP_WriteBackupRegister(BKP_DR7,SummerTimeCorrect); BKP_WriteBackupRegister(BKP_DR2,s_DateStructVar.Month); BKP_WriteBackupRegister(BKP_DR3,s_DateStructVar.Day); BKP_WriteBackupRegister(BKP_DR4,s_DateStructVar.Year); BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE); LCD_Clear(Blue2); LCD_SetBackColor(Blue2); LCD_SetTextColor(White); LCD_DisplayString(Line2,Column0,"Please wait......"); LCD_DisplayString(Line4,Column0,"Synchronization may"); LCD_DisplayString(Line6,Column0,"take upto a minute"); EE_Format(); TamperNumber=0; BKP_WriteBackupRegister(BKP_DR5,TamperNumber); } /*Enable 32.768 kHz external oscillator */ RCC_LSEConfig(RCC_LSE_ON); for(WaitForOscSource=0;WaitForOscSource<5000;WaitForOscSource++) { } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* RTC Enabled */ RCC_RTCCLKCmd(ENABLE); RTC_WaitForLastTask(); /*Wait for RTC registers synchronisation */ RTC_WaitForSynchro(); RTC_WaitForLastTask(); /* Setting RTC Interrupts-Seconds interrupt enabled */ /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC , ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); if(TotalMenuPointer==1 || TotalMenuPointer==6) { BKP_WriteBackupRegister(BKP_DR6, 1); /* Set RTC prescaler: set RTC period to 1 sec */ RTC_SetPrescaler(32765); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Prescaler is set to 32766 instead of 32768 to compensate for lower as well as higher frequencies*/ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } if( TotalMenuPointer==7) { BKP_WriteBackupRegister(BKP_DR6, 2); /* Set RTC prescaler: set RTC period to 1 sec */ RTC_SetPrescaler(49); /* RTC period = RTCCLK/RTC_PR = (50 Hz)/(49+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } if(TotalMenuPointer==8) { BKP_WriteBackupRegister(BKP_DR6, 3); /* Set RTC prescaler: set RTC period to 1 sec */ RTC_SetPrescaler(59); /* RTC period = RTCCLK/RTC_PR = (60 Hz)/(59+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } /* Set default system time to 09 : 24 : 00 */ SetTime(DEFAULT_HOURS,DEFAULT_MINUTES,DEFAULT_SECONDS); BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE); } else { /* PWR and BKP clocks selection */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); for(WaitForOscSource=0;WaitForOscSource<5000;WaitForOscSource++); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); } /* Check if how many days are elapsed in power down/Low Power Mode- Updates Date that many Times*/ CheckForDaysElapsed(); ClockSource = BKP_ReadBackupRegister(BKP_DR6); TamperNumber = BKP_ReadBackupRegister(BKP_DR5); s_DateStructVar.Month = BKP_ReadBackupRegister(BKP_DR2); s_DateStructVar.Day = BKP_ReadBackupRegister(BKP_DR3); s_DateStructVar.Year = BKP_ReadBackupRegister(BKP_DR4); SummerTimeCorrect = BKP_ReadBackupRegister(BKP_DR7); s_AlarmDateStructVar.Month = BKP_ReadBackupRegister(BKP_DR8); s_AlarmDateStructVar.Day = BKP_ReadBackupRegister(BKP_DR9); s_AlarmDateStructVar.Year = BKP_ReadBackupRegister(BKP_DR10); }
// init RTC void rtc_init(void) { uint16_t WaitForOscSource; /*RTC_NVIC Configuration */ RTC_NVIC_Configuration(); /*Enables the clock to Backup and power interface peripherals */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE); /*Allow access to Backup Registers*/ PWR_BackupAccessCmd(ENABLE); if(BKP_ReadBackupRegister(BKP_DR1)== (uint16_t)(~CONFIGURATION_DONE)) { /*Enables the clock to Backup and power interface peripherals */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE); /* Backup Domain Reset */ BKP_DeInit(); systime.Month=DEFAULT_MONTH; systime.Day=DEFAULT_DAY; systime.Year=DEFAULT_YEAR; BKP_ModifyBackupRegister(BKP_DR3, (systime.Month << 8) | systime.Day); BKP_ModifyBackupRegister(BKP_DR5, systime.Year); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* enter config mode */ RTC_EnterConfigMode(); /*Enable 32.768 kHz external oscillator */ RCC_LSEConfig(RCC_LSE_ON); /* select clock source for RTC */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* RTC Enabled */ RCC_RTCCLKCmd(ENABLE); /*Wait for RTC registers synchronisation */ RTC_WaitForSynchro(); RTC_WaitForLastTask(); /* Setting RTC Interrupts-Seconds interrupt enabled */ /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC , ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* init prescale value*/ RTC_SetPrescaler(32767); /* exit config mode */ RTC_ExitConfigMode(); /* Set default system time to 09 : 24 : 00 */ SetTime(DEFAULT_HOURS,DEFAULT_MINUTES); BKP_ModifyBackupRegister(BKP_DR1, CONFIGURATION_DONE); } else { /* PWR and BKP clocks selection */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); for(WaitForOscSource=0;WaitForOscSource<5000;WaitForOscSource++); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); } /* Check if how many days are elapsed in power down/Low Power Mode- Updates Date that many Times*/ CheckForDaysElapsed(); systime.Month = (uint8_t)(BKP_ReadBackupRegister(BKP_DR3) >> 8); systime.Day = (uint8_t)BKP_ReadBackupRegister(BKP_DR3); systime.Year = (uint8_t)BKP_ReadBackupRegister(BKP_DR5); BKP_RTCOutputConfig(BKP_RTCOutputSource_None); }