新聞中心

STM32時(shí)鐘設(shè)置

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
3.5的庫(kù)中什么也不用做。已經(jīng)在啟動(dòng)文件中設(shè)置好了時(shí)鐘。

大家都知道在使用單片機(jī)時(shí),時(shí)鐘速度決定于外部晶振或內(nèi)部RC振蕩電路的頻率,是不可以改變的。而ARM的出現(xiàn)打破了這一傳統(tǒng)的法則,可以通過(guò)軟件隨意改變時(shí)鐘速度。這一出現(xiàn)讓我們的設(shè)計(jì)更加靈活,但是也給我們的設(shè)計(jì)增加了復(fù)雜性。為了讓用戶能夠更簡(jiǎn)單的使用這一功能,STM32的庫(kù)函數(shù)已經(jīng)為我們?cè)O(shè)計(jì)的更加簡(jiǎn)單方便。

本文引用地址:http://butianyuan.cn/article/201611/322746.htm

在比較靠前的版本中,我們需要向下面那樣設(shè)置時(shí)鐘:

ErrorStatus HSEStartUpStatus;


void RCC_Configuration(void)
{
RCC_DeInit(); // RCC system reset(for debug purpose)

RCC_HSEConfig(RCC_HSE_ON);// Enable HSE

HSEStartUpStatus = RCC_WaitForHSEStartUp();// Wait till HSE is ready

if (HSEStartUpStatus == SUCCESS)// 當(dāng)HSE準(zhǔn)備完畢切振蕩穩(wěn)定后
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);// PCLK1 = HCLK/2
FLASH_SetLatency(FLASH_Latency_2);// Flash 2 wait state
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// Enable Prefetch Buffer
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);// PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLCmd(ENABLE);// Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{;// Wait till PLL is ready
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// Select PLL as system clock source
while (RCC_GetSYSCLKSource() != 0x08)// Wait till PLL is used as system clock source
{
;
}
}
}

隨之函數(shù)庫(kù)的不斷升級(jí),到3.0以上時(shí),我們就不用再這樣編寫(xiě)時(shí)鐘設(shè)置了,我們只要做如下兩部即可:

第一個(gè): system_stm32f10x.c 中#define SYSCLK_FREQ_72MHz 72000000
第二個(gè):調(diào)用SystemInit()

說(shuō)明:在stm32固件庫(kù)3.0中對(duì)時(shí)鐘頻率的選擇進(jìn)行了大大的簡(jiǎn)化,原先的一大堆操作都在后臺(tái)進(jìn)行。系統(tǒng)給出的函數(shù)為SystemInit()。但在調(diào)用前還需要進(jìn)行一些宏定義的設(shè)置,具體的設(shè)置在system_stm32f10x.c文件中。

文件開(kāi)頭就有一個(gè)這樣的定義:
//#define SYSCLK_FREQ_HSEHSE_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

ST 官方推薦的外接晶振是 8M,所以庫(kù)函數(shù)的設(shè)置都是假定你的硬件已經(jīng)接了 8M 晶振來(lái)運(yùn)算的.以上東西就是默認(rèn)晶振 8M 的時(shí)候,推薦的 CPU 頻率選擇.在這里選擇了:
#define SYSCLK_FREQ_72MHz 72000000
也就是103系列能跑到的最大值72M

然后這個(gè) C文件繼續(xù)往下看
#elif defined SYSCLK_FREQ_72MHz
const uint32_t SystemFrequency= SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_SysClk= SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_AHBClk= SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_APB1Clk= (SYSCLK_FREQ_72MHz/2);
const uint32_t SystemFrequency_APB2Clk= SYSCLK_FREQ_72MHz;

這就是在定義了CPU跑72M的時(shí)候,各個(gè)系統(tǒng)的速度了.他們分別是:硬件頻率,系統(tǒng)時(shí)鐘,AHB總線頻率,APB1總線頻率,APB2總線頻率.再往下看,看到這個(gè)了:
#elif defined SYSCLK_FREQ_72MHz
static void SetSysClockTo72(void);

這就是定義 72M 的時(shí)候,設(shè)置時(shí)鐘的函數(shù).這個(gè)函數(shù)被 SetSysClock ()函數(shù)調(diào)用,而SetSysClock ()函數(shù)則是被 SystemInit()函數(shù)調(diào)用.最后 SystemInit()函數(shù),就是被你調(diào)用的了。

所以設(shè)置系統(tǒng)時(shí)鐘的流程就是: 首先用戶程序調(diào)用 SystemInit()函數(shù),這是一個(gè)庫(kù)函數(shù),然后 SystemInit()函數(shù)里面,進(jìn)行了一些寄存器必要的初始化后,就調(diào)用 SetSysClock()函數(shù). SetSysClock()函數(shù)根據(jù)那個(gè)#define SYSCLK_FREQ_72MHz 72000000 的宏定義,知道了要調(diào)用SetSysClockTo72()這個(gè)函數(shù),于是,就一堆麻煩而復(fù)雜的設(shè)置~!@#$%^然后,CPU跑起來(lái)了,而且速度是 72M.




關(guān)鍵詞: STM32時(shí)鐘設(shè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉