最近用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);
未再次發現寫入失敗的情況,看來還是直接寫寄存器靠譜點。