RTC

開發平臺

  • 標準庫
  • 野火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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章