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