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