stm32之時鐘控制
本文提到的有以下內容:
- 時鐘系統與總線矩陣
- SysTick系統定時器
- RTC實時時鐘
- 看門狗定時器
- 通用定時器
一、時鐘系統與總線矩陣
stm32F4的時鐘樹如下圖所示:
在STM32中,有五個時鐘源,為HSI、HSE、LSI、LSE、PLL。
- HSI是高速內部時鐘,RC振蕩器,頻率為8MHz。
- HSE是高速外部時鐘,可接石英/陶瓷諧振器,或者接外部時鐘源,頻率範圍為4MHz~16MHz。
- LSI是低速內部時鐘,RC振蕩器,頻率為40kHz。
- LSE是低速外部時鐘,接頻率為32.768kHz的石英晶體。
- PLL為鎖相環倍頻輸出,其時鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為2~16倍,但是其輸出頻率最大不得超過72MHz。
我們在學習51單片機的時候,其內部是沒有晶振的,而stm32是有的。stm32可以通過RCC(時鐘控制寄存器)對時鐘進行參數配置以
及使能。我們還可以通過修改system_stm32f4xx.c文件,來配置上述時鐘樹上的一些分頻、倍頻參數,得到理想的頻率。
在單片機系統中,CPU和總線以及外設的時鐘設置是非常重要的,因為沒有時鐘就沒有時序,組合電路需要好好理解清楚。我們先來看
一下總線矩陣。
片上總線標準種類繁多,而由ARM公司推出的AMBA片上總線受到了廣大IP開發商和SoC系統集成者的青睞,已成為一種流行的工業標
準片上結構。AMBA規範主要包括了AHB(Advanced High performance Bus)系統總線和APB(Advanced Peripheral Bus)外圍總線。二者
分別適用於高速與相對低速設備的連接。
一般性的時鐘設置需要先考慮系統時鐘的來源,是內部RC還是外部晶振還是外部的振蕩器,是否需要PLL。然後考慮內部總線和外部總線,
最後考慮外設的時鐘信號。遵從先倍頻作為CPU時鐘,然後在由內向外分頻,下級遷就上級的原則。
二、SysTick系統定時器
SysTick—系統定時器是屬於CM4內核中的一個外設,內嵌在NVIC中。系統定時器是一個24bit的向下遞減的計數器,計數器每計數一次的時
間為1/SYSCLK,一般我們設置系統時鐘SYSCLK等於180M。當重裝載數值寄存器的值遞減到0的時候,系統定時器就產生一次中斷,以此循環往復。
因為SysTick是屬於CM4內核的外設,所以所有基於CM4內核的單片機都具有這個系統定時器,使得軟件在CM4單片機中可以很容易的移植。
系統定時器一般用於操作系統,用於產生時基,維持操作系統的心跳。
一般用於系統內部運行以及延時函數。
三、RTC實時時鐘
RTC(Real-Time Clock)實時時鐘為操作系統提供了一個可靠的時間,並且在斷電的情況下,RTC實時時鐘也可以通過電池供電,一直運行下去。
RTC通過STRB/LDRB這兩個ARM指令向CPU傳送8位數據(BCD碼)。數據包括秒,分,小時,日期,天,月和年。RTC實時時鐘依靠一個外部
的32.768Khz的石英晶體,產生周期性的脈沖信號。每一個信號到來時,計數器就加1,通過這種方式,完成計時功能。
RTC實時時鐘有如下一些特性:
- 1,BCD數據:這些數據包括秒、分、小時、日期、、星期幾、月和年。
- 2,閏年產生器
- 3,報警功能:報警中斷或者從掉電模式喚醒
- 4,解決了千年蟲問題 (詳見http://baike.baidu.com/view/9349.htm)
- 5,獨立電源引腳RTCVDD
- 6,支持ms中斷作為RTOS內核時鐘
- 7,循環復位(round reset)功能
如圖,RTC實時時鐘的框架圖,XTIrtc和XTOrtc產生脈沖信號,即外部晶振。傳給2^15的一個時鐘分頻器,得到一個128Hz的頻率,這個頻率用
來產生滴答計數。當時鐘計數為0時,產生一個TIME TICK中斷信號。時鐘控制器用來控制RTC實時時鐘的功能。復位寄存器用來重置SEC和MIN寄存
器。閏年發生器用來產生閏年邏輯。報警發生器用來控制是否產生報警信號。
四、看門狗定時器
看門狗定時器又分為獨立看門狗IWDG和窗口看門狗WWDG。
1、獨立看門狗
獨立看門狗IWDG其實是一個12位遞減計數器,有故障時,計數器減到0,產生復位,無故障時,計數器減到0之前就刷新計數值(餵狗),不進
行復位。其采用獨立時鐘,主要用於監視硬件錯誤(不受系統時鐘影響)。
2、窗口看門狗
窗口看門狗WWDG其實是一個7位遞減計數器,有計數上下限,下限位0x40,上限由用戶指定,上下限之間刷新計數值則不復位,其他都復位。采
用系統時鐘,主要用於監視軟件錯誤。
五、通用定時器
stm32的定時器有基本定時器、通用定時器和高級定時器。這裏以通用定時器為例,其內部結構如下圖所示,需要設置預分頻系數,並不是直接
使用APB1的時鐘。
通用定時器的計數模式分為5種:
- 向上計數:計數器從0計數到自動裝載值。
- 向下計數:從自動裝載值計數到0。
- 向上向下計數(中心對齊計數):計數器從0計數到自動裝載值,再從自動裝載值計數到0,反復循環。
- 輸入捕獲:測量輸入信號的脈寬、PWM波的占空比等。
- 輸出比較:PWM波用的就是這種模式。
定時器的時間公式:T=((n-1)*(pre-1))/Tclk,其中n為計數值,pre為預分頻系數,Tclk為定時器時鐘。
為什麽計數值和預分頻系數要減一?因為計數是從0開始的,而預分頻系數為0時,表示不分頻。
stm32之時鐘控制