資源簡介
此文件中包含了stm32_rtc.c,stm32_rtc.h用內置的rtc計算器實現萬年歷的相關函數,函數主要實現年月日時分秒周的計算,其計數值存放在bkp存儲區中。

代碼片段和文件信息
#include?“stm32f10x.h“
const?u8?month_day_num[12]?={312831303130313130313031};//平年每個月的天數
u16?ms_count;
TIMER_VALUE?global_time_value;//16進制的年月日時分秒(實時刷新)
TIMER_VALUE?global_time_BCD;//BCD格式的年月日時分秒(使用時先調用Timer_HEXToBCD())
/*************************************************
*函數名: u8?*GetGlobaltimevalue(void)
*功能描述: 得到實時時鐘值(16進制)
*入口參數: 無
*出口參數: 無
*作者: WWM
*************************************************/
u8*?GetGlobaltimevalue16(void)
{
return?(&global_time_value.second);
}
/*************************************************
*函數名: TIMER_VALUE?*GetGlobaltimevalue(void)
*功能描述: 得到實時時鐘值(16進制)
*入口參數: 無
*出口參數: 無
*作者: WWM
*************************************************/
u8*?GetGlobaltimevalueBCD(void)
{
Timer_HEXToBCD();
return?(&global_time_BCD.second);
}
/*************************************************
*函數名: void?INIT_RTC(void)
*功能描述: 對rtc的初始化
*入口參數: 無
*出口參數: 無
*作者: WWM
*************************************************/
void?INIT_RTC(void)
{
//00年,1月,1日,0時,0分,0秒,周六
global_time_value.year = 0x00;
global_time_value.month? =? 0x01;
global_time_value.day? =? 0x01;
global_time_value.hour? =? 0x00;
global_time_value.minute? =? 0x00;
global_time_value.second? =? 0x00;
global_time_value.week? =? 0x06;?
ms_count?=?200;//ms_count--;放入1ms中斷中
//由于實時時鐘的一個寄存器掛在電源管理的一個位上
????RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR?|?RCC_APB1Periph_BKP?ENABLE);
//開啟備份區域
????PWR_BackupAccessCmd(ENABLE);
????//我們在BKP的后備寄存器1中,存了一個特殊字符0xA5A5
????//第一次上電或后備電源掉電后,該寄存器數據丟失,
????//表明RTC數據丟失,需要重新配置
????if?(BKP_ReadBackupRegister(BKP_DR1)?!=?0xA5A5)
????{
????????//重新配置RTC
????????//啟用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分頻器,使RTC時鐘為1Hz
????RTC_SetPrescaler(32767);//7fffh
RTC_WaitForLastTask();
RTC_SetCounter(0x0);//從0開始計數
????//等待寄存器寫入完成
????RTC_WaitForLastTask();
????//使能秒中斷
// ????RTC_ITConfig(RTC_IT_SEC?ENABLE);????
????//等待寫入完成
????RTC_WaitForLastTask();
????????//配置完成后,向后備寄存器中寫特殊字符0xA5A5
????????BKP_WriteBackupRegister(BKP_DR1?0xA5A5);
????}
????else
????{
????????//若后備寄存器沒有掉電,則無需重新配置RTC
????????//這里我們可以利用RCC_GetFlagStatus()函數查看本次復位類型
????????if?(RCC_GetFlagStatus(RCC_FLAG_PORRST)?!=?RESET)
????????{
????????????//這是上電復位
????????}
????????else?if?(RCC_GetFlagStatus(RCC_FLAG_PINRST)?!=?RESET)
????????{
????????????//這是外部RST管腳復位
????????}
????????//清除RCC中復位標志
????????RCC_ClearFlag();
???????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????13046??2010-12-14?19:07??stm32_實時時鐘_可以實現年月日時分秒周的計算\rtc.c
?????文件????????986??2010-12-09?19:29??stm32_實時時鐘_可以實現年月日時分秒周的計算\rtc.h
?????目錄??????????0??2011-04-01?16:47??stm32_實時時鐘_可以實現年月日時分秒周的計算
-----------?---------??----------?-----??----
????????????????14032????????????????????3
評論
共有 條評論