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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

STM32F10x _RTC秒中斷

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-25 11:39 ? 次閱讀

Ⅰ、概述

RTC(Real Time Clock)是實時時鐘的意思,它其實和TIM有點類似,也是利用計數(shù)的原理,選擇RTC時鐘源,再進行分頻,到達計數(shù)的目的。

該文主要講述關于RTC的秒中斷功能,這個功能類似SysTick系統(tǒng)滴答的功能。RTC秒中斷功能其實是每計數(shù)一次就中斷一次。注意,這里所說的秒中斷并非一定是一秒的時間,它是由RTC時鐘源和分頻值決定的“秒”的時間,當然也是可以做到1秒鐘中斷一次。

本文章提供的實例工程,其實驗效果是:

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

秒中斷一次打印數(shù)據(jù)"RTC Sec...";

也就是LED變化一次,串口打印一次數(shù)據(jù)"RTC Sec..."

擴展部分的功能RTC計數(shù):可以實現(xiàn)RTC鬧鐘,本文將提供實例工程源代碼供大家下載學習。

關于本文的更多詳情請往下看。

Ⅱ、實例工程下載

筆者針對于初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學者一看就明白,以簡單明了的工程供大家學習。

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

提供下載的軟件工程是STM32F103ZE的,但F1其他型號也適用(適用F1其他型號:關注微信,回復“修改型號”)。

STM32F10x_RTC鬧鐘實例源代碼工程:

https://yunpan.cn/cBbpu3gIGK38a 訪問密碼 05da

STM32F10x_RTC秒中斷實例源代碼工程:

https://yunpan.cn/cBbpPnhYbXR9x 訪問密碼 561f

STM32F1資料

https://yunpan.cn/crBUdUGdYKam2 訪問密碼 ca90

Ⅲ、原理描述

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

RTC框圖:

從上面系統(tǒng)框圖來分析“RTC秒中斷”的原理:

1.RTC時鐘源,總共有三類:

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

本文實例代碼是:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

使用“RCC_RTCCLKSource_HSE_Div128”作為時鐘源(高速時鐘源),也就是外部高速時鐘的128分頻,也就是每秒8M/128(62500)個脈沖;

當然,我們也可以選擇另外兩個時鐘源,也就是使用低速時鐘源,一般應用在RTC鬧鐘可RTC日歷等都使用低速時鐘源。

2.RTC分頻:

本文實例代碼是:RTC_SetPrescaler(62500);

這個值是和上面對應的,因為我們這里是實現(xiàn)真正的1秒鐘中斷一次。

3.RTC中斷:

RTC中斷有三種:

RTC_IT_SEC秒中斷

RTC_IT_ALR鬧鐘中斷

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

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

使能RTC_IT_SEC秒中斷。

再次強調(diào):

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

我們可以試著將源代碼中的分頻值該62500的一半31250,可以看得出來,秒中斷的間隔時間為0.5秒(請自行修改實驗測試)。

Ⅳ、源代碼分析

筆者以F1標準外設庫(同時也建議初學者使用官方的標準外設庫)為基礎建立的工程,主要以庫的方式來講述(若您的F1芯片與提供工程不一樣,可微信回復“修改型號”)。

下面將講述關于“RTC秒中斷”重要的、容易弄錯的幾點:

1.RCC時鐘源


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

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

重點注意:

A.外設RCC時鐘的配置要在其外設初始化的前面;

B.匹配對應時鐘。

比如:RCC_APB2外設不要配置在RCC_APB1時鐘里面

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

2. RTC秒中斷配置


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

該函數(shù)請結合參考手冊(框圖和寄存器)理解。

注意4點:

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

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

B.選擇RTC時鐘源:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

在原理描述中說了,RTC時鐘源有三種:

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(計數(shù))溢出中斷

我提供的拓展功能“RTC鬧鐘”就是使用鬧鐘中斷,可以下載實例工程查看源代碼。

D.RTC分頻:RTC_SetPrescaler(62500);

我們是為了得到真正的1秒鐘中斷一次,所以這里的值是62500= 8M/128,這樣才能剛好1秒中斷一次。

3. NVIC配置


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

我們要中斷,就需要配置NVIC(中斷控制器),為其分配優(yōu)先級。

很多人覺得自己的配置沒問題,但程序就是不進入中斷,原因可能就在這里。因此,NVIC這里也是容易忽略的地方。

4. RTC中斷


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

這里需要注意,RTC有三類中斷,但入口都是這個函數(shù),因此,需要在函數(shù)體里面分辨是哪一個中斷進入了該函數(shù)。

注意1點:

清除中斷標志位:RTC_ClearITPendingBit(RTC_IT_SEC);

有的中斷標志位清除方法可能有幾種方法,比如USART接收中斷,只要讀取接收值就可以清除(請看USART1_IRQHandler函數(shù))

可能有人覺得自己的程序老是字在中斷函數(shù)里面,原因可能就在于沒有清除中斷標志位。

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

    關注

    1

    文章

    81

    瀏覽量

    20632
  • RTC
    RTC
    +關注

    關注

    2

    文章

    511

    瀏覽量

    65897
  • 時鐘源
    +關注

    關注

    0

    文章

    92

    瀏覽量

    15886
收藏 人收藏

    評論

    相關推薦

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

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

    STM32F10x標準外設庫參考手冊

    STM32F10x標準外設庫參考手冊
    發(fā)表于 06-24 09:26 ?5次下載

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

    芯片用的是STM32F103VBT6,目前程序已經(jīng)可以在tamper(PC13)引腳上輸出校正時鐘,其時鐘頻率為RTC時鐘除以64。但調(diào)了好幾天都無法輸出脈沖,求大神搭救
    發(fā)表于 05-17 06:43

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

    各位大俠,請問一下stm32f051r8 中RTC日歷時鐘如何將年月日時分秒轉(zhuǎn)換成計數(shù),資料里說的有點沒弄明白,不能使用中斷,因為產(chǎn)品斷電時由紐扣電池供電。
    發(fā)表于 05-08 08:21

    STM32 RTC時間變0的原因是什么?

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

    stm32L476RG RTC中斷如何使用?

    stm32L476RG RTC中斷如何使用
    發(fā)表于 04-26 08:24

    STM32G071WakeUp中斷配置為1,但實際中斷頻率卻小于1是為什么?

    之前用F1的RTC時,有一個中斷功能,即每一產(chǎn)生一個中斷,可以在
    發(fā)表于 04-01 07:57

    STM32L051同時開啟RTC時間戳和喚醒后,使用GPIO引腳無法觸發(fā)時間戳中斷如何解決?

    STM32L051同時開啟RTC時間戳和喚醒后,使用GPIO引腳無法觸發(fā)時間戳中斷。但使用一個3.3V的電源接到PC13能夠觸發(fā)RTC時間
    發(fā)表于 04-01 06:37

    在GD32F103移植STM32F103代碼

    使用相同F(xiàn)LASH和管腳數(shù)量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序。雖然兩個款芯片的寄存器地址以及架構基本相同。但是需要注意的是GD32F10x主頻是108兆,但是STM32F10x主頻是72兆。
    的頭像 發(fā)表于 12-15 13:37 ?1339次閱讀
    在GD32<b class='flag-5'>F</b>103移植<b class='flag-5'>STM32F</b>103代碼

    RT-thread源碼移植到STM32F10xSTM32F4xx

    RT-thread源碼移植到STM32F10xSTM32F4xx: 一、源碼下載 點擊入門->下載 ? 在歷史版本里邊隨便選取一個 ? 會進入百度云盤的下載地址,里邊有全部版本的源碼。這里下載
    的頭像 發(fā)表于 11-15 09:38 ?2058次閱讀
    RT-thread源碼移植到<b class='flag-5'>STM32F10x</b>和<b class='flag-5'>STM32F</b>4xx

    STM32F10x中一些專業(yè)術語解釋

    STM32F10x中一些專業(yè)術語解釋
    的頭像 發(fā)表于 11-01 16:59 ?417次閱讀

    STM32F10X定時器PWM輸入模式測量頻率、占空比精度問題如何處理?

    今天使用了STM32F10X定時器PWM輸入模式,用來測量輸入方波信號的頻率和占空比,發(fā)現(xiàn)精度不高,設置定時器的時鐘頻率為36MHz,預分頻為35,計數(shù)頻率為1MHz,即精度為1us,當輸入信號
    發(fā)表于 10-28 07:14

    STM32學習筆記一外部中斷

    STM32 的每個 IO 都可以作為外部中斷中斷輸入口。STM32F103 的中斷控制器支持 19 個外部
    的頭像 發(fā)表于 10-24 14:12 ?1163次閱讀
    <b class='flag-5'>STM32</b>學習筆記一外部<b class='flag-5'>中斷</b>

    STM32外部中斷

    68個可屏蔽中斷通道,包括EXTI,TIM,ADC,USART,SPI,I2C,RTC等多個外設(F1系列最多的數(shù)量,以型號為主);
    的頭像 發(fā)表于 10-24 09:29 ?383次閱讀
    <b class='flag-5'>STM32</b>外部<b class='flag-5'>中斷</b>

    STM32L4如何操作能最快速讓RTC的鬧鐘輸出(Alarm A 11次)重置?

    使用高精度晶振作為RTC時鐘源,想讓鬧鐘1輸出與GPS的1PPS同步,現(xiàn)在是用EXTI的上升沿觸發(fā)中斷檢測1次GPS的1PPS脈沖,在中斷
    發(fā)表于 10-21 12:19