最近用STM8L051做的一个低功耗的项目,需要同步两个节点之间的时间,结果RTC没有在设定的时间点唤醒单片机,最开始以为是晶振的误差太大,偶然间发现两次唤醒的时间间隔和我设定的是一致的,于是排除晶振的原因。把节点的唤醒时间和收到其它节点发来的时间打印后之后发现有时候要经过2-3次才能正确的把接收到的时间信息写入到本节点,于是尝试在写入时间之前再次调用RTC初始化函数
void RTC_Mode_Config(void)
{
CLK_LSEConfig(CLK_LSE_ON); //开启LSE
while(CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET);
CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);//不分频,即32768Hz
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //使能设置
}
然后再调用时间设置函数
void SYSTEM_Time_Config(void)
{
RTC_InitTypeDef RTC_InitStructure;
RTC_TimeTypeDef RTC_TimeStructure;
RTC_DateTypeDef RTC_DateStructure;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; //小时格式:24小时制
RTC_InitStructure.RTC_AsynchPrediv = 127; //异步分频系数
RTC_InitStructure.RTC_SynchPrediv = 255; //同步分频系数
RTC_Init(&RTC_InitStructure);
RTC_TimeStructInit(&RTC_TimeStructure);
RTC_TimeStructure.RTC_Hours = time_buf[4];
RTC_TimeStructure.RTC_Minutes = time_buf[5];
RTC_TimeStructure.RTC_Seconds = time_buf[6];
RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); //使用BCD格式
RTC_DateStructInit(&RTC_DateStructure);
RTC_DateStructure.RTC_WeekDay = time_buf[3];
RTC_DateStructure.RTC_Date = time_buf[2];
RTC_DateStructure.RTC_Month = time_buf[1];
RTC_DateStructure.RTC_Year = time_buf[0];
RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure); //初始化日期和时间
}
会提高成功写入的概率,但仍有写入失败的情况发生
于是直接在主函数里将接收到的时间信息调用RTC_SetTime写入RTC,
RTC_TimeStructure.RTC_Hours = rece_data_buff[2]*16+rece_data_buff[3];
RTC_TimeStructure.RTC_Minutes = rece_data_buff[4]*16+rece_data_buff[5];
RTC_TimeStructure.RTC_Seconds = rece_data_buff[6]*16+rece_data_buff[7];
RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);
未再次发现写入失败的情况,看来还是直接写寄存器靠谱点。