以STM32F072CB做的測試
官方參考應(yīng)用文檔:AN4759
RTC日歷時鐘配置
通過兩個預(yù)分頻得到1hz的時鐘用來更新日歷。
- 異步預(yù)分頻:PREDIV_A,7-bit(0-127)
- 同步預(yù)分頻:PREDIV_S,15-bit(0-32767)
頻率計算公式如下:
Fck=Frtcclk/((PREDIV_A-1)*(PREDIV_S-1))
所以計算出PREDIV_A和PREDIV_S的值在配置時記得減1。
配置舉例:
- 比如選擇LSI=40khz作為RTC的時鐘源,要產(chǎn)生1hz的時鐘,就可以配置PREDIV_A=39,PREDIV_S=999
- 比如選擇LSE=32.768khz作為RTC的時鐘源,要產(chǎn)生1hz的時鐘,可以配置PREDIV_A=127,PREDIV_S=255
為了產(chǎn)生1hz的時鐘,分頻值可以有多種組合,上面兩種只是舉例。如果用到alarm也要考慮下面描述的alarm子秒配置。
目標是產(chǎn)生1hz的時鐘,當然也可以分頻產(chǎn)生非1hz的時鐘,只是那樣RTC的日歷不準而已。
RTC alarm
設(shè)定Alarm可以配置多種對比域,每一個都可以單獨被屏蔽:
- 日期或者星期(二選一)
- 小時
- 分鐘
- 秒
- 子秒(根據(jù)PREDIV_S預(yù)分頻的值來確定分辨率)
這些參數(shù)分為兩個寄存器來進行配置,一個是RTC_ALRMAR,另一個是RTC_ALRMASSR(這個專門負責(zé)子秒的alarm配置)
配置舉例
- 比如我現(xiàn)在只想在子秒匹配時候產(chǎn)生alarm,那么Mask4、Mask3、Mask2、Mask1位全部設(shè)置為1,正確配置Mask ss的值。
- 在30分40秒的時候產(chǎn)生alarm,就把Mask2和Mask1設(shè)置為0,其他屏蔽位都配置為1。并把分的對比值設(shè)置為30,秒的對比值設(shè)置為40
Alarm 子秒的配置
RTC alarm的日期、時、分、秒的比較值配置都比較簡單,而子秒的配置就會稍微復(fù)雜一點。
子秒的比較值是在RTC_ALARMASSR中進行設(shè)置,對比的對象是RTC_SSR。
RTC_SSR是子秒的計數(shù)器,他的分辨率為:1/(PREDIV_S+1)秒,并且是向下計數(shù)的,當值減到0以后會重裝載RTC_SPRE中的PREDIV_S。
alarm子秒配置舉例:
首先確定RTC時鐘源,比如使用的是LSI=40KHZ。
可以配置PREDIV_A=39,PREDIV_S=999 就可以獲得日歷1秒鐘的時鐘。
這樣子秒的分辨率就為:1sec/(999+1)=1ms
alarm子秒的Mask位:
子秒的Mask位是使用了4bit,位于RTC_ALARMASSR[27:24],設(shè)置不同值會屏蔽不同的對比位,具體如下表。如果我們要子秒完全和RTC_SSR值進行對比,就配置MASKSS[3:0]=15
RTC Alarm stm32cubemx配置:
激活日歷和Alarm:
配置兩個分頻值(要根據(jù)時鐘源計算)
設(shè)置Alarm相關(guān)的參數(shù),這個要根據(jù)自己實際情況來配置。比如我只讓子秒進行對比,日期、時、分、秒的屏蔽位都給使能了。設(shè)置的Sub Seconds值貌似是cubemx的一個bug,范圍只允許0-59。所以生成工程以后我在代碼里面手動改成了999
把RTC的中斷給使能了,讓Alarm可以產(chǎn)生中斷
時鐘配置不要忘記做選擇,這里我使用LSI
生成MDK工程編寫代碼
rtc.c中這里我手動修改成了999
測試代碼主要就是寫一個RTC的中斷回調(diào)函數(shù)放在main.c中就可以,在觸發(fā)alarm的時候翻轉(zhuǎn)LED
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)‘
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
}
-
STM32
+關(guān)注
關(guān)注
2302文章
11104瀏覽量
370205 -
時鐘
+關(guān)注
關(guān)注
11文章
1947瀏覽量
134275 -
中斷
+關(guān)注
關(guān)注
5文章
911瀏覽量
43449 -
RTC
+關(guān)注
關(guān)注
2文章
635瀏覽量
70651 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
93瀏覽量
12096
發(fā)布評論請先 登錄
stm32的alarm觸發(fā)不是按照我程序設(shè)定的
stm32l0 rtc WakeupTimer 和 alarm設(shè)置問題
教你使用RT-Thread開啟STM32H7系列的RTC與Alarm組件
淺談基于Apollo3平臺Alarm組件的移植
STM32L431 RTC設(shè)置和Alarm callback時區(qū)不一致是為什么?
分析在RTT中RTC alarm文件的實現(xiàn)方法
RTC alarm組件不能進入回調(diào)函數(shù)該怎樣去解決呢
基于STM32F1的RTC與Alarm(鬧鐘功能)實現(xiàn)定時控制的要求
STM32L431 RTC設(shè)置和Alarm callback時區(qū)不一致怎么辦呢
RTC alarm組件不進入回調(diào)函數(shù)的原因是什么?
RTC的alarm中斷事件能否喚醒standby或者shutdown模式?
STM32單片機RTC時鐘的使用方法及步驟

RT-Thread 應(yīng)用筆記 - RTC Alarm 組件的使用

STM32片內(nèi)RTC亞秒特性的應(yīng)用示例(下)

評論