STM32F10x晶元RTC實時時鐘

2021-06-19 23:05:29 字數 4387 閱讀 1978

系統復位後,對後備暫存器和

rtc的訪問被禁止,這是為了防止對後備區域

(bkp)

的意外寫操作。執行以下操作將使能對後備暫存器和

rtc的訪問:

l設定暫存器

rcc_apb1enr

的pwren

和bkpen

位,使能電源和後備介面時鐘

(呼叫:

rcc_apb1periphclockcmd(rcc_apb1periph_bkp | rcc_apb1periph_pwr,enable));l

設定暫存器

pwr_cr

的dbp

位,使能對後備暫存器和

rtc的訪問

(呼叫:

pwr_backupaccesscmd(enable))。l

rtc_prl

、rtc_alr

、rtc_cnt

和rtc_div

暫存器僅能通過備份域復位訊號復位;系統復位或電源復位不會影響他們的值;

lrtc

提供apb1

介面通abp1

讀取rtc

暫存器的值,但必須等待

rtc_crl

暫存器中的

rsf(同步標誌位)位被硬體置「

1」之後進行;

lrtc

的配置必需在前一次寫操作結束(判斷

rtc_cr

暫存器中的

rtoff

是否為1,為1

表示更新完成),並設定

rtc_crl

暫存器中的

cnf位,使

rtc進入配置模式後,才能寫入

rtc_prl

、rtc_cnt

、rtc_alr

暫存器,清除

cnf標誌位時,寫操作才實際有效(說明

rtc是動態配置

的,即是在

rtc執行起來之後再進行配置);

lrtc

中的任何標誌位都將保持掛起狀態(因為

owf、

alrf

、secf

和rsf

只能由硬體置位由軟體清零),直到適當的

rtc_cr

請求位被軟體復位,表示所有請求的中斷已經被接受;l若

alrf=1

且alrie=1

,則允許產生

rtc全域性中斷,如果

exti

控制器中允許產生

exti線17

中斷,則允許產生

rtc全域性中斷和

rtc鬧鐘中斷,在這種情況下,一般設定鬧鈴中斷優先順序高於全域性中斷,如果全域性中斷優先順序高於鬧鈴中斷,則在全域性中斷中必須清除鬧鐘中斷標誌之後,才能進入鬧鐘中斷處理函式進一步處理(因為不清除標誌,則會一直引發中斷,而全域性中斷優先順序高,就會一直在全域性中斷中無法跳出來);l若

alrf=1

,如果在

exti

控制器中設定了

exti線17

的中斷模式,則允許產生

rtc鬧鐘中斷;如果在

exti

控制器中設定了

exti線17

的事件模式,則這條線上會產生乙個脈衝(不會產生

rtc鬧鐘中斷);l當

apb1

時鐘不執行時,

owf、

alrf

、secf

和rsf

位不被更新;

l系統復位時禁止所有中斷,無掛起中斷請求,可以對

rtc暫存器進行寫操作;l對

rtc的寫操作必須使用如下過程之一與

rtc秒標誌同步:

使用rtc

鬧鐘中斷,並在中斷處理程式中修改

rtc鬧鐘和/或

rtc計數器;

等待rtc

控制暫存器中秒標誌

secf

置位,再更改

rtc鬧鐘和/或

rtc計數器。 圖

1 簡化的

rtc框圖(詳見手冊)

lrtc

控制暫存器高位

rtc_crh/

低位rtc_crl l

rtc預分頻裝載暫存器(

rtc_prlh/rtc_prll)l

rtc預分頻器餘數暫存器(

rtc_divh/rtc_divl)l

rtc計數器暫存器(

rtc_cnth/rtc_cntl)l

rtc鬧鐘暫存器(

rtc_alrh/rtc_alrl)與

rtcl

apb1

外設時鐘使能暫存器

rcc_apb1enr

的pwren

和bkpen

,使能電源和後備時鐘

l電源控制暫存器

pwr_cr

的後備區域保護位:

dbp?

配置rcc

:選擇系統時鐘、配置匯流排時鐘、使能外圍裝置時鐘等;?呼叫

rcc_apb1periphclockcmd(rcc_apb1periph_pwr | rcc_apb1periph_bkp, enable)

函式,使能電源和備份域時鐘;?呼叫

pwr_backupaccesscmd(enable)

獲取後備區域訪問許可權;?呼叫

bkp_deinit()

函式將外設

bkp的全部暫存器重設為預設值;

?配置並選擇

rtc時鐘:呼叫

rcc_rtcclkconfig(rcc_rtcclksource_***)

選擇是lse

、hse

的128

分頻或者

lsi; ?

rtc配置:n呼叫

rcc_rtcclkcmd(enable)

使能rtc

時鐘;n

呼叫rtc_waitforsynchro()

等待rtc

暫存器(

rtc_cnt

、rtc_alr

和rtc_prl

)與rtc

的apb

時鐘同步(等待

rtoff位置1

);n呼叫rtc_waitforlasttask()

函式等待最近一次對

rtc暫存器的寫操作完成;n呼叫

rtc配置函式(如

rtc_setprescaler(40000)

)配置rtc

(說明:對

rtc的控制暫存器是可以直接讀寫的;對

rtc_prl

、rtc_cnt

、rtc_alr

的寫操作需要進入配置模式,而讀他們則只需要等待同步完成(

rsf置

1)通過

apb1

介面讀取);

n每次呼叫

rtc配置函式之後需要呼叫

rtc_waitforlasttask()

等待本次配置成功。

?exti

配置:若需要將

rtc於

exti線17

相連,則配置

exti線17

為中斷/

事件模式;

?nvic

配置:若要產生中斷,則配置中斷向量控制器,使能

exti15_10_irqhandler

中斷,或者使能

rtc_irqhandler

中斷;?

編寫中斷處理函式:注意一定要在中斷處理函式中呼叫

rtc_clearitpendingbit()

函式清除對應的中斷標誌位;

void nvic_configuration(void)

void rtc_configuration(void)

rcc_rtcclkconfig(rcc_rtcclksource_lsi);

rcc_rtcclkcmd(enable);

rtc_waitforsynchro();

rtc_waitforlasttask();

rtc_itconfig(rtc_it_alr,enable);

rtc_itconfig(rtc_it_sec,enable);

rtc_setprescaler(6000);

rtc_waitforlasttask();

rtc_setalarm(29);

rtc_waitforlasttask();

bkp_tamperpincmd(disable);

bkp_rtcoutputconfig(bkp_rtcoutputsource_second); }

void exti_configuration(void)

/* 中斷處理函式*/

void rtc_irqhandler(void)

} void rtcalarm_irqhandler(void)

} }

STM32F10x系列 中斷

概念問題 中斷與事件有什麼聯絡與區別?stm32之中斷與事件 中斷與事件的區別 簡單概括下。中斷 cpu單執行緒情況下只能處理單一任務,在有零時任務需要處理時,可以暫時放下當前任務,優先處理零時任務,再回過來處理之前的任務。多個中斷可以進行巢狀,比如產生了多個零時任務,那麼就可以按照優先順序處理這多...

STM32F10X入門 流水燈

2019 3 16 2019 3 19 core cm32.c stdin.h中定義了字元型 stm32f10x.h stm32f10x conf.h中定義了引用的外設標頭檔案 庫檔案之間的依賴呼叫關係 pngstm32f10x.h檢視位址對映 比如define gpioa base apb2per...

STM32F10X 位帶操作

在stm32微控制器的學習中,有乙個最大的特點就是你所編寫的stm32的程式操作,基本上都是匯流排的操作,比如gpiob odr 0x0001 或者直接等於1 這樣的操作必須要考慮整個暫存器的資料,但其實如果學過51微控制器的人都知道,我們除了對於匯流排操作外,我們還是經常會對單獨的位進行操作,比如...