一、APB時鐘概述
STM32是一種基於ARM Cortex-M架構的微控制器,APB(Advanced Peripheral Bus)是在該架構中應用的匯流排,用於連接晶元內部的外設模塊,如定時器、UART、SPI等。APB匯流排可以分為APB1和APB2,其中APB1最大頻率為36MHz,APB2最大頻率為72MHz。
APB匯流排時鐘來源於系統時鐘和PLL(Phase Locked Loop)倍頻器的輸出,因此APB匯流排時鐘的頻率是與系統時鐘和PLL倍頻器的設置有關的。對於不同型號的STM32,其系統時鐘和PLL倍頻器的設置也不盡相同,因此確認APB時鐘需要根據具體晶元型號的手冊來查閱和確定。
二、確定APB時鐘的方法
1. 查閱晶元手冊
STM32各型號的晶元手冊都會詳盡地介紹系統時鐘和PLL倍頻器的設置方法以及APB時鐘的計算公式。一般來說,在系統時鐘和PLL倍頻器確定的情況下,APB時鐘的頻率可以通過如下公式計算:
APB_FREQ = SYSCLK_FREQ / APB_DIV
其中,APB_DIV是APB匯流排分頻係數,其值與每個具體的外設模塊有關。例如,對於TIM3定時器模塊來說,其所在的APB1匯流排分頻係數為2,因此APB1時鐘頻率為APB_FREQ/2。需要注意的是,對於一些特定的外設模塊,比如USB和Ethernet,其時鐘頻率是不能超過48MHz的,因此需要根據情況進行相應的限制。
2. 通過代碼計算確定
除了查閱手冊來確認APB時鐘之外,我們還可以通過代碼計算來獲得APB時鐘的頻率。為此我們需要調用HAL庫提供的一些函數來獲取系統時鐘和PLL倍頻器的相關信息,然後根據上述公式來計算APB時鐘。
以下是一個示例代碼:
#include "stm32f4xx_hal.h" int main() { HAL_Init(); SystemClock_Config(); // 獲取系統時鐘和PLL倍頻器的設置 uint32_t sysclk_freq = HAL_RCC_GetSysClockFreq(); // 獲取系統時鐘頻率 RCC_PeriphCLKInitTypeDef periph_clk_init; HAL_RCCEx_GetPeriphCLKConfig(&periph_clk_init); // 獲取PLL倍頻器的設置 uint32_t pll_freq = 0; if (periph_clk_init.PLL.PLLSource == RCC_PLLSOURCE_HSE) { if (periph_clk_init.PLL.PLLM == 25 && periph_clk_init.PLL.PLLN == 336 && periph_clk_init.PLL.PLLP == RCC_PLLP_DIV2 && periph_clk_init.PLL.PLLQ == 7) { pll_freq = 84000000; } } uint32_t apb1_freq = sysclk_freq / periph_clk_init.APB1CLKDivider; // 計算APB1時鐘頻率 uint32_t apb2_freq = sysclk_freq / periph_clk_init.APB2CLKDivider; // 計算APB2時鐘頻率 return 0; }
以上示例代碼中,通過調用HAL_RCC_GetSysClockFreq函數獲取系統時鐘頻率,再通過HAL_RCCEx_GetPeriphCLKConfig函數獲取PLL倍頻器的設置。在這個例子中,我們假設PLL倍頻器的設置是25MHz的外部時鐘源,倍頻器參數為PLL倍頻因子為336,輸出給系統時鐘為84MHz。
最後通過除以APB匯流排分頻係數,就能得到APB1和APB2時鐘的頻率了。
3. 使用CubeMX配置工具確定
使用STM32CubeMX配置工具可以方便地配置系統時鐘和PLL倍頻器,然後由工具自動計算出APB時鐘的頻率。這個方法不需要我們手動計算,同時可以在線生成相應的初始化代碼。只需要打開CubeMX工具,在Clock Configuration頁面中進行設置即可。
以下是一個示例截圖:
由於不同型號的STM32晶元都有不同的時鐘配置和限制,因此在使用CubeMX配置工具之前需要先查閱手冊,了解所選型號的限制和規範。
三、總結
確認APB時鐘需要根據具體晶元型號的手冊來查閱和確定。我們可以使用公式計算APB時鐘,也可以通過HAL庫提供的函數和CubeMX工具來獲得APB時鐘的頻率。
原創文章,作者:MFVVB,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/361722.html