開發平臺
- 標準庫
- 野火F429開發板
RTC——實時時鐘
- 由RTC框圖可以看出,使用日曆功能,只需要三步就可以了
- (1)選擇RTC的時鐘源
如何選擇時鐘源:有HSE、LSE、LSI,一般使用LSE作爲時鐘源,LSI穩定性差。但是我選擇LSE作爲時鐘源的時候,RTC初始化失敗,原因我也不知道。所以最後我選擇了LSI作爲時鐘源 - (2)設置RTC的同步分頻因子和異步分頻因子
LSE作爲時鐘源,使用的是一個32.768K的外部晶振
LSI作爲時鐘源,使用芯片內部30K的晶體
我們需要生成一個1HZ的時鐘,這時候就要設置分頻因子,爲了降低功耗,異步分頻因子要小於同步分頻因子 - (3)設置時間
F4有時間寄存器和日期寄存器,而F1沒有。
RTC時鐘初始化
-
設置RTC時鐘第一步是要打開電源時鐘,再使能備份訪問區域,原因如下:
-
設置RTC的時鐘
-
設置完後要調用函數RTC_WaitForSynchro();等待時鐘同步
void RTC_ClockConfig(void)
{
/*打開電源時鐘*/
RCC_APB1PeriphClockCmd(PWR_CLOCK,ENABLE);
/*使能備份訪問區*/
PWR_BackupAccessCmd(ENABLE);
/*設置RTC時鐘*/
/*打開LSE*/
RCC_LSICmd(ENABLE);
/*等待LSE始終穩定*/
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)!=SET)
{
}
/*選擇LSE作爲RTC時鐘*/
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
/*使能RTC時鐘*/
RCC_RTCCLKCmd(ENABLE);
/*等待時鐘同步*/
RTC_WaitForSynchro();
}
RTC初始化
void RTC_Config(void)
{
RTC_InitTypeDef RTC_InitStruct;
RTC_ClockConfig();
/*生成1HZ的時鐘,一般異步分頻器的值小於同步分頻器,降低功耗
*異步分頻器
*同步分頻器
*/
RTC_InitStruct.RTC_AsynchPrediv=100-1;
RTC_InitStruct.RTC_SynchPrediv=300-1;
RTC_InitStruct.RTC_HourFormat=RTC_HourFormat_24;
if (RTC_Init(&RTC_InitStruct)==ERROR)
{
printf("\nRTC初始化失敗\n");
}
}
設置時間日期,顯示時間
- 調用設置時間日期函數就可以設置,你需要顯示的最初始日期和時間(設置時間要在初始化的時候設置)
- 調用獲取時間日期函數,就可獲取當前時間,然後打印出來
設置日期函數:RTC_SetDate(RTC_Format_BIN,&RTC_DateStruct);;
設置時間函數:RTC_SetTime(RTC_Format_BIN,&RTC_TimeStruct);
獲取日期函數:RTC_GetDate(RTC_Format_BIN,&RTC_DateStruct);
獲取時間函數:RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
F103的RTC初始化
F1與F4的初始化有點不一樣
-
使能備份域後,還需復位備份域
-
需要開啓秒中斷
-
使能RTC後,每一次操作,都必須調用RTC_WaitForLastTask();等待上一次操作完成
-
只能設置時間不能設置日期,設置時間的值是秒數,獲取時間也是一樣。
-
F1顯示的時間並非像F4那樣直接輸出的,要自己計算出時間,纔可以打印出來
RTC_SetCounter((HH*3600)+(MM*60)+SS);
void RTC_Config(void)
{
NVIC_Config();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
RTC_SetPrescaler(40000-1);
RTC_WaitForLastTask();
RTC_SetCounter((HH*3600)+(MM*60)+SS);
RTC_WaitForLastTask();
}