菜鳥入門stm32之實(shí)時時鐘_第1頁
菜鳥入門stm32之實(shí)時時鐘_第2頁
菜鳥入門stm32之實(shí)時時鐘_第3頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、經(jīng)過這么 10 天的瞎搞,庫已經(jīng)初具規(guī)模了,于是,不用每次都把所有的文件 copy 過去,直接在 Option 里面把 path 給加上就 ok 了。RTC 的時鐘配置,RTC 的時間寄存器是 2 個 32 位的寄存器,無非就是一個計數(shù)器,大概可以這樣理解吧,我們先看看時鐘吧RTC 的時鐘可以從這 3 路來,我們需要 PTCSEL 寄存器來進(jìn)行設(shè)置,上面這個圖是摘自李想的課件里面的,我覺得這個是做的相對好的!位了保證 RTC 正常工作,我們需要在系統(tǒng)斷電時,RTC 不受影響,當(dāng)然我們一般都需要接一個 Battery,作為 rtc 的后備電源,這里設(shè)計到電源管理,我們先來看看電源管理里面關(guān)于 r

2、tc 的只要我們把第八位置 1 我們就可以對其進(jìn)行正常供電,我們還發(fā)現(xiàn),他也可以給后備寄存器供電,這個后備寄存器是是個什么東東呢?有的可以研究研究備份寄存器(BKP),他的主要功能是侵入檢查和 RTC校準(zhǔn),他既然跟 RTC 有關(guān)系,我們就要好好看看他了;里面有個備份域寄存器 RCC_BDCR寄存器中(RCC_BDCR)的 LSEON、LSEBYP、RTCSEL 和復(fù)位和時鐘注意: 備份域RTCEN 位處于備份域。因此,這些位在復(fù)位后處于寫保護(hù)狀態(tài),只有在電源DBP 位置1后才寄存器(PWR_CR)中的能對這些位進(jìn)行改動。進(jìn)一步信息請參考 5.1 節(jié)。這些位只能由備份域復(fù)位清除(見 6.1.3

3、節(jié))。任何內(nèi)部或外部復(fù)位都影響這些位。位 31:17 保留,始終讀為 0。BDRST:備份域軟件復(fù)位(Backup domain software reset)由軟件置1或清0 0:復(fù)位未激活;1:復(fù)位整個備份域。RTCEN:RTC 時鐘使能(RTC clock enable) 位 15由軟件置1或清0 0:RTC 時鐘關(guān)閉;1:RTC 時鐘開啟。位 14:10 保留,始終讀為 0。位 16RTCSEL1:0:RTC 時鐘源選擇(RTC clock source selection) 位 9:8由軟件設(shè)置來選擇 RTC 時鐘源。一旦 RTC 時鐘源被選定,直到下次后備域被復(fù)位,它不能在被改變。

4、可通過設(shè)置 BDRST 位來清除。00:無時鐘;01:LSE 振蕩器作為 RTC 時鐘;10:LSI 振蕩器作為 RTC 時鐘;11:HSE 振蕩器在 128 分頻后作為 RTC 時鐘。位 7:3 保留,始終讀為 0。LSEBYP:外部低速時鐘振蕩器旁路(External low-speed oscillator bypass) 位2在調(diào)試模式下由軟件置1或清0來旁路 LSE。只有在外部 32kHz 振蕩器關(guān)閉時, 才能寫入該位0:LSE 時鐘未被旁路;1:LSE 時鐘被旁路。LSERDY:外部低速 LSE 就緒(External low-speed oscillator ready) 位 1

5、由硬件置1或清0來指示是否外部 32kHz 振蕩器就緒。在 LSEON 被清零后, 該位需要 6 個外部低速振蕩器的周期才被清零。0:外部 32kHz 振蕩器未就緒;1:外部 32kHz 振蕩器就緒。LSEON:外部低速振蕩器使能(External low-speed oscillator enable) 位 0由軟件置1或清00:外部 32kHz 振蕩器關(guān)閉;1:外部 32kHz 振蕩器開啟??磥磉@一寄存器果真與 RTC 有很大的所以 RCC->BDCR |= 1<<0;,我們需要啟用外部 32K 的振蕩器,設(shè)置完了,我們還需要等待 32K 的時鐘就緒,bit1 的狀態(tài)!由

6、于我們選用的 32K 的 LSE 作為 RTC 的時鐘,所以上面我們提到的 RTCSEL寄存器必須設(shè)置為 1,設(shè)置完后我們就開啟 32K 時鐘RCC->BDCR |= 1<<8;RCC->BDCR |= 1<<15;下面正式看 RTC 的寄存器,先從低位寄存器開始 CRL位 15:6 保留,被硬件強(qiáng)制為 0。位 5 RTOFF:RTC 操作關(guān)閉(RTC operation OFF) 位 5RTC 模塊利用這位來指示對其寄存器進(jìn)行的最后一次操作的狀態(tài),指示操作是否完成。若此位為0,則表示無法對任何的 RTC 寄存器進(jìn)行寫操作。此位為只讀位。0:上一次對 RTC

7、 寄存器的寫操作仍在進(jìn)行;1:上一次對 RTC 寄存器的寫操作已經(jīng)完成。位 4 CNF:配置標(biāo)志(Configuration flag) 位 4此位必須由軟件置1以進(jìn)入配置模式,從而RTC_PRL 寄存器向 RTC_CNT、RTC_ALR 或?qū)懭霐?shù)據(jù)。只有當(dāng)此位在被置1并重新由軟件清0后,才會執(zhí)行寫操作。0:配置模式(開始更新 RTC 寄存器);1:進(jìn)入配置模式。位 3 RSF:寄存器同步標(biāo)志(Registers synchronized flag)每當(dāng) RTC_CNT 寄存器和 RTC_DIV 寄存器由軟件更新或清0時,此位由硬件置1。在 APB1 復(fù)位后,或 APB1 時鐘停止后,此位必須

8、由軟件清0。要進(jìn)行任何的讀操作之前,用戶程序必須等待這位被硬件置1,以確保 RTC_CNT、RTC_ALR 或 RTC_PRL 已經(jīng)被同步。0:寄存器尚未被同步;1:寄存器已經(jīng)被同步。位 2 OWF:溢出標(biāo)志(Overflow flag) 位 2當(dāng) 32 位可編程計數(shù)器溢出時,此位由硬件置1。如果 RTC_CRH 寄存器中OWIE=1,則產(chǎn)生中斷。此位只能由軟件清0。對此位寫1是無效的。0:無溢出;1:32 位可編程計數(shù)器溢出。位 1 ALRF:鬧鐘標(biāo)志(Alarm flag) 位 1當(dāng) 32 位可編程計數(shù)器達(dá)到 RTC_ALR 寄存器所設(shè)置的預(yù)定值,此位由硬件置1。如果 RTC_CRH寄存器

9、中 ALRIE=1,則產(chǎn)生中斷。此位只能由軟件清0。對此位寫1是無效的。0:無鬧鐘;1:有鬧鐘。位 0 SECF:秒標(biāo)志(Second flag) 位 0當(dāng) 32 位可編程預(yù)分頻器溢出時,此位由硬件置1同時 RTC 計數(shù)器加 1。因此, 此標(biāo)志為分辨率可編程的 RTC 計數(shù)器提供一個周期性的信號(通常為 1 秒)。如果 RTC_CRH 寄存器中 SECIE=1,則產(chǎn)生中斷。此位只能由軟件清除。對此位寫1是無效的。0:秒標(biāo)志條件不成立;1:秒標(biāo)志條件成立。感覺 CRL 更像 SR,我在想為什么他有點(diǎn)功能不放到 SR 的里面呢?好吧,CRL 里的功能說的很清楚,直接掠過,包括 CRH。有什么異議,

10、我這里就不解釋了,在 RTC 計數(shù)器寄存器里面和 RTC 鬧鐘寄存器里面有這么一段話RTC 核有一個 32 位可編程的計數(shù)器,可通過兩個 16 位的寄存器以預(yù)分頻器產(chǎn)生的。計數(shù)器TR_CLK 時間基準(zhǔn)為參考進(jìn)行計數(shù)。RTC_CNT 寄存器用來存放計數(shù)器的計數(shù)值。他們受RTC_CR 的位 RTOFF 寫保護(hù),僅當(dāng) RTOFF 值為1時, 寄存器(RTC_CNTH 或RTC_CNTL)上的寫操作,能夠直接裝載到相應(yīng)的可編程計數(shù)器, 并且重新裝載RTC 預(yù)分頻器。當(dāng)進(jìn)行讀操作時,直接返回計數(shù)器內(nèi)的計數(shù)值(系統(tǒng)時間)。寫操作。在高或低當(dāng)可編程計數(shù)器的值與 RTC_ALR 中的 32 位值相等時,即觸發(fā)

11、一個鬧鐘并且產(chǎn)生 RTC 鬧鐘,中斷。此寄存器受 RTC_CR 寄存器里的 RTOFF 位寫保護(hù),僅當(dāng) RTOFF 值為1時,寫操作。所以我們在配置 RTC_CNTx RTC_ALRx 寄存器時,不行把 RTOFF 寄存器置為1,當(dāng)寫完之后將 CNT 設(shè)為 1,即進(jìn)入配置模式,等待 RTOFF 配置完成,即RTOFF 自動置為 0,才完成對 CNTx 和 ALRx 兩個寄存器進(jìn)行修改!為了實(shí)現(xiàn)計數(shù)的時間間隔,我們要對 RTC 預(yù)分頻裝載寄存器進(jìn)行配置我們需要 1s 鐘計時一次,而我們用的是 LSE 32KHz 的振蕩器,所以我們需要配置的分頻器是?可以看出我們只需讓 RTC_PRLL = 0x

12、7fff 即 32767 即可得到 1s 的周期當(dāng)然我們需要兩秒的話那就是 0xffff 了。這樣,整個就配置完成了,下面附上代碼,大家可以研究下!1.#include <stm32f10x.h>3.#include "usart.h"5.#define RTC_CF0x01CD/DefineRTC ConfigFrtc_init()9.u8 temp = 0;11.13.RCC->APB1ENREnable|=1<<27;/BackupInterfaceClock15.RCC->BDCR |=1<<16;17

13、.RCC->BDCR |=1<<0;19.delay_ms(10);21.RCC->BDCR |= 1<<8;22.RCC->BDCR |= 1<<15;20.if(temp>=250)return -1;18.while(!(RCC->BDCR&1<<1)&&(temp+)<250)16.RCC->BDCR &= (1<<16);14.PWR->CR |= 1<<8;/Disable back up domain write protecti

14、on12.RCC->APB1ENR |= 1<<28;/Power Interface Cloc k Enable10.if(BKP->DR1 != RTC_CF).#include "init.h"cpp view plaincopy23.while(!(RTC->CRL & (1<<5);25.RTC->CRH |= 1<<0;27./* ConfigTime */29.RTC->PRLH=0;31.RTC->CNTH=0;/Configtime33.RTC->ALRH=

15、0;35.RTC->CRL&=(1<<4);37.BKP->DR1= RTC_CF;39.else41.RTC->CRH|= 1<<0;43.45.rs232_send_int(RTC->CNTL);47.49.void RTC_IRQHandler(void)51.rs232_send_str("INTERn",6);53.55.rs232_send_byte('n');57.if(RTC->CRL & (1<<1)59.RTC->CRL |= 1<<4;6

16、0.RTC->CNTL = 1;58.56.54.rs232_send_int(RTC->CNTL);52.if(RTC->CRL & (1<<0)50. 48.46.return 0;44.init_interrupt(2,3,3,2);42.while(!(RTC->CRL & (1<<5);40.while(!(RTC->CRL & (1<<3);38.36.while(!(RTC->CRL & (1<<5);34.RTC->ALRL = 20;32.RTC->CNTL = 0;30.RTC->PRLL = 32767;28.RTC->CRL |= 1<<4;26.while(!(RTC->CRL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論