|
stm32雖然已經(jīng)用了一段時間了,但是一直用的都是教程里帶的程序,最近想自己寫寫代碼了,結(jié)果各種碰壁,一點(diǎn)小小的問題也能讓我忙活一兩天,真讓人郁悶,這里說一下stm32最基礎(chǔ)的時鐘配置上我遇到的麻煩。
時鐘配置我是使用RCC的庫函數(shù)完成的,基本思路就是打開8M的HSE時鐘,然后使用PLL倍頻9倍成72M的系統(tǒng)時鐘。但是看似簡單的函數(shù)寫好后片子一直工作不起來,我開始以為是在檢測時鐘是否啟動的while循環(huán)中給卡住了,還以為外部8M晶振不起振,后來經(jīng)過一個下午的測試程序,竟然是配置PLL成9倍的函數(shù)出了問題,我把倍頻倍數(shù)調(diào)小就ok了。但是這沒道理啊。72M的時鐘在不到9倍的pll中根本沒法到達(dá)啊,我網(wǎng)上找了一下總算發(fā)現(xiàn)了一個我漏掉的細(xì)節(jié),那就是rcc配置的時候還需要配置flash!
我網(wǎng)上原本找的代碼里有配置flash的庫函數(shù)調(diào)用,但我以為是其他應(yīng)用所以就沒放在心上,結(jié)果就是在這里吃了大虧。我翻了一下技術(shù)手冊,有這么一段
這些選項(xiàng)應(yīng)與閃存存儲器的訪問時間一起使用。等待周期體現(xiàn)了系統(tǒng)時鐘 (SYSCLK) 頻率與閃存訪問時間的關(guān)系:
0 等待周期,當(dāng) 0 < SYSCLK < 24MHz
1 等待周期,當(dāng) 24MHz < SYSCLK ≤ 48MHz
2 等待周期,當(dāng) 48MHz < SYSCLK ≤ 72MHz
預(yù)取緩沖區(qū)(2個64位):在每一次復(fù)位以后被自動打開,由于每個緩沖區(qū)的大小(64位)與閃存的帶寬相同,因此只通過需一次讀閃存的操作即可更新整個緩沖區(qū)的內(nèi)容。由于預(yù)取緩沖區(qū)的存在,CPU可以工作在更高的主頻
所以在初始化的時候還需要加上兩個函數(shù)
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
這樣系統(tǒng)可以工作在72M的時鐘下
|
|