stm32f1時鐘分析

2021-06-07 13:51:06 字數 2796 閱讀 8529

stm32片上時鐘分析,指出3.5韌體庫乙個bug

一、前言

1、本文主要討論系統時鐘以至外設時鐘之間的源流關係。介紹stm32的片上時鐘系統,描述系統時鐘初始化函式systeminit()對時鐘的控制(從hse到sysclk,第二節)與配置(sysclk到外設,第三節)。

2、103與107所用時鐘系統略有不同,但系統時鐘(sysclk)都是72mhz。

3、f107應當使用25mhz晶振。若採用8mhz的晶振,搭配3.0.0版韌體庫,則將f107當做f103使用,不能驅動通訊線產品所有功能(乙太網)。

5、rtc時鐘源來自32.768khz晶振。

二、系統時鐘sysclk

本節關注sysclk的**。

f107與f103時鐘系統略有不同,以下討論除非特別說明,全都針對f107,採用25mhz晶振,時鐘樹見附錄。

1、系統時鐘:sysclk

系統復位後,hsi振盪器被選為系統時鐘(8mhz),通過軟體(systeminit()函式)將系統時鐘源切換到pllclk。

pllclk的**是外部晶振hse,由hse訊號經過5分頻、8倍頻、5分頻得到8mhz的pll時鐘源,將其9倍頻得到72mhzpllclk。(若在f107上採用8mhz晶振,則將hse訊號9倍頻得到pllclk(72mhz),即系統時鐘)

2、systeminit()函式對時鐘的控制(時鐘控制暫存器cr,時鐘配置暫存器2cfgr2)

此函式在3.0.0與3.1.2版本韌體庫中是不同的。相較於f103,f107在硬體上多了兩個鎖相環和乙個cfgr2暫存器,並且定義了cr暫存器的26~29位。3.0.0版本韌體庫公升級為3.1.2版本,正是為了配合這種變化,並實現新增的功能。

呼叫3.0.0庫中的systeminit()函式,結果如下:

暫存器 值

cr 0101 0083

cfgr

001d 0402

cfgr2

函式未涉及此暫存器

cir0000 0000

對此不作過多討論,這樣的方式會使乙太網無法使用。

呼叫3.1.2庫中的systeminit()函式,結果如下:

暫存器 值

cr 0501 0083

cfgr

001d 0402

cfgr2

0001 0644

cir009f 0000

前三個暫存器配置了系統時鐘,cir是對中斷的設定。這樣,系統時鐘的**如下圖。藍色為復位後的時鐘系統,紅色為軟體設定的時鐘。

3.1.0版本的韌體庫中,systeminit()函式有bug,會在下文提到。

三、匯流排時鐘與外設時鐘。

本節關注從sysclk生發出的時鐘(pclk等)。

1、特性與相互關係

由系統時鐘分頻得ahb時鐘(也稱為hclk),ahb時鐘供給核心的有三路:hclk、fclk、系統定時器(可能需要分頻,視晶元型號而定)。

①兩個高速外設匯流排的最高時鐘不同,但都來自於hclk。

②定時器有硬體設定的分頻器,所以ck_int(internal clock,或稱作timxclk)並不一定等於相應匯流排的頻率,其規則為:

如果相應的

apb預分頻係數是

1,定時器的時鐘頻率與所在

apb匯流排頻率一致。否則,定時器的時鐘頻率被設為與其相連的

apb匯流排頻率的

2倍。 

③adc時鐘adcclk有最大限制,對於103和107,最大為14mhz。所謂最快ad時間為1m分之一秒的說法是這麼來的: t

conv 

= 取樣時間

+ 12.5

個週期

取樣時間設為最短的

1.5個週期,這樣

tconv

就是14個adcclk週期,當adcclk取最大的14mhz時,

tconv

的時間就是

1m分之一秒。

④有個有趣的現象:系統時鐘配置成72mhz時,無法實現最快adc。這是因為由於adcclk的上限限制,要對pclk2進行分頻,而72m無法分頻為14m,最大可用只能為12m,這樣自然不能實現最快adc。

2、systeminit()對rcc的配置(時鐘配置暫存器cfgr)

ahbclk=hclk=sysclk=72mhz

pclk1=hclk/2=36mhz,  

pclk2=hclk=72mhz

timx(所有定時器)=pclk1*2=pclk2=72mhz

adcclk=36mhz

以上就是正常情況下systeminit()的配置。所謂「正常」,是針對3.1.0版本韌體庫的bug來說的。此韌體庫的setsysclockto72函式(在system_stm32f10x.c檔案中,被systeminit呼叫),在配置通訊線產品的prediv1時(或稱為prediv1factor),錯將5分頻配置成3分頻,導致晶元的系統時鐘超頻執行在120mhz。3.1.2版本外設韌體庫修正了這個bug。出錯**如下圖:

另外,在呼叫systeminit()函式以後,adcclk是超頻的(pclk2/2, 36m),無法有保障地使用,需要呼叫rcc_adcclkconfig(rcc_pclk2_div6)將其配置成12mhz。這種麻煩特性到3.5.0版本韌體庫仍然存在,不知是什麼意圖。

7.2,圖11

STM32F1時鐘系統簡單分析

時鐘系統是cpu的脈搏,所以說要想深入理解stm32的外設,學習時鐘系統是非常有必要的。首先,讓我們看看網上找到的stm32f1時鐘框圖 在stm32中,有5個時鐘源,為hsi hse lsi lse和pll。從時鐘頻率來分可以分為高速時鐘源和低速時鐘源,在這5個中his hse以及pll是高速時鐘...

STM32F103 時鐘配置

stm32f103外部8m的振盪器,經過倍頻後最高可以達到72m。void rcc deinit void 將外設rcc暫存器重設為預設值 void rcc hseconfig u32 rcc hse 設定外部高速晶振 hse rcc hse 取值如下 rcc hse offhse晶振off rcc...

STM32F103 時鐘配置

由於stm32的庫預設是外部晶振8m的情況下實現的,所以配置波特率的時候也是按8m,包括主頻,如果用12m晶振就需要改動幾個地方 在system stm32f10x.c中找到相應型別的檔案,進行如下修改。1 72m主頻 8m時 rcc cfgr uint32 t rcc cfgr pllsrc hs...