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