RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32F10x_ RTC日歷

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-03-25 11:39 ? 次閱讀

Ⅰ、概述

接著上一篇文章來(lái)講述關(guān)于RTC的計(jì)數(shù)功能,我們以實(shí)例RTC日歷(讀寫年、月、日、星期、時(shí)、分、秒)來(lái)講述該章節(jié)。

STM32F1系列芯片的RTC功能和其他系列(F0、F2、F4等)相比來(lái)說(shuō),功能要弱一點(diǎn),原因在于F1系列的RTC日歷功能需要我們通過(guò)軟件進(jìn)行處理(換算RTC計(jì)數(shù)值)才能真正實(shí)現(xiàn)RTC日歷的功能,而其他系列芯片不用這么麻煩,可直接讀取日歷值。

該文和上一篇文章的區(qū)別:1、RTC時(shí)鐘源選擇LSE(外部低速時(shí)鐘); 2、分頻值是32768; 3、讀寫了RTC_CNT(計(jì)數(shù)值),用于RTC日歷。

本文章提供的實(shí)例工程“STM32F10x_RTC日歷(LSE)”,其實(shí)驗(yàn)效果是:

主函數(shù)間隔0.5秒LED變化一次;

間隔1秒中斷:讀取日歷并打印出來(lái)

電腦串口調(diào)試助手接收到數(shù)據(jù):年月日星期時(shí)分秒

關(guān)于本文的更多詳情請(qǐng)往下看。

Ⅱ、實(shí)例工程下載

筆者針對(duì)于初學(xué)者提供的例程都是去掉了許多不必要的功能,精簡(jiǎn)了官方的代碼,對(duì)初學(xué)者一看就明白,以簡(jiǎn)單明了的工程供大家學(xué)習(xí)。

筆者提供的實(shí)例工程都是在板子上經(jīng)過(guò)多次測(cè)試并沒有問(wèn)題才上傳至360云盤,歡迎下載測(cè)試、參照學(xué)習(xí)。

提供下載的軟件工程是基于Keil(MDK-ARM) v5版本、STM32F103ZE芯片,但F1其他型號(hào)也適用(適用F1其他型號(hào):關(guān)注微信,回復(fù)“修改型號(hào)”)。

STM32F10x_RTC日歷(LSE)實(shí)例源代碼工程:

https://yunpan.cn/cBDwPJcChZRFE 訪問(wèn)密碼 f7c0

STM32F10x_RTC日歷(LSI)實(shí)例源代碼工程:

https://yunpan.cn/cBDwSikRhZ2Nk 訪問(wèn)密碼 d65d

STM32F1資料

https://yunpan.cn/crBUdUGdYKam2 訪問(wèn)密碼 ca90

Ⅲ、原理描述

以筆者個(gè)人學(xué)習(xí)經(jīng)歷來(lái)說(shuō),想要掌握其真正原理,最好還是查看參考手冊(cè)(現(xiàn)在有很多都翻譯為中文了),里面模塊的框圖,從框圖中大概就可以看到該模塊有些什么功能及其工作的原理。

RTC框圖:


從上面系統(tǒng)框圖來(lái)分析“RTC秒中斷”和“RTC_CNT計(jì)數(shù)”的原理:

1.RTC時(shí)鐘源,總共有三類:

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

本文實(shí)例代碼是:RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

重點(diǎn):

細(xì)心的朋友可能會(huì)發(fā)現(xiàn):筆者還提供了一個(gè)實(shí)例“STM32F10x_RTC日歷(LSI)”。對(duì),這個(gè)實(shí)例是以LSI內(nèi)部低速時(shí)鐘作為RTC時(shí)鐘源。

先問(wèn)兩個(gè)問(wèn)題:1、為什么不建議使用LSI作為時(shí)鐘源來(lái)設(shè)計(jì)日歷? 2、兩個(gè)實(shí)例工程之間的差別? 將實(shí)例中使用“LSE”時(shí)鐘改為“LSI”時(shí)鐘,其他地方不該可以嗎?【在下面解答】

2.RTC分頻:

本文實(shí)例代碼是:RTC_SetPrescaler(32768-1);

外部低速時(shí)鐘頻率為32.768K,我們要達(dá)到1秒計(jì)數(shù)(RTC_CNT)一次,則需要分頻32768.

3.RTC中斷:

RTC中斷有三種:

RTC_IT_SEC秒中斷

RTC_IT_ALR鬧鐘中斷

RTC_IT_OW(計(jì)數(shù))溢出中斷

本文實(shí)例是:RTC_ITConfig(RTC_IT_SEC, ENABLE);

使能RTC_IT_SEC秒中斷,間隔1秒中斷一次,打印日歷。

再次強(qiáng)調(diào):

這里的“秒中斷”是概念上的秒中斷,它的中斷間隔時(shí)間是根據(jù)你選擇的時(shí)鐘源和分頻值決定的,并非真正的1秒鐘中斷一次。本文提供的實(shí)例是1秒鐘中斷一次。

4.RTC日歷的來(lái)由:

在文章開頭已經(jīng)說(shuō)了,F(xiàn)1系列中RTC只要RTC_CNT寄存器,不像F0、F4等有現(xiàn)成的日歷(年月日時(shí)分秒)寄存器,因此,我們是通過(guò)軟件換算而得來(lái)的日歷。

Ⅳ、源代碼分析

筆者以F1標(biāo)準(zhǔn)外設(shè)庫(kù)(同時(shí)也建議初學(xué)者使用官方的標(biāo)準(zhǔn)外設(shè)庫(kù))為基礎(chǔ)建立的工程,主要以庫(kù)的方式來(lái)講述(若您的F1芯片與提供工程不一樣,可微信回復(fù)“修改型號(hào)”)。

下面將講述關(guān)于“RTC秒中斷”重要的、容易弄錯(cuò)的幾點(diǎn):

1.RCC時(shí)鐘源


該函數(shù)位于bsp.c文件下面;

RCC是很多初學(xué)者,甚至已經(jīng)工作的朋友容易遺漏的地方,有很多朋友覺得它使用的外設(shè)不正常,很大部分是沒有配置RCC導(dǎo)致的。

重點(diǎn)注意:

A.外設(shè)RCC時(shí)鐘的配置要在其外設(shè)初始化的前面;

B.匹配對(duì)應(yīng)時(shí)鐘。

比如:RCC_APB2外設(shè)不要配置在RCC_APB1時(shí)鐘里面

【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);這樣能編譯通過(guò),但這是錯(cuò)誤的代碼】

2. RTC配置


該函數(shù)位于rtc.c文件下面;

該函數(shù)請(qǐng)結(jié)合參考手冊(cè)(框圖和寄存器)理解。

注意4點(diǎn):

A.使能后備區(qū)域:PWR_BackupAccessCmd(ENABLE);

從系統(tǒng)框圖可以看見RTC有陰影部分,其實(shí)這部分就是后備區(qū)域。因此,需要使能,這也是為什么上面需要配置RCC時(shí)鐘的原因。

B.選擇RTC時(shí)鐘源:RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

在原理描述中說(shuō)了,RTC時(shí)鐘源有三種:

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

可以在源代碼中查看其參數(shù),也是有3中可以選擇。

C.使能RTC鬧鐘中斷:RTC_ITConfig(RTC_IT_SEC,ENABLE);

RTC有三類中斷:

RTC_IT_SEC秒中斷

RTC_IT_ALR鬧鐘中斷

RTC_IT_OW(計(jì)數(shù))溢出中斷

上一篇文章提供的拓展功能“RTC鬧鐘”就是使用鬧鐘中斷,可以下載實(shí)例工程查看源代碼。

D.RTC分頻:RTC_SetPrescaler(32767);

我們是為了得到真正的1秒鐘中斷一次。

3. RTC初始化


該函數(shù)位于rtc.c文件下面;

A.我們使用BKP保存“標(biāo)志位”數(shù)據(jù)(第一次才初始化,后面就不用初始化了)。我們初始化時(shí)間為:2016年7月18日 1800(假如為當(dāng)前值)。 如果有電池,則會(huì)按照這個(gè)時(shí)間一直持續(xù)下去,系統(tǒng)掉電之后也不會(huì)影響時(shí)鐘的計(jì)數(shù)。

B.第二次及以后上電需要等待RTC與RTC_APB時(shí)鐘同步。

C.使能RTC秒中斷,我們用于測(cè)試并打印RTC日歷數(shù)據(jù)。如果你的應(yīng)用是直接讀取RTC日歷,不是想我們實(shí)例那樣中斷打印數(shù)據(jù),則可以不開啟該中斷。

4. RTC讀寫描述


該結(jié)構(gòu)體位于rtc.h文件下面;

這要就是用于讀寫用(這樣直接傳遞一個(gè)參數(shù)就行了,不用傳遞“一串”整形變量)


該函數(shù)位于rtc.c文件下面;

RTC日歷寫(設(shè)置)函數(shù),這個(gè)函數(shù)是筆者整理并經(jīng)過(guò)項(xiàng)目驗(yàn)證的,可直接調(diào)用。

注意:

參數(shù)不能越界(超出范圍),超出范圍會(huì)返回錯(cuò)誤。


該函數(shù)位于rtc.c文件下面;

RTC日歷讀(獲?。┖瘮?shù),這個(gè)函數(shù)是筆者整理并經(jīng)過(guò)項(xiàng)目驗(yàn)證的,可直接調(diào)用。

注意:

需要配置RTC并初始化RTC值才會(huì)讀出正確的日歷值。

Ⅴ、解答問(wèn)題


上面筆者留下的問(wèn)題或許對(duì)于初學(xué)者不是很關(guān)心,但對(duì)于在工作中,需要實(shí)際項(xiàng)目的開發(fā)的人應(yīng)該比較有幫助。

1、為什么不建議使用LSI作為時(shí)鐘源來(lái)設(shè)計(jì)日歷?

原因在于LSI不是屬于后備區(qū)域,而RTC日歷部分是屬于后備局域(見上圖),也就是說(shuō)系統(tǒng)一旦掉電,RTC時(shí)鐘就不能工作了。

2、兩個(gè)實(shí)例工程之間的差別? 將實(shí)例中使用“LSE”時(shí)鐘改為“LSI”時(shí)鐘,其他地方不該可以嗎?

這個(gè)地方和第一個(gè)問(wèn)題有關(guān)聯(lián),修改后的工程程序會(huì)死在等待時(shí)鐘同步的地方。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • LSI
    LSI
    +關(guān)注

    關(guān)注

    0

    文章

    274

    瀏覽量

    27998
  • STM32F10x
    +關(guān)注

    關(guān)注

    1

    文章

    81

    瀏覽量

    20681
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    538

    瀏覽量

    66460
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32F101x8/STM32F101xB手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《STM32F101x8/STM32F101xB手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 12-06 15:45 ?8次下載

    STM32F103x8/STM32F103xB規(guī)格書

    電子發(fā)燒友網(wǎng)站提供《STM32F103x8/STM32F103xB規(guī)格書.pdf》資料免費(fèi)下載
    發(fā)表于 12-06 15:43 ?0次下載

    【GD32 MCU 移植教程】9、從 STM32F10x 系列移植到 GD32F30x 系列

    GD32F30x 系列 MCU 是基于 Arm? Cortex?-M4 處理器的 32 位通用微控制器,與 STM32F10x 系列 MCU 保持高度兼容。本文主要從以下三個(gè)方面進(jìn)行介紹:硬件資源
    的頭像 發(fā)表于 09-07 09:57 ?677次閱讀
    【GD32 MCU 移植教程】9、從 <b class='flag-5'>STM32F10x</b> 系列移植到 GD32<b class='flag-5'>F30x</b> 系列

    STM32F10xxx參考手冊(cè)(中文)

    電子發(fā)燒友網(wǎng)站提供《STM32F10xxx參考手冊(cè)(中文).pdf》資料免費(fèi)下載
    發(fā)表于 08-19 11:53 ?7次下載

    STM32F10xx芯片資料

    電子發(fā)燒友網(wǎng)站提供《STM32F10xx芯片資料.pdf》資料免費(fèi)下載
    發(fā)表于 07-08 14:56 ?1次下載

    STM32F10x標(biāo)準(zhǔn)外設(shè)庫(kù)參考手冊(cè)

    STM32F10x標(biāo)準(zhǔn)外設(shè)庫(kù)參考手冊(cè)
    發(fā)表于 06-24 09:26 ?11次下載

    STM32F103VBT6利用RTC輸出秒脈沖,為什么無(wú)法實(shí)現(xiàn)?

    。 /****************************************************************/ #includequot;stm32f10x.h quot; void
    發(fā)表于 05-17 06:43

    STM32F103C8T6時(shí)鐘RTC每次啟動(dòng)變慢1s是為什么?

    本人使用STM32F103C8T6自身的RTC時(shí)鐘制作了一個(gè)時(shí)鐘定時(shí)器,運(yùn)行正常,但是發(fā)現(xiàn)一個(gè)問(wèn)題:每次上電啟動(dòng)10次,大約會(huì)變慢大約9~10s。我的程序模板使用
    發(fā)表于 05-13 06:25

    STM32F10xxx參考手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《STM32F10xxx參考手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 05-11 15:12 ?24次下載

    stm32f051r8中RTC日歷時(shí)鐘如何將年月日時(shí)分秒轉(zhuǎn)換成秒計(jì)數(shù)?

    各位大俠,請(qǐng)問(wèn)一下stm32f051r8 中RTC日歷時(shí)鐘如何將年月日時(shí)分秒轉(zhuǎn)換成秒計(jì)數(shù),資料里說(shuō)的有點(diǎn)沒弄明白,不能使用中斷,因?yàn)楫a(chǎn)品斷電時(shí)由紐扣電池供電。
    發(fā)表于 05-08 08:21

    STM32 RTC時(shí)間變0的原因是什么?

    最近公司產(chǎn)品遇到個(gè)問(wèn)題,客戶使用幾個(gè)月后產(chǎn)品的RTC時(shí)間會(huì)變成初始化的時(shí)間2000年1月1日0分0秒。主芯片STM32F407VGT6,STM32F429IGT6,STM32F407Z
    發(fā)表于 04-30 07:51

    STM32F103 RTC日期讀取不對(duì)怎么解決?

    STM32F103 RTC日期讀取不對(duì)問(wèn)題,有沒有什么辦法解決?這個(gè)問(wèn)題究竟是STM32的庫(kù)本身有問(wèn)題還是其他什么原因呢?如果是庫(kù)的問(wèn)題,難道ST公司這么多年了,一直都不管么?
    發(fā)表于 04-16 07:08

    STM32F103正點(diǎn)RTC RTC_Alarm_Set不能作用是為什么?

    STM32F103正點(diǎn)RTC RTC_Alarm_Set根本不能作用
    發(fā)表于 04-08 07:28

    STM32F1的LL庫(kù),RTC怎么不能設(shè)置日期?

    STM32F1的LL庫(kù),RTC 怎么不能設(shè)置日期,只能設(shè)置時(shí)間。
    發(fā)表于 03-29 07:02

    GD32F10x系列MCU用戶手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《GD32F10x系列MCU用戶手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 03-13 10:27 ?14次下載
    GD32<b class='flag-5'>F10x</b>系列MCU用戶手冊(cè)
    RM新时代网站-首页