stm32的HSI可以達到8MHZ,可是經過軟件的設置,可以讓stm32工做在72MHZ。接下來,就來完整的寫一遍時鐘設置函數。
stm32經過操縱寄存器到達編程控制硬件的目的。所以,首先要開一個.h的頭文件作一些基本的設置。編程
#ifndef __CLOCK_H__ #define __CLOCK_H__
接下來,在這其中作一些寄存器的宏定義:ide
#define RCC_BASE 0x40021000 #define RCC_CR ( RCC_BASE + 0x00 ) #define RCC_CFGR ( RCC_BASE + 0x04 )
固然,若是想要使用寄存器,那麼就要對寄存器進行指針解引函數
#define rRCC_CR *( ( unsigned int * ) RCC_CR ) #define rRCC_CFGR *( ( unsigned int * ) RCC_CFGR ) #endif
以上,基本上,就已經把所須要的寄存器配置好了。
而後,新建一個.c文件,開始寫時鐘設置函數,那麼將這個時鐘設置函數命名爲:void Set_SysClockTo72M(void);
在這個函數中,首先,進行一個基本的變量定義:指針
unsigned int rccCrHserdy = 0; unsigned int rccCrPllrdy = 0; unsigned int rccCrSw = 0; unsigned int faultTime = 0;
首先,要復位RCC_CR寄存器:rRCC_CR = 0x00000083;
接着,開啓外部時鐘,此時,對RCC_CR寄存器的bit16進行設置,若爲0,HSE振盪器禁用;若爲1,HSE振盪器打開。
首先對bit16清零,而後纔是配置。code
rRCC_CR &= ~( 1 << 16 ); rRCC_CR |= ( 1 << 16 );
任何一個時鐘的開啓都是須要時間的,所以,咱們須要檢測時鐘的開啓是否成功,若是成功,則繼續進行,若是失敗,則陷入死循環。flash
do { rccCrHserdy = rRCC_CR & ( 1 << 17 ); faultTime++; }while ((faultTime<0x0FFFFFFF) && (rccCrHserdy==0));
其實,接下來,還有一個flash的配置問題,可是因爲我對於flash的配置和時鐘有什麼關係不太清楚,因此就不寫了。
接下來,是對AHB,APB2,APB1進行設置。AHB不分頻,APB2不分頻,APB1兩分頻。由於,APB1最大隻能達到36MHZ。it
rRCC_CFGR &= ( ~( ( 0x0f << 4 ) | ( 0x07 << 8 ) | ( 0x07 << 11 ) ) ); rRCC_CFGR |= ( 0x00 << 4 | 0x04 << 8 | 0x00 << 11 );
HSE要設置爲輸入時鐘,同時不分頻。對HSE的設置,是對STM32的bit16,bit17進行設置。若對bit16進行置位操做,則HSE振盪器被選做PLL輸入時鐘;若對bit16進行復位操做,則HSI/2s振盪器被選做PLL輸入時鐘。若對,bit17進行置位操做,則HSE兩分頻;若對bit17進行復位操做,則HSE時鐘未被分頻。class
rRCC_CFGR &= ( ~( 0x01 << 16 | 0x01 << 17 ) ); rRCC_CFGR |= ( 0x01 << 16 | 0x00 << 17 );
要讓8MHZ的CPU工做在72MHZ,就要對PLL進行9倍頻。變量
rRCC_CFGR &= ~( 0x0f << 18 ); rRCC_CFGR |= ( 0x07 << 18 );
接下來,就是打開PLL使能。軟件
rRCC_CR |= 0x01 << 24;
時鐘的開啓,須要時間,所以,須要判斷是否開啓成功。
faultTime = 0; do { rccCrPllrdy = rRCC_CR & ( 1 << 17 ); faultTime++; }while ( ( faultTime < 0x0FFFFFFF ) && rccCrPllrdy == 0 );
接下來,就是,將PLL做爲,SYSCLK的時鐘來源。所以,咱們要對配置寄存器的bit0及bit1進行操做。若將bit1及bit0置爲00,則HSI被選做系統時鐘;若bit1及bit0置爲01,則HSE被選做系統時鐘;若將bit及bit0置爲10,則PLL被選做系統時鐘。
rRCC_CFGR &= ~( 0x03 << 0 ); rRCC_CFGR |= 0x02 << 0;
最後,就是進行一個判斷,判斷是否成功將PLL做爲系統時鐘,若成功,則該函數完畢;若失敗,則該函數陷入死循環。