STM32F4時(shí)鐘系統(tǒng)初探(二)
上次了解了STM32F4時(shí)鐘系統(tǒng)中PLL的基本狀況, 現(xiàn)在我打算自已動(dòng)手配置一下STM32的時(shí)鐘, 使用PLL將STM32F429的主頻倍到168MHz去, Let’s go.
名詞注解:
RCC: Reset Clock Config, 復(fù)位時(shí)鐘配置.
下面直接上代碼, 但有有一點(diǎn)要注意:在使能PLL之前PLL所有的參數(shù)都要配置完畢, 等PLL使能后PLL是不可以再進(jìn)行配置的.
代碼:
void RCC_Config(void)
{
ErrorStatus status = ERROR;
// 復(fù)位RCC寄存器
RCC_DeInit();
// 打開外部高速晶振
RCC_HSEConfig(RCC_HSE_ON);
// 等待高速晶振穩(wěn)定
status = RCC_WaitForHSEStartUp();
if (status == SUCCESS)
{
// 使能flash緩存預(yù)讀取
FLASH_PrefetchBufferCmd(ENABLE);
// 在STM32F42xxx和STM32F43xxx中, 這個(gè)值與電壓和主頻都有關(guān)系.
// 當(dāng)電壓在2.7-3.6V, 150 < HCLK <= 180MHz時(shí), 為5個(gè)WS
FLASH_SetLatency(FLASH_Latency_5);
// 配置PLL, SYSCLK = 168MHz
RCC_PLLConfig(RCC_PLLSource_HSE, 2, 84, 2, 7);
// 使能PLL
RCC_PLLCmd(ENABLE);
// 等待PLL穩(wěn)定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// 設(shè)置PLL為系統(tǒng)時(shí)鐘
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 等待PLL被用于系統(tǒng)時(shí)鐘
while (RCC_GetSYSCLKSource() != 0x08);
}
else
{
// HSE啟動(dòng)失敗, 死循環(huán)
while (1);
}
return;
}
使用以上代碼就可以使用PLL將主頻倍到168MHz去了, RCC_PLLConfig(RCC_PLLSource_HSE, 2, 84, 2, 7)這個(gè)函數(shù)中的參數(shù)怎么計(jì)算可以參照上一節(jié), 在這里不再多說.
接下來就是相應(yīng)外設(shè)時(shí)鐘的配置, 建議在相應(yīng)的外設(shè)初始化中配置即可. 不同的外設(shè)屬于不同的總線, 在使用外設(shè)前記得配置對(duì)應(yīng)的時(shí)鐘.
在RCC初始化中調(diào)用了兩個(gè)FLASH相關(guān)的函數(shù), 這里說一下是怎么回事.
ARM的大部分指令可以在一個(gè)時(shí)鐘周期中執(zhí)行完成, 當(dāng)CPU主頻為168MHz時(shí), 指令周期大約為6us, 但是Flash的讀取時(shí)間大約為35us, 這樣就帶來一個(gè)矛盾, CPU執(zhí)行速度太快, 指令來不及從Flash讀取. 為了使CPU能全速運(yùn)行, Flash控制器使用了一個(gè)128位的指令預(yù)讀緩沖器, 可存儲(chǔ)4條32位指令或者8條16位指令. FLASH_PrefetchBufferCmd(ENABLE)指令用來使能這個(gè)緩存區(qū),需要注意的是當(dāng)電壓低于2.1V時(shí)緩存區(qū)必須禁用掉(RM0090 P80). FLASH_SetLatency(FLASH_Latency_5)設(shè)置Flash預(yù)讀緩存所需要的等待狀態(tài), 這個(gè)值與CPU的主頻和電壓均有關(guān)系, 具體可以參考數(shù)據(jù)手冊(cè), 對(duì)于STM32F42xxx和STM32F43xxx, 主頻在150M到180M之間時(shí), 需要5個(gè)等待狀態(tài)(Wait states), 為6個(gè)CPU周期.