<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32開發(fā)板基礎(chǔ)教程(十) - RTC初探

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

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

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

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

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

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

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

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

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

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR, ENABLE);

          注意,喂的是什么?不是RTC,是電源管理和BKP備份器的時(shí)鐘。用于備份模式下。
          即系統(tǒng)掉電了,BKP和RTC還能繼續(xù)工作,RTC繼續(xù)計(jì)時(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打開了LSE時(shí)鐘

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

          際代碼請慎重

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

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

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

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

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

          RTC_WaitForLastTask();//

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

          KHz)/(32767+1)

          RTC_WaitForLastTask(); //等待同步

          }

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

          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;
          }

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


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

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();