大家都知道在使用微控制器時,時鐘速度決定於外部晶振或內部rc振盪電路的頻率,是不可以改變的。而arm的出現打破了這一傳統的法則,可以通過軟體隨意改變時鐘速度。
這一出現讓我們的設計更加靈活,但是也給我們的設計增加了複雜性。為了讓使用者能夠更簡單的使用這一功能,stm32的庫函式已經為我們設計的更加簡單方便。
在比較考前的版本中,我們需要向下面這樣設定時鐘:
用hse時鐘,程式設定時鐘引數流程:
步驟函式
定義型別變數(步驟3會用到)
errorstatus hsestartupstatus;
1、將rcc暫存器重新設定為預設值
rcc_deinit();
2、開啟外部高速時鐘晶振hse
rcc_hseconfig(rcc_hse_on);
3、等待外部高速時鐘晶振工作
hsestartupstatus = rcc_waitforhsestartup();
4、設定ahb時鐘
rcc_hclkconfig;
5、設定高速ahb時鐘
rcc_pclk2config;
6、設定低速速ahb時鐘
rcc_pclk1config;
7、設定pll
rcc_pllconfig;
8、開啟pll
rcc_pllcmd(enable);
9、等待pll工作
while(rcc_getflagstatus(rcc_flag_pllrdy) == reset)
10、設定系統時鐘
rcc_sysclkconfig;
11、判斷是否pll是系統時鐘
while(rcc_getsysclksource() != 0x08)
12、開啟要使用的外設時鐘
rcc_apb2periphclockcmd()/rcc_apb1periphclockcmd()
**如下:
void rcc_configuration(void)
/* 開啟apb2匯流排上的gpioa時鐘*/
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa , enable);
}
隨著函式庫版本的不斷公升級,到3.0以上時,我們就不用再這樣編寫時鐘設定了,我們只要做如下三步即可:
第一步: 在system_stm32f10x.c 中 #define sysclk_freq_72mhz 72000000
也可以定義其他的大小。
第二步:呼叫systeminit()
第三步:開啟對應的外設時鐘
這是因為在啟動檔案startup_stm32f10x_hd.s(其他型號和大小的啟動檔案相似)中有這樣兩句**
reset_handler:
...import systeminit
ldr r0,systeminit
這兩句**的意思是先定義systeminit,然後呼叫systeminit函式。
其中systeminit()函式在system_stm3210x.c檔案中。
檔案的開頭定義了
//#define sysclk_freq_hse hse_value
//#define sysclk_freq_20mhz 20000000
//#define sysclk_freq_36mhz 36000000
//#define sysclk_freq_48mhz 48000000
//#define sysclk_freq_56mhz 56000000
#define sysclk_freq_72mhz 72000000
#define sysclk_freq_72mhz 72000000
也就是103系列能跑到的最大值72m
然後這個 c檔案繼續往下看
1
#elif defined sysclk_freq_72mhz
2const uint32_t systemfrequency = sysclk_freq_72mhz;
3const uint32_t systemfrequency_sysclk = sysclk_freq_72mhz;
4const uint32_t systemfrequency_ahbclk = sysclk_freq_72mhz;
5const uint32_t systemfrequency_apb1clk = (sysclk_freq_72mhz/2);
6const uint32_t systemfrequency_apb2clk = sysclk_freq_72mhz;
這就是在定義了cpu跑72m的時候,各個系統的速度了.他們分別是:硬體頻率、系統頻率、ahb匯流排頻率、apb1匯流排頻率、apb2匯流排頻率
再往下看,看到這個了:
#elif defined sysclk_freq_72mhz
static
void setsysclockto72(void);
看到這裡我們應該明白:
systeminit中呼叫setsysclock
setsysclock中呼叫setsysclocktoxx,其中xx代表具體的時鐘大小,如72表示72mhz。
在啟動檔案中先呼叫systeminit,再呼叫main
保險起見我們可以在main函式中可以再次呼叫systeminit,然後在開啟各個外設時鐘
main.c
systeminit();
/* 開啟apb2匯流排上的gpioa時鐘,即開啟相應的外設時鐘
其他外設開啟對應時鐘即可
*/rcc_apb2periphclockcmd(rcc_apb2periph_gpioa , enable);
STM32時鐘系統
下面我們根據這張圖說說有關stm32時鐘系統的那些事 io uint32 t cr hsi,hse,css,pll等的使能和就緒標誌位 io uint32 t cfgr pll等的時鐘源選擇,分頻係數設定 io uint32 t ahbenr dma,sdio等時鐘使能 io uint32 t ap...
stm32時鐘分割
不太明白 1 tim perscaler來設定預分頻係數 2 tim clockdivision來設定時鐘分割 時鐘分頻因子 3 tim countermode來設定計數器模式 時鐘分割定義的是在定時器時鐘頻率 ck int 與數字濾波器 etr,tix 使用的取樣頻率之間的分頻比例。tim clo...
STM32時鐘總結
系統時鐘可以由3種時鐘源提供 hse hsi和pll pll時鐘源是通過是由hsi時鐘除以2或則hse分頻得到,然後通過倍頻器得到pllclk 然後匯流排時鐘由系統時鐘提供 在hal庫中,使用stm32cubemx配置時鐘很方便,自動生成。rcc oscinitstruct.pll.pllstate...