前言
前段時間某客戶反饋,在使用STM32H7的FMC時,如果使能了D-CACHE就運行不正常。數(shù)據(jù)沒有寫到FMC外部的存儲器里,F(xiàn)MC接口也沒有波形。而不使能D-CACHE是工作則是正常的。
其實對于這個問題,如果了解STM32H7的架構的話,就很容易理解了。下面我們就來看一看到底是什么原因讓客戶覺得使能DCACHE后FMC就工作不正常了。
STM32H7的架構
下面是STM32H7架構圖中和FMC相關的部分。從圖中可以看到,STM32H7是基于Cortex-M7內核,在內部的Cortex-M7內核里帶有一個16KB的D-CACHE和一個16KB的I-CACHE。內核通過AXIM總線連接到64位的AXI總線矩陣,再經過這個總線矩陣連接到FMC接口實現(xiàn)對外部存儲器的訪問。這里,當D-CACHE使能的時候,對FMC接口上的存儲器的操作會用到內核的緩存(CACHE)的。
使能了CACHE的好處就是可以提高內核訪問存儲器的速度。為什么使用緩存能提高速度呢?是因為在操作可以被緩存的存儲器的時候,內核不是每次都去直接操作這些存儲器,而是從緩存里讀取數(shù)據(jù),或者將數(shù)據(jù)先寫到緩存里??吹竭@里,是不是覺得和前面客戶說的現(xiàn)象有點聯(lián)系了。
Cache的操作
簡單的說緩存工作時有兩種方式:回寫和透寫。
回寫【write back】就是數(shù)據(jù)平時只寫到緩存【cache】,必要時才同步到下一級存儲器中。
透寫【write through】就是數(shù)據(jù)每次都同時寫到緩存和下一級存儲器中。這種方式可以解決數(shù)據(jù)不一致的問題,但同時也會消耗更多的總線訪問時間。
緩存的操作方式,在啟用緩存后有一個默認的設置 。也就是下面這張表:
請參考AN4839了解更多的關于Cache的使用說明。
問題分析及解決
客戶是通過FMC的NOR存儲控制器外接一個FPGA。映射的地址范圍是0x60000000~0x7FFFFFFF。從上圖可以看到,它默認的緩存操作方式是WBWA(回寫寫分配)。也就是說,當打開DCACHE后,所有對該地址范圍的操作都會先到緩存。這也解釋了為什么客戶發(fā)現(xiàn)數(shù)據(jù)沒有真正寫到外部存儲器中??蛻舻臄?shù)據(jù)需要實時寫到FPGA中進行計算。所以對這個應用場景,回寫的設置就不合適了。
對于客戶的這個應用,可以通過MPU來進行配置,將0x60000000~0x7FFFFFFF范圍地址的CACHE設置為透寫的方式,這樣數(shù)據(jù)就會實時的寫到FPGA中去了。所以,針對這種情況,我們可以通過MPU合理配置來解決。
通過MPU,可以配置不同存儲器空間的訪問權限和Cache策略。HAL庫里面提供了對應的函數(shù)和例程,參照例程用下面這段代碼就可以解決客戶的問題了。數(shù)據(jù)每次都是直接寫到FPGA中,而不是緩存到內核的DCACHE中。
總結
D-CACHE的使用可以幫我們提高程序運行的性能,但也會帶來緩存和二級存儲器數(shù)據(jù)不一致和緩沖不擊中帶來的程序執(zhí)行的時間不確定的情況,需要客戶根據(jù)實際的應用來進行選擇。對于實時性要求高的數(shù)據(jù),可以像前面一樣使用MPU配置成透寫的方式,或者將數(shù)據(jù)放到DTCM RAM中。另外,在本文中只用MPU配置了FMC映射的部分存儲區(qū)域。在實際使用中,應該對所有用到的存儲空間(比如Flash, SRAM區(qū))的屬性根據(jù)實際情況進行合理配置,以免引起其它的問題。詳情請參考AN4838.
-
D-CACHE
+關注
關注
0文章
1瀏覽量
1051
原文標題:使能D-CACHE時FMC外設運行不正常的案例
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論