時鐘設置函數的過程梳理及編寫

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做爲系統時鐘,若成功,則該函數完畢;若失敗,則該函數陷入死循環。

相關文章
相關標籤/搜索