芯片的供電引腳
引腳表橙色的是芯片的供電引腳,其中VSS/VDD是芯片內部數字部分的供電,VSSA/VDDA是芯片內部模擬部分的供電,這4組以VDD開頭的供電都是系統的主電源,正常使用時,全部都要接3.3V的電源上,VBAT是備用電池的引腳,如果要使用STM32的BKP和RTC,這個引腳就必須接備用電池,用來維持BKP和RTC主電源掉電后的供電,VBAT只有一根電源正,接的時候GND要與VDD共地。如果沒有外部電池,參考手冊建議VBAT引腳接到VDD并接一個100nf的濾波電容。
BKP簡介
1、BKP(Backup Registers)備份寄存器
2、BKP可用于存儲用戶應用程序數據。當VDD(2.0~3.6V)電源被切斷,他們仍然由VBAT(1.8~3.6V)維持供電。當系統在待機模式下被喚醒,或系統復位或電源復位時,他們也不會被復位。當VDD和VBAT都沒電時,BKP就會清空數據,因為BKP本質是RAM存儲器,沒有掉電不丟失的特性。
3、TAMPER引腳產生的侵入事件將所有備份寄存器內容清除(TAMPER引腳產生上升沿/下降沿就清空數據),注意PC13、TAMPER引腳、RTC輸出在一個引腳上,只能分時復用
4、RTC引腳輸出RTC校準時鐘、RTC鬧鐘脈沖或者秒脈沖
5、存儲RTC時鐘校準寄存器(可配合上面輸出RTC校準時鐘的功能對RTC時鐘進行校準)
6、用戶數據存儲容量:20字節(中容量和小容量)/ 84字節(大容量和互聯型)
BKP的基本結構
上圖中的橙色部分位于后備區域,BKP和RTC都位于后備區域。后備區域供電的特性:當VDD主電源掉電時,切換至VBAT供電,當VDD上電時,供電由主電源VDD提供,這樣可以節省VBAT備用電池的電量。
RTC簡介
1、RTC(Real Time Clock)實時時鐘
2、RTC是一個獨立的定時器,可為系統提供時鐘和日歷的功能
3、RTC和時鐘配置系統處于后備區域,系統復位時數據不清零,VDD(2.0~3.6V)斷電后可借助VBAT(1.8~3.6V)供電繼續走時
4、32位的可編程計數器,可對應Unix時間戳的秒計數器
5、20位的可編程預分頻器,可適配不同頻率的輸入時鐘
6、可選擇三種RTC時鐘源:
??? HSE時鐘除以128(通常為8MHz/128)
??? LSE振蕩器時鐘(通常為32.768KHz)
??? LSI振蕩器時鐘(40KHz)
RTC的時鐘大多是32.768kHz的原因
32.768kHz==32768Hz
32768=2^15,經過一個15位分頻器的自然溢出,就可以得到1Hz的頻率。
自然溢出:設計一個15位的計數器,該計數器沒有計數目標,直接從0記到最大值32767,記滿后自然溢出,這個信號就是1Hz的。沒有計數目標,也不需要比較,可以簡化電路設計。
RTC的框圖
1、框圖分為4個部分,上面是APB1總線讀寫部分(RTC是APB1總線上的設備),左邊是核心的分頻,計數計時部分,右邊是中斷輸出使能和NVIC部分,下邊是與PWR有關的部分(RTC的鬧鐘可以喚醒設備,退出待機狀態),圖中灰色部分在主電源VDD掉電后,可由VBAT維持供電,繼續工作。
2、RTCCLK是RTC的時鐘源選擇,共有3中選擇。
RTC_PRL寄存器的值是n就是n+1倍分頻,比如n=6就是7分頻。(n就是計數目標)
RTC_DIV計數器是一個自減計數器,來一個脈沖計數器減1,計數值減至0后再來一個脈沖溢出時由PRL重裝載設定值。比如:DIV可以保持初始值為0,首次來一個脈沖,計數值溢出重載為32767,之后來一個脈沖減1,一直減至0,再來一個脈沖計數值重載,反復循環,詳細看下圖。兩個秒脈沖的間隔就是32768個RTCCLK單位時間間隔。
3、當RTC_CNT和RTC_ALR的值相等時,這時就會產生RTC_Alarm信號,一路通向中斷,可以在中斷中執行一些操作,另一路通向待機部分,可以讓單片機退出待機模式(WK_UP也可以使設備退出待機模式)。右邊3個中斷分別是秒中斷,溢出中斷和鬧鐘中斷。F結尾的是中斷標志位,IE結尾的是中斷使能。
RTC的基本結構
RTC操作注意事項
1、執行以下操作將使能對BKP和RTC的訪問:
設置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP時鐘
設置PWR_CR的DBP,使能對BKP和RTC的訪問
2、若在讀取RTC寄存器時,RTC的APB1接口曾經處于禁止狀態,則軟件首先必須等待RTC_CRL寄存器中的RSF位(寄存器同步標志)被硬件置1。(為保證RTC掉電繼續工作,RTC的寄存器由RTCCLK驅動。故用APB1總線訪問RTC寄存器時,有時鐘不同步的問題(一個36M,一個大約32k),只有在RTCCLK來一個上升沿RTC寄存器的值才能同步到APB1總線上,等待RSF標志位置1后,實質上就是等待RTC寄存器的值同步到APB1總線上,再由APB1總線獲取RTC的值)
3、必須設置RTC_CRL寄存器中的CNF位,使RTC進入配置模式后,才能寫入RTC_PRL、RTC_CNT、RTC_ALR寄存器(使用庫函數時,自動加上了該操作)
4、對RTC任何寄存器的寫操作,都必須在前一次寫操作結束后進行。可以通過查詢RTC_CR寄存器中的RTOFF狀態位,判斷RTC寄存器是否處于更新中。僅當RTOFF狀態位是1時,才可以寫入RTC寄存器。(實質上還是由于時鐘不同步的原因)