在GD固件庫的時鐘配置函數(shù)里看到這樣一段神秘代碼,研究分析后不得不佩服原廠固件庫里的細節(jié)處理:

查看定義是一段代碼,對AHB 2分頻后延時了一段時間:

在這段代碼后面可以看到程序?qū)CU_CFG0和RCU_CFG1兩個時鐘寄存器做了復(fù)位:

如果是程序復(fù)位啟動后第一次執(zhí)行這段代碼,應(yīng)該是沒有什么意義的,但產(chǎn)品設(shè)計時一般都會有一個BootLoader和APP兩段程序,當(dāng)BootLoader跳轉(zhuǎn)到APP時,MCU的時鐘已經(jīng)處于一個高頻狀態(tài),直接執(zhí)行RCU的復(fù)位意味著時鐘會立刻切到內(nèi)部8M運行。
而通過查看DATASHEET,可以看到MCU在最大主頻下和默認(rèn)復(fù)位主頻下的電流差距是很大的:


這樣的內(nèi)部電流瞬間變化一般會導(dǎo)致內(nèi)部電源的波動,這種波動情況下執(zhí)行的指令是不可靠的,如果硬件設(shè)計時MCU去耦電容設(shè)計不合理,很可能加劇這個波動,此時如果指令錯誤了那很可能會跑飛進入hardfault。
而GD固件庫里這個神秘代碼,在高頻的情況下可以將系統(tǒng)時鐘降低一半并延時等待穩(wěn)定,最后再復(fù)位時鐘寄存器降到8M的系統(tǒng)時鐘。這樣就讓電流變化有一個過渡,避免了內(nèi)部電源波動過大。

——>

——>
