華大單片機HC32F4xx系類(HC32F460 HC32F4A0)可以運行最高200Mhz,但內部Flash在 CPU運行頻率達到33M后,就需要加入不同的等待周期。
所以實際程序在內部FLash內運行時,是跟不上CPU速度,也就不能達到最高運行速度200Mhz。
如下圖:可以看到在最高200Mhz時,讀Flash中的指令需要等待5個CPU時鐘周期,那大概200M運行時實際CPU能夠跑到不到40Mhz。
![http://www.tigerchip.com.cn/data/attachment/forum/202103/12/142055f42zk4jccr4gkw41.png](http://file.elecfans.com/web2/M00/1A/6C/pYYBAGF7aKCAGrtiAAI2ZY89_hk881.png)
?
?
那怎么能夠使程序運行的快,跑出實際CPU的頻率呢?
兩種方法:
1.理所應當想到的第一種方法就是把關鍵程序或需要運行速度的代碼搬到SRAM內運行。
這個方法不在本貼討論范圍內,不過原理和細節都不太復雜。
這里提醒以下兩點,具體做法也不難,不管是誰家的MCU這種SRAM內運行的方法都是一樣的。
1)只需要注意中斷向量表要重映射到SRAM中,如果想把中斷搬運到SRAM中運行的話。
2)還有一點是,搬運到SRAM內運行的代碼如果有調用Flash內代碼的,也是會影響速度。需要再把調用鏈上所有代碼一同搬運到SRAM內。
2.就是在華大HC32Fxx系列MCU內,有一個1K大小的FLash Cache,可以使運行FLash內的代碼加速,或讀取Flash內數據加速。
使運行在Flash內的代碼執行速度和CPU速度同頻。當然,既然是讀的cache,那么如果CPU沒有命中cache中的內容,還是會從Flash中取數據和指令的。
所以在整個程序運行期間 cache起到了加速作用,而不能認為每個運行時段程序運行的速度都會和CPU一致。
如果HCLK是200Mhz,那么使能cache后,可以加速程序運行速度到200Mhz。
?。?strong>千萬別認為程序每時每刻都運行在200M,所以也不要用忙等待的方式做延時函數,建議使用systick做忙等待延時函數)
我做了一個試驗,測試一段代碼運行時在不開啟cache和開啟cache的運行表現:
測試的這段代碼:
![pYYBAGF7aKCANog8AAEFS45Qjyk389.png](http://file.elecfans.com/web2/M00/1A/6C/pYYBAGF7aKCANog8AAEFS45Qjyk389.png)
![poYBAGF7aKCACK7uAAIEyHNoiGU900.png](http://file.elecfans.com/web2/M00/1A/63/poYBAGF7aKCACK7uAAIEyHNoiGU900.png)
運行結果:
無cache時flash_run_performance_test函數使用了728023個10ns(10納秒),
有cache時flash_run_performance_test函數使用了259880個10ns。
大家可以計算出測試函數花的時間,有cache時和無cache時速度的對比,是多少倍。
總結下:就是華大HC32F4XX系列ARM cortex-M4的這顆MCU速度還是不錯的。
? ? ? ? ymf
評論