<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32開(kāi)發(fā)板基礎教程(十) - RTC初探

STM32開(kāi)發(fā)板基礎教程(十) - RTC初探

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
STM32RTC實(shí)際是一個(gè)獨立的定時(shí)器。
下面將介紹如何使用RTC。
我們將頭一次牽扯到振源的問(wèn)題。

首先介紹一下STM32使用的各種振源。
有三種
HSE:外置晶振
HSI:內置RC振蕩
LSE:外置RTC振蕩(32768居多)

APB1 和 APB2 是經(jīng)過(guò)PLL以后的振蕩源。

STM32啟動(dòng),首先使用的HSI振蕩,在確認HSE振蕩可用的情況下,才可以轉而使用HSE,
當HSE出現問(wèn)題,STM32可自動(dòng)切換回HSI振蕩,維持工作。
LSE振蕩則是專(zhuān)門(mén)供RTC使用。

LSE晶振需要特別注意。
STM32非常奇怪,要求使用 6p負載的晶振,
市面買(mǎi)到的時(shí)鐘晶振,絕大多是是12.5pF的
算是一個(gè)不小的bug,
大家做相關(guān)開(kāi)發(fā)的時(shí)候,要留神。
要買(mǎi)6pF的晶振,配10pF的諧振電容。

由此,馬七懷念一下AVR單片機。不用諧振電容都跑的飛,當然是Mega系列。

下面介紹RTC驅動(dòng)過(guò)程。

第一件事情,喂時(shí)鐘。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR, ENABLE);

注意,喂的是什么?不是RTC,是電源管理和BKP備份器的時(shí)鐘。用于備份模式下。
即系統掉電了,BKP和RTC還能繼續工作,RTC繼續計時(shí)。
那么RTC的時(shí)鐘呢?前面提到,RTC的時(shí)鐘,一般用LSE。

第二件事情,初始化RTC

// RTC config
void RTC_configuration()
{
//Open the BKP
PWR_BackupAccessCmd(ENABLE);

BKP_DeInit();

//RTC use the LSE Clock
RCC_LSEConfig(RCC_LSE_ON);//RCC打開(kāi)了LSE時(shí)鐘

//Wait LSE Ready
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);//等待LSE就緒,一般來(lái)說(shuō),如果諧振不對,就會(huì )死在這里。實(shí)

際代碼請慎重

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RTC使用時(shí)鐘,可以使用LSE,也可以使用HSI,也可以使用HSE/128

RCC_RTCCLKCmd(ENABLE); //RTC的時(shí)鐘開(kāi)啟

RTC_WaitForSynchro();//RTC等待同步,

RTC_WaitForLastTask();//這個(gè)代碼在RTC中常常出現,類(lèi)似于等待就緒的含義

// Interrupt Each Second
RTC_ITConfig(RTC_IT_SEC, ENABLE);//RTC開(kāi)中斷,RTC中斷有三種,秒中斷,鬧鐘中斷,溢出中斷,很明顯他們的作用。秒中斷用于即時(shí)操作,鬧鐘中斷用于關(guān)閉或者喚醒,溢出中斷的話(huà),用于復位RTC

RTC_WaitForLastTask();//

RTC_SetPrescaler(32767);//RTC預分頻,32768HZ,分為一秒一個(gè)振蕩,RTC period = RTCCLK/RTC_PR = (32.768

KHz)/(32767+1)

RTC_WaitForLastTask(); //等待同步

}

這樣,RTC就啟動(dòng)了。
通過(guò) RTC_GetCounter() 這個(gè)函數。讀到計數器的值。
既然 一秒增一個(gè)。
很容易就可以從 計數器的值,算出確切的時(shí)間值。
對于這種時(shí)間分量復雜的,我習慣用結構體定義

typedef struct
{
unsigned char Sec;
unsigned char Min;
unsigned char Hour;
unsigned char Day;
unsigned char Month;
unsigned char Year;
}Time_Struct;

// translate seconds to YY::MM:D::HH::MM::SS
Time_Struct read_RTC_time()
{
unsigned long Time_Value;

Time_Struct TimeStruct;

Time_Value = RTC_GetCounter();

TimeStruct.Year = Time_Value/(12*30*24*3600);

TimeStruct.Month = Time_Value/(30*24*3600) - TimeStruct.Year*12;

TimeStruct.Day = Time_Value/(24*3600) - TimeStruct.Year*12*30 - TimeStruct.Month*30;

TimeStruct.Hour = Time_Value/3600 - TimeStruct.Year*12*30*24 - TimeStruct.Month*30*24 - TimeStruct.Day*24;

TimeStruct.Min = Time_Value/60 - TimeStruct.Year*12*30*24*60 - TimeStruct.Month*30*24*60 -

TimeStruct.Day*24*60 - TimeStruct.Hour*60;

TimeStruct.Sec = Time_Value - TimeStruct.Year*12*30*24*60*60 - TimeStruct.Month*30*24*60*60 -

TimeStruct.Day*24*60*60 - TimeStruct.Hour*60*60 -TimeStruct.Min*60;

return TimeStruct;
}

當然,也可以在任意時(shí)候設置這個(gè)時(shí)間,手工修改Counter即可。相關(guān)函數在工程文件rtc.c當中。


關(guān)鍵詞: STM32基礎教程RT

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>