參考原子哥的教程 http://www.openedv.com/forum.php?mod=viewthread&tid=95570&extra=page=1,原子哥排版比較亂,
這裏自己記錄一下,以STM32F103爲例:
庫函數的默認的系統時鐘流程是這樣的:
首先從彙編啓動文件中調用C語言函數:void SystemInit (void)
這個函數會設置一些【PLL啓動、允許使用外部晶振】等功能寄存器,然後會根據你定義的宏(默認定義宏爲SYSCLK_FREQ_72MHz),調用相應的函數來設置時鐘。
static void SetSysClockTo72(void)函數做的事情主要有2個:
(1) 檢測外部晶振是否正常,若超時仍未檢測到外部晶振,則程序的時鐘整個全出錯,見下圖
(2)更設置PLL倍頻係數,其實就是設置一下,設置多少倍才能把外部晶振倍頻到72M,如果我們的外部晶振是12M,那麼就把倍頻係數設置爲6,如果外部晶振爲8M,那就把倍頻係數設置爲9,以此類推,這個值需要手動修改:
還有一個點要注意,如果我們使用了外部晶振,代碼中必須要知道它的頻率(因爲庫函數中有些代碼需要根據這個值及其衍生值,來自動計算一些頻率相關的功能,如串口的波特率),這個頻率只能由程序員靠宏定義來告訴編譯器,宏的名字叫:HSE_VALUE,請按照真正的頻率來設置該宏,如下圖所示: