/** * @brief Configures RTC clock source and prescaler. * @param None * @retval None */ void RTC_Configuration(void) { /* RTC clock source configuration ----------------------------------------*/ /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE OSC */ RCC_LSICmd(ENABLE); /* Wait till LSE is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* RTC configuration -----------------------------------------------------*/ /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Set the RTC time base to 1s */ RTC_SetPrescaler(32767); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_ALR, ENABLE); RTC_WaitForLastTask(); }
void RTC_Configuration(void) { /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); // Select HSE/128 as RTC Clock Source RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ // RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec 1ms */ RTC_SetPrescaler(62); /*62499 RTC period = RTCCLK/RTC_PR = 8M / 128 = 62.5kHz ) -> (62499+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
/** * @file RTC_Configuration * @brief Configures the RTC. * @param 无 * @retval 无 */ static void RTC_Configuration(void) { //启用PWR和BKP的时钟(from APB1) RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //后备域解锁 PWR_BackupAccessCmd(ENABLE); //备份寄存器模块复位 BKP_DeInit(); //外部32.768K时钟使能 RCC_LSEConfig(RCC_LSE_ON); //等待稳定 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} //RTC时钟源配置成LSE(外部32.768K) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RTC开启 RCC_RTCCLKCmd(ENABLE); //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器 RTC_WaitForSynchro(); //读写寄存器前,要确定上一个操作已经结束 RTC_WaitForLastTask(); //使能秒中断 RTC_ITConfig(RTC_IT_SEC, ENABLE); //等待寄存器写入完成 RTC_WaitForLastTask(); //设置RTC分频器,使RTC时钟为1Hz //RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) RTC_SetPrescaler(32767); //等待写入完成 RTC_WaitForLastTask(); }
void RTC_Configuration(void) { /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
void RTC_Configuration(void) { /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); #ifdef RTCClockSource_LSI /* Enable LSI */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select LSI as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); #elif defined RTCClockSource_LSE /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #endif /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ /* Set RTC prescaler: set RTC period to 1sec */ #ifdef RTCClockSource_LSI RTC_SetPrescaler(31999); /* RTC period = RTCCLK/RTC_PR = (32.000 KHz)/(31999+1) */ #elif defined RTCClockSource_LSE RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ #endif // RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
// 配置RTC硬件。 void RTC_Configure(void) { /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); RCC_RTCCLKCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); #ifdef RTCClockSource_LSI /* Enable LSI */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); /* Select LSI as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); #elif defined RTCClockSource_LSE /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #endif // 上电后需要校准RTC时钟,也即准确计算出RTC的周期时长。 RTC_Calibrate(); #ifdef RTCClockOutput_Enable /* Disable the Tamper Pin */ BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled */ /* Enable RTC Clock Output on Tamper Pin */ BKP_RTCCalibrationClockOutputCmd(ENABLE); #endif /*允许RTC报警中断*/ RTC_ITConfig(RTC_IT_ALR, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
uint8_t RTC_AutoTest(void) { uint8_t i = 0; /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { Delay_us(50000); i++; if(i>100) //5秒都还没起振,坏了 { return 0; } } /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization * 因为RTC时钟是低速的,内环时钟是高速的,所以要同步 */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) = 1HZ */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); return 1; }
void SetRtcTime(void) { /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); #ifdef RTC_LSE /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #else /* 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); #endif /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); printf("\r\n RTC configured...."); /* Adjust time by values entred by the user on the hyperterminal */ // Time_Adjust(); Time_SetCalendarTime(time_set); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
static void rtcConfig(void) { /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* 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); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); #ifndef PRECISION_IN_MS /* Set RTC prescaler: set RTC period to 1 sec */ RTC_SetPrescaler(40000); //LSI default is 40k HZ #else /* Set RTC prescaler: set RTC period to 1ms */ RTC_SetPrescaler(40); //LSI default is 40k HZ #endif /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* To output second signal on Tamper pin, the tamper functionality * must be disabled (by default this functionality is disabled) */ //BKP_TamperPinCmd(DISABLE); /* Enable the RTC Second Output on Tamper Pin */ //BKP_RTCOutputConfig(BKP_RTCOutputSource_Second); }
/* ************************************************************ * 函数名称: RTC_Init * * 函数功能: RTC初始化 * * 入口参数: 无 * * 返回参数: 无 * * 说明: ************************************************************ */ _Bool RTC_Init(void) { #if(USE_EXT_RCC == 1) unsigned char errCount = 0; #endif RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 BKP_DeInit(); //复位备份区域 #if(USE_EXT_RCC == 1) RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振 while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && errCount < 250) //检查指定的RCC标志位设置与否,等待低速晶振就绪 { errCount++; DelayMs(10); } if(errCount >= 250) return 1; //初始化时钟失败,晶振有问题 #endif #if(USE_EXT_RCC == 1) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 #else RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128); //设置RTC时钟(HSE/128),选择HES作为RTC时钟 #endif RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_WaitForSynchro(); //等待RTC寄存器同步 RTC_ITConfig(RTC_IT_ALR, ENABLE); //使能RTC闹钟中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_EnterConfigMode(); //允许配置 #if(USE_EXT_RCC == 1) RTC_SetPrescaler(32767); //设置RTC预分频的值 #else RTC_SetPrescaler(HSE_VALUE / 128 - 1); //设置RTC预分频的值 #endif RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_SetCounter(0); //设置RTC计数器的值 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_ExitConfigMode(); //退出配置模式 RTC_NVIC_Init(); return 0; }
/** * @brief Configures the RTC. * @param None * @retval None */ void RTC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the RTC Interrupt */ 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); /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
/* * 函数名:RTC_Configuration * 描述 :配置RTC * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void RTC_Configuration(void) { /* Enable PWR(电源控制) and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain * 允许进入后备区域进行写操作,因为后备寄存器中放的是重要的数据,默认是不允许往里面写入值的 */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain *将后背寄存器的寄存器值设为默认值 */ BKP_DeInit(); /* Enable LSE *打开外部低速晶振,RTC可以选择的时钟源是外部和内部低速晶振及外部高速晶振,这里我们选择外部低速晶振32768HZ */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready *等待外部低速晶振准备就序 */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* Select LSE as RTC Clock Source * 选择外部低速晶振为RTC的时钟源 */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization * 等待RTC寄存器与RTC的APB时钟同步 */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished * 等待上次对RTC寄存器配置完成 */ RTC_WaitForLastTask(); /* Enable the RTC Second * 使能RTC中断_秒中断 */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec * 设置RTC的预分频值,因为外部低速晶振是32768,所以选择RTC计数器计数频率 * = RTCCLK/RTC_PR =(32.768 KHz)/(32767+1) */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
/******************************************************************************* * Function Name : RTC_Configuration * Description : Configures the RTC. * Input : None * Output : None * Return : 0 reday,-1 error. *******************************************************************************/ int RTC_Configuration(void) { u32 count=0x200000; /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) ); if ( count == 0 ) { rt_kprintf("RTC no init!"); return -1; } /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ /* 使能RTC的秒中断 */ //RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ /* 等待上一次对RTC寄存器的写操作完成 */ //RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); return 0; }
void RTC_STOP_WakeUp(void) { /* Enable PWR and BKP clocks */ /* PWR时钟(电源控制)与BKP时钟(RTC后备寄存器)使能 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* RTC clock source configuration ----------------------------------------*/ /* Reset Backup Domain */ BKP_DeInit(); /* Enable 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); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* RTC configuration -----------------------------------------------------*/ /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Set the RTC time base to 1s */ RTC_SetPrescaler(32767); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Alarm interrupt */ RTC_ITConfig(RTC_IT_ALR, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); RTC_ClearFlag(RTC_FLAG_SEC); while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET); /* Alarm in 5 second */ RTC_SetAlarm(RTC_GetCounter()+ 5); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
void RTC_Configuration(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_DeInit(); RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); RTC_SetPrescaler(32767); RTC_WaitForLastTask(); }
/** * @brief Configures RTC clock source and prescaler. * @param None * @retval None */ void RTC_Configuration(void) { /* Check if the StandBy flag is set */ if(PWR_GetFlagStatus(PWR_FLAG_SB) != RESET) {/* System resumed from STANDBY mode */ /* Turn on LD4 */ STM32vldiscovery_LEDOn(LED4); /* Clear StandBy flag */ PWR_ClearFlag(PWR_FLAG_SB); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* No need to configure the RTC as the RTC configuration(clock source, enable, prescaler,...) is kept after wake-up from STANDBY */ } else {/* StandBy flag is not set */ /* RTC clock source configuration ----------------------------------------*/ /* Reset Backup Domain */ BKP_DeInit(); /* Enable 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); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* RTC configuration -----------------------------------------------------*/ /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Set the RTC time base to 1s */ RTC_SetPrescaler(32767); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } }
uint08 RTC_Init(void) { //检查是不是第一次配置时钟 uint08 temp=0; if ( BKP_ReadBackupRegister(BKP_DR1) != 0x5050 ) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎 { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 BKP_DeInit(); //复位备份区域 RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振 while ( RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && temp< 252) //检查指定的RCC标志位设置与否,等待低速晶振就绪 { temp++; //delay_ms(10); //OSTimeDlyHMSM(0, 0, 0, 10); } if ( temp>=250 ) { return 1;//初始化时钟失败,晶振有问题 } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_WaitForSynchro(); //等待RTC寄存器同步 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_EnterConfigMode();/// 允许配置 RTC_SetPrescaler(32767); //设置RTC预分频的值 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_Set(2009,12,2,10,0,55); //设置时间 RTC_ExitConfigMode(); //退出配置模式 BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据 } else//系统继续计时 { RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 } RTC_NVIC_Config();//RCT中断分组设置 RTC_Get();//更新时间 return 0; //ok }
static void RTC_Configuration(void) { SystemInit(); /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} }
void RTCInit(void) { NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); // Allow access to BKP Domain PWR_BackupAccessCmd(ENABLE); // Reset Backup Domain BKP_DeInit(); // Enable the LSE OSC // RCC_LSEConfig(RCC_LSE_ON); // Disable the LSI OSC RCC_LSICmd(ENABLE); // Select the RTC Clock Source RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //RCC_RTCCLKSource_LSE); // Enable the RTC Clock RCC_RTCCLKCmd(ENABLE); // Wait for RTC registers synchronization RTC_WaitForSynchro(); // Wait until last write operation on RTC registers has finished RTC_WaitForLastTask(); // Enable the RTC overflow interrupt RTC_ITConfig(RTC_IT_SEC, ENABLE); //Set 32768 prescaler - for one second interupt RTC_SetPrescaler(0x7FFF); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 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); }
u8 RTC_Init(void) { //检查是不是第一次配置时钟 u8 temp=0; RTC_NVIC_Config(); //if(BKP->DR1!=0X5050)//第一次配置 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎 { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问 BKP_DeInit(); //将外设BKP的全部寄存器重设为缺省值 RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪 { temp++; delay_ms(10); } if(temp>=250)return 1;//初始化时钟失败,晶振有问题 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_SetPrescaler(32767); //设置RTC预分频的值 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_Set(2009,12,2,10,0,55); //设置时间 BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据 } else//系统继续计时 { RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 } RTC_Get();//更新时间 RCC_ClearFlag(); //清除RCC的复位标志位 return 0; //ok }
//extern void flash_write_time_volitage(u8 addr_index,uint16_t volitage,u8 year_H,u8 year_L,u8 month_H,u8 month_L,u8 day_H,u8 day_L,u8 hh_H,u8 hh_L,u8 mm_H,u8 mm_L,u8 ss_H,u8 ss_L ) ; void operating_12864_system (void) //按键操作和界面切换 { u16 u16_WaitForOscSource,startv=0; if(rcc_flag==0) { if(k1==key_ok) { k1=key_none; rcc_flag=1; DebugMenu(1); } if(k1==key_cancel) { k1=key_none; flag_i=1; voltage=0; Alarm_flag_1=0; BUZZER_off; Fault_led_off; Relay_off; // buzzer_tick_flag=1; } } if(rcc_flag==1) { // Delay_ms(1000); // flag_system=1; if(flag_debug==0) { flag_debug=1; } switch (k1) { case key_down: k1=key_none; flag_debug++; if(flag_debug>4) { flag_debug=1; } DebugMenu(flag_debug); // Delay_ms(20); break; case key_up: k1=key_none; flag_debug--; if(flag_debug==0) { flag_debug=4; } DebugMenu(flag_debug); // Delay_ms(20); break; case key_cancel: rcc_flag=0; flag_debug=1; // Delay_ms(20); k1=key_none; //DebugMenu(flag_debug); break; case key_ok: k1=key_none; if(flag_debug==1) { rcc_flag=21; flag_debug=1; SecondSet(flag_debug); } if(flag_debug==2) { rcc_flag=22; flag_debug=1; SecondSystemDebug(flag_debug); } if(flag_debug==3) { rcc_flag=23; fault_num=flash_num<0?0:flash_num; // if(flash_num<0) // { // fault_num=0; // } // else{ // fault_num=flash_num; // } flash_read_time_volitage(start_addr+fault_num*14); Second_Fault_record(frecord.voltage,fault_num+1,frecord.year_H,frecord.year_L,frecord.month_H,frecord.month_L,frecord.day_H,frecord.day_L,frecord.hh_H,frecord.hh_L,frecord.mm_H,frecord.mm_L,frecord.ss_H,frecord.ss_L); // flash_read_time_volitage(start_addr+14*fault_num); // Second_Fault_record(frecord.voltage,fault_num+1,frecord.year_H,frecord.year_L,frecord.month_H,frecord.month_L,frecord.day_H,frecord.day_L,frecord.hh_H,frecord.hh_L,frecord.mm_H,frecord.mm_L,frecord.ss_H,frecord.ss_L); } if(flag_debug==4) { rcc_flag=24; Second_clear_fault_records(); } break; } } if(rcc_flag==21) { //flag_debug=1; switch (k1) { case key_down: k1=key_none; flag_debug++; if(flag_debug>2) { flag_debug=1; } SecondSet(flag_debug); // Delay_ms(20); break; case key_up: k1=key_none; flag_debug--; if(flag_debug==0) { flag_debug=2; } SecondSet(flag_debug); // Delay_ms(20); break; case key_cancel: flag_debug=0; rcc_flag=1; DebugMenu(1); // Delay_ms(20); k1=key_none; //DebugMenu(flag_debug); break; case key_ok: k1=key_none; if(flag_debug==1) { rcc_flag=31; ThirdSystemSetting(1); } if(flag_debug==2) { flag_debug=1; rcc_flag=32; ThirdBaudRateSetting(flag_debug,Device_Add,Band_Rate,Data_bits,Stop_bits); } break; } } if(rcc_flag==22) { //flag_debug=1; switch (k1) { case key_down: k1=key_none; flag_debug++; if(flag_debug>4) { flag_debug=1; } SecondSystemDebug(flag_debug); // Delay_ms(20); break; case key_up: k1=key_none; flag_debug--; if(flag_debug==0) { flag_debug=4; } SecondSystemDebug(flag_debug); // Delay_ms(20); break; case key_cancel: flag_debug=1; rcc_flag=1; // Delay_ms(20); k1=key_none; DebugMenu(1); //DebugMenu(flag_debug); break; case key_ok: k1=key_none; if(flag_debug==1) { flag_debug=1; rcc_flag=33; ThirdChange(); } if(flag_debug==2) { flag_debug=1; rcc_flag=34; ThirdCorrect(); } if(flag_debug==3) { flag_debug=1; rcc_flag=35; ThirdCheck(); } if(flag_debug==4) { flag_debug=1; rcc_flag=36; ThirdReguration(1,1,1,1); } break; } } if(rcc_flag==23) { //flag_debug=1; switch (k1) { case key_down: fault_num++; if(fault_num>=50) { fault_num=0; } flash_read_time_volitage(start_addr+14*fault_num); Second_Fault_record(frecord.voltage,fault_num+1,frecord.year_H,frecord.year_L,frecord.month_H,frecord.month_L,frecord.day_H,frecord.day_L,frecord.hh_H,frecord.hh_L,frecord.mm_H,frecord.mm_L,frecord.ss_H,frecord.ss_L); // fault_num=flash_num; k1=key_none; break; case key_up: fault_num--; if(fault_num<0) { fault_num=49; } flash_read_time_volitage(start_addr+14*fault_num); Second_Fault_record(frecord.voltage,fault_num+1,frecord.year_H,frecord.year_L,frecord.month_H,frecord.month_L,frecord.day_H,frecord.day_L,frecord.hh_H,frecord.hh_L,frecord.mm_H,frecord.mm_L,frecord.ss_H,frecord.ss_L); // fault_num=flash_num; k1=key_none; break; case key_cancel: rcc_flag=1; // Delay_ms(20); flag_debug=1; k1=key_none; DebugMenu(1); //DebugMenu(flag_debug); break; case key_ok: k1=key_none; // rcc_flag=2; break; } } if(rcc_flag==24) { //flag_debug=1; switch (k1) { case key_cancel: rcc_flag=1; flag_debug=1; // Delay_ms(20); k1=key_none; DebugMenu(1); //DebugMenu(flag_debug); break; case key_ok: k1=key_none; // fi++; rcc_flag=2; //flash_cache[300]=0; // for(fi=0;fi<255;fi++) // { // flash_cache[fi]=0; // } // Delay_ms(100); // flash_write_time_volitage(0,0,0,0,0,0,0,0,0,0,0,0,0,0 ) ; // Delay_ms(500); // flash_write(0xffff,flash_num_addr); break; } } if(rcc_flag==31) { //flag_debug=1; switch (k1) { case key_down: k1=key_none; flag_debug++; if(flag_debug>2) { flag_debug=1; } ThirdSystemSetting(flag_debug); // Delay_ms(20); break; case key_up: k1=key_none; flag_debug--; if(flag_debug==0) { flag_debug=2; } ThirdSystemSetting(flag_debug); // Delay_ms(20); break; case key_cancel: flag_debug=1; rcc_flag=21; SecondSet(1); // Delay_ms(20); k1=key_none; timer.sec=ss_H*10+ss_L; timer.min=mm_H*10+mm_L; timer.hour=hh_H*10+hh_L; timer.w_date=day_H*10+day_L; timer.w_month=month_H*10+month_L; timer.w_year=(year_H*10+year_L)+2000; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); for(u16_WaitForOscSource=0;u16_WaitForOscSource<5000;u16_WaitForOscSource++) { } /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); BKP_WriteBackupRegister(BKP_DR1, 0x5A5A); RTC_Set(timer.w_year,timer.w_month,timer.w_date,timer.hour,timer.min,timer.sec); break; case key_ok: k1=key_none; if(flag_debug==1) { flag_debug=1; rcc_flag=41; FourStart(start_v); } if(flag_debug==2) { flag_debug=1; rcc_flag=42; FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); } break; } } if(rcc_flag==32) { //flag_debug=1; switch (k1) { case key_down: k1=key_none; flag_debug++; if(flag_debug>4) { flag_debug=1; } ThirdBaudRateSetting(flag_debug,Device_Add,Band_Rate,Data_bits,Stop_bits); // Delay_ms(20); break; case key_up: k1=key_none; flag_debug--; if(flag_debug==0) { flag_debug=4; } ThirdBaudRateSetting(flag_debug,Device_Add,Band_Rate,Data_bits,Stop_bits); // Delay_ms(20); break; case key_cancel: flag_debug=1; rcc_flag=21; SecondSet(1); // Delay_ms(20); k1=key_none; //DebugMenu(flag_debug); break; case key_ok: k1=key_none; if(flag_debug==1) { // flag_debug=1; rcc_flag=43; } else if(flag_debug==2) { // flag_debug=1; rcc_flag=44; } else if(flag_debug==3) { // flag_debug=1; rcc_flag=45; } else if(flag_debug==4) { // flag_debug=1; rcc_flag=46; } break; } } if(rcc_flag==33) { //flag_debug=1; switch (k1) { case key_cancel: flag_debug=1; rcc_flag=22; SecondSystemDebug(1); // Delay_ms(20); k1=key_none; //DebugMenu(flag_debug); break; case key_ok: break; } } if(rcc_flag==34) { //flag_debug=1; switch (k1) { case key_down: break; case key_up: // Delay_ms(20); break; case key_cancel: flag_debug=1; rcc_flag=22; SecondSystemDebug(1); // Delay_ms(20); k1=key_none; //DebugMenu(flag_debug); break; case key_ok: break; } } if(rcc_flag==35) { //flag_debug=1; switch (k1) { case key_down: break; case key_up: // Delay_ms(20); break; case key_cancel: flag_debug=1; rcc_flag=22; SecondSystemDebug(1); // Delay_ms(20); k1=key_none; //DebugMenu(flag_debug); break; case key_ok: break; } } if(rcc_flag==36) { //flag_debug=1; switch (k1) { case key_down: k1=key_none; flag_debug++; if(flag_debug>3) { flag_debug=1; } ThirdReguration(flag_debug,flag_Led,flag_Relay,flag_Buzzer); break; case key_up: k1=key_none; flag_debug--; if(flag_debug==0) { flag_debug=3; } ThirdReguration(flag_debug,flag_Led,flag_Relay,flag_Buzzer); break; case key_cancel: flag_debug=1; rcc_flag=22; SecondSystemDebug(1); // Delay_ms(20); k1=key_none; //DebugMenu(flag_debug); break; case key_ok: k1=key_none; if(flag_debug==1) { ++flag_Led; if(flag_Led<1) { flag_Led=2; } else if(flag_Led>2) { flag_Led=1; } ThirdReguration(1,flag_Led,flag_Relay,flag_Buzzer); } if(flag_debug==2) { ++flag_Relay; if(flag_Relay<1) { flag_Relay=2; } else if(flag_Relay>2) { flag_Relay=1; } ThirdReguration(2,flag_Led,flag_Relay,flag_Buzzer); } if(flag_debug==3) { ++flag_Buzzer; if(flag_Buzzer<1) { flag_Buzzer=2; } else if(flag_Buzzer>2) { flag_Buzzer=1; } ThirdReguration(3,flag_Led,flag_Relay,flag_Buzzer); } break; } } if(rcc_flag==41) { //flag_debug=1; switch (k1) { case key_down: if(start_v<=0) { start_v=0; } start_v-=5; FourStart(start_v); // Delay_ms(20); k1=key_none; break; case key_up: start_v+=5; FourStart(start_v); // Delay_ms(20); k1=key_none; break; case key_cancel: startv=start_v; flag_debug=1; rcc_flag=31; ThirdSystemSetting(1); k1=key_none; // flash_write_start_v(start_v); flash_write(startv,start_v_addr); break; case key_ok: break; } } if(rcc_flag==42) { //flag_debug=1; switch (k1) { case key_down: break; case key_up: break; case key_cancel: flag_debug=1; rcc_flag=31; ThirdSystemSetting(1); // Delay_ms(20); k1=key_none; //DebugMenu(flag_debug); break; case key_ok: ++flagTime; if(flagTime > 12) { flagTime = 1; } k1=key_none; break; } } /*设置时间*/ if(flagTime==1) { switch (k1) { case key_down: --ss_L; if(ss_L<0) { ss_L = 9; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++ss_L; if(ss_L>9) { ss_L = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==2) { switch (k1) { case key_down: --ss_H; if(ss_H<0) { ss_H = 6; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++ss_H; if(ss_H>6) { ss_H = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==3) { switch (k1) { case key_down: --mm_L; if(mm_L<0) { mm_L = 9; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++mm_L; if(mm_L>9) { mm_L = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==4) { switch (k1) { case key_down: --mm_H; if(mm_H<0) { mm_H = 6; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++mm_H; if(mm_H>6) { mm_H = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==5) { switch (k1) { case key_down: --hh_L; if(hh_L<0) { hh_L = 9; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++hh_L; if(hh_L>9) { hh_L = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==6) { switch (k1) { case key_down: --hh_H; if(hh_H<0) { hh_H = 2; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++hh_H; if(hh_H>2) { hh_H = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==7) { switch (k1) { case key_down: --day_L; if(day_L<0) { day_L = 9; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++day_L; if(day_L>9) { day_L = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==8) { switch (k1) { case key_down: --day_H; if(day_H<0) { day_H = 3; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++day_H; if(day_H>3) { day_H = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==9) { switch (k1) { case key_down: --month_L; if(month_L<0) { month_L = 9; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++month_L; if(month_L>9) { month_L = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==10) { switch (k1) { case key_down: --month_H; if(month_H<0) { month_H = 1; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++month_H; if(month_H>1) { month_H = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==11) { switch (k1) { case key_down: --year_L; if(year_L<0) { year_L = 9; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++year_L; if(year_L>9) { year_L = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } else if(flagTime==12) { switch (k1) { case key_down: --year_H; if(year_H<0) { year_H = 9; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; case key_up: ++year_H; if(year_H>9) { year_H = 0; } FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L); k1=key_none; break; } } if(rcc_flag==43) //设置装置号 { switch (k1) { case key_down: --Device_Add; if(Device_Add<1) { Device_Add = 255; } ThirdBaudRateSetting(1,Device_Add,Band_Rate,Data_bits,Stop_bits); k1=key_none; break; case key_up: ++Device_Add; if(Device_Add>255) { Device_Add = 1; } ThirdBaudRateSetting(1,Device_Add,Band_Rate,Data_bits,Stop_bits); k1=key_none; break; case key_cancel: //设置装置后返回 flag_debug=1; rcc_flag=21; SecondSet(1); // flash_write_device_b(Device_Add); flash_write(Device_Add,device_id_addr); k1=key_none; break; } } if(rcc_flag==44) //设置波特率 { switch (k1) { case key_down: k1=key_none; --flag_debug; if(flag_debug<1) { flag_debug = 4; } switch(flag_debug) { case 1: Band_Rate=4800; break; case 2: Band_Rate=9600; break; case 3: Band_Rate=19200; break; case 4: Band_Rate=115200; break; } ThirdBaudRateSetting(2,Device_Add,Band_Rate,Data_bits,Stop_bits); break; case key_up: k1=key_none; k1=key_none; ++flag_debug; if(flag_debug>4) { flag_debug = 0; } switch(flag_debug) { case 1: Band_Rate=4800; break; case 2: Band_Rate=9600; break; case 3: Band_Rate=19200; break; case 4: Band_Rate=115200; break; } ThirdBaudRateSetting(2,Device_Add,Band_Rate,Data_bits,Stop_bits); break; case key_cancel: //设置装置后返回 flag_debug=1; rcc_flag=21; SecondSet(1); k1=key_none; uart_init(Band_Rate); RS485_Init(Band_Rate); //波特率设置 485 // flash_write_Band_Rate(Band_Rate); flash_write(Band_Rate,Band_Rate_addr); break; } } if(rcc_flag==45) //设置数据位 { switch (k1) { case key_down: --Data_bits; if(Data_bits<5) { Data_bits = 8; } ThirdBaudRateSetting(3,Device_Add,Band_Rate,Data_bits,Stop_bits); k1=key_none; break; case key_up: ++Data_bits; if(Data_bits>9) { Data_bits = 5; } ThirdBaudRateSetting(3,Device_Add,Band_Rate,Data_bits,Stop_bits); k1=key_none; break; case key_cancel: //设置停止位 flag_debug=1; rcc_flag=21; SecondSet(1); // flash_write_device_b(Device_Add); // flash_write_databits(Data_bits); flash_write(Data_bits,databits_addr); k1=key_none; break; } } if(rcc_flag==46) //设置停止位 { switch (k1) { case key_down: --Stop_bits; if(Stop_bits<1) { Stop_bits = 9; } ThirdBaudRateSetting(4,Device_Add,Band_Rate,Data_bits,Stop_bits); k1=key_none; break; case key_up: ++Stop_bits; if(Stop_bits>10) { Stop_bits = 1; } ThirdBaudRateSetting(4,Device_Add,Band_Rate,Data_bits,Stop_bits); k1=key_none; break; case key_cancel: //设置停止位 flag_debug=1; rcc_flag=21; SecondSet(1); // flash_write_stopbits(Stop_bits); flash_write(Stop_bits,stopbits_addr); k1=key_none; break; } } }
/** * @brief Configures the RTC. * @param None * @retval None */ void RTC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the RTC Interrupt */ 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); /* 2 bits for Preemption Priority and 2 bits for Sub Priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0xFF; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Configure EXTI Line17 (RTC Alarm)to generate an interrupt on rising edge */ EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStructure); /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Alarm in 3 second */ //RTC_SetAlarm(3); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second, RTC Alarm interrupt */ RTC_ITConfig(RTC_IT_SEC || RTC_IT_ALR, ENABLE); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
u8 p_dr_RtcInit(void) { //检查是不是第一次配置时钟 u8 temp=0; RTC_NVIC_Config(); //if(BKP->DR1!=0X5050)//第一次配置 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎 { /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问 /* Reset Backup Domain */ BKP_DeInit(); //将外设BKP的全部寄存器重设为缺省值 /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振 /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪 { temp++; delay_ms(10); } if(temp>=250)return 1;//初始化时钟失败,晶振有问题 /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 /* Set RTC prescaler: set RTC period to 1sec */ /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ RTC_SetPrescaler(32767); //设置RTC预分频的值 /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 p_dr_RtcSet(2009,12,2,10,0,55); //设置时间 BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据 } else//系统继续计时 { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) //检查指定的RCC标志位设置与否:POR/PDR复位 { //printf("\rPower On Reset occurred...."); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) //检查指定的RCC标志位设置与否:管脚复位 { //printf("\rExternal Reset occurred...."); } //printf("\rNo need to configure RTC...."); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 } p_dr_RtcGet();//更新时间 /* Clear reset flags */ RCC_ClearFlag(); //清除RCC的复位标志位 return 0; //ok }
/** * @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); }
/******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } } /* GPIOA, GPIOC, GPIO KEY Button, GPIO_LED and AFIO clocks enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIO_KEY_BUTTON | RCC_APB2Periph_GPIO_LED | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); #ifdef RTC_Alarm_WFEWakeUp /* Enable the PWR and BKP Clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Configure the EXTI Line 17 as Event */ EXTI_StructInit(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { } /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for APB registers synchronisation */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set the RTC time base to 1s */ RTC_SetPrescaler(32767); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); #endif }
/** * @brief Init hardware of RTC * @param none * @retval None */ u8 RTC_Hardware_Init(void) { u16 countDown = 1000; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); //BKP_DeInit(); if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) //从指定的后备寄存器中读出数据,判断是否为第一次配置 { BKP_DeInit(); //将外设BKP的全部寄存器重设为缺省值 RCC_LSEConfig(RCC_LSE_ON); //使能外部低速时钟 32.768KHz while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪 { vTaskDelay(2 / portTICK_RATE_MS); countDown--; if (countDown == 0) { ShowDialogue("Hardware Error", "LSE crystal", "not ready!", false, true); OLED_Refresh_Gram(); while (1); } } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 RTC_WaitForSynchro(); //等待RTC寄存器(RTC_CNT,RTC_ALR和RTC_PRL)与RTC APB时钟同步 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 RTC_SetPrescaler(32767); //设置RTC预分频的值 RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 Time_Set(); //时间设置 BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); //向指定的后备寄存器中写入用户程序数据0X5555做判断标志 } else //不是第一次配置 继续计时 { if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) //检查指定的RCC标志位设置与否:POR/PDR复位 { ; } else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) //检查指定的RCC标志位设置与否:管脚复位 { ; } RCC_ClearFlag(); // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //先占优先级1位,从优先级3位 // NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断 // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级1位,从优先级3位 // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //先占优先级0位,从优先级4位 // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断 // NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 // RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 } //Time_Get(); //更新时间 RCC_ClearFlag(); //清除RCC的复位标志位 return 0; //ok }
/******************************************************************************* * Function Name : RTC_Configuration * Description : 来重新配置RTC和BKP,仅在检测到后备寄存器数据丢失时使用 * Input : None * Output : None * Return : None *******************************************************************************/ void RTC_Configuration(void) { //启用PWR和BKP的时钟(from APB1) RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //后备域解锁 PWR_BackupAccessCmd(ENABLE); //备份寄存器模块复位 BKP_DeInit(); //外部32.768K其哟偶那个 RCC_LSEConfig(RCC_LSE_ON); //等待稳定 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); // Lcd_WriteString(10,0,0,Red,"00"); //RTC时钟源配置成LSE(外部32.768K) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RTC开启 RCC_RTCCLKCmd(ENABLE); //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器 RTC_WaitForSynchro(); //读写寄存器前,要确定上一个操作已经结束 RTC_WaitForLastTask(); //使能秒中断 RTC_ITConfig(RTC_IT_SEC, ENABLE); //等待写入完成 RTC_WaitForLastTask(); //设置RTC分频器,使RTC时钟为1Hz //RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) RTC_SetPrescaler(32767); //等待寄存器写入完成 RTC_WaitForLastTask(); time_now.tm_year = 2009; time_now.tm_mon = 7; time_now.tm_mday = 31; time_now.tm_hour = 13; time_now.tm_min = 11; time_now.tm_sec = 00; Time_SetCalendarTime(time_now); return; }
/******************************************************************************* * Function Name : rtc_init * Description : initializes HW RTC, * sets default time-stamp if RTC has not been initialized before * Input : None * Output : None * Return : not used * Based on code from a STM RTC example in the StdPeriph-Library package *******************************************************************************/ int rtc_init(void) { volatile uint16_t i; /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* LSI clock stabilization time */ for(i=0;i<5000;i++) { ; } 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) */ /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { ; } /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set initial value */ RTC_SetCounter( (uint32_t)((11*60+55)*60) ); // here: 1st January 2000 11:55:00 /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); /* Lock access to BKP Domain */ PWR_BackupAccessCmd(DISABLE); } else { /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); } return 0; }
/** * @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); }