有人使用STM32H743做產(chǎn)品開發(fā), DMA 傳輸待發(fā)送的數(shù)據(jù)到 UART 發(fā)送寄存器做后續(xù)UART通信。在開啟D-Cache的情況下,發(fā)現(xiàn)UART沒法發(fā)送更新過的數(shù)據(jù)。
具體應(yīng)用場景是這樣的,源數(shù)據(jù)放在STM32H743片內(nèi)D1域的AXI-SRAM區(qū),數(shù)據(jù)會不定期地被CPU修改,然后讓DMA將數(shù)據(jù)傳輸?shù)経SART3的發(fā)送寄存器進(jìn)行后續(xù)UART通信。結(jié)合手冊可以查得USART3位于D2域。[下面截圖來自STM32H7芯片參考手冊]
目前開啟了D-Cache/I-Cache。我基于現(xiàn)有場景寫了一段簡單的如下測試代碼【編譯環(huán)境使用STM32CubeIDE】:
__attribute__((section(".Source"))) uint8_t Source[5];
uint32_t TimeOut;
uint8_t Variable=0;
基于上面測試代碼,也重現(xiàn)了相同現(xiàn)象。即盡管CPU在不停修改源端數(shù)據(jù),可目的端UART3的TDR寄存器的數(shù)據(jù)總保持0不變。【注:我這里的DMA使用的Memory to Memory方式,并非要一定這樣操作。你完全可以基于UART事件使用Memory to Peripheral的方式。】
這里排除了其它方面的原因,該現(xiàn)象是因?yàn)殚_啟了D-Cache并使用write back策略而導(dǎo)致的不同主設(shè)備訪問同一內(nèi)存而產(chǎn)生的數(shù)據(jù)不一致的問題。
現(xiàn)在CPU不時修改AXI-SRAM1指定區(qū)域的數(shù)據(jù),DMA到同一位置讀取數(shù)據(jù)送到UART發(fā)送寄存器。畫個圖示意下:
對于STM32H743片內(nèi)AXI-SRAM1區(qū)域,其默認(rèn)的存儲屬性為write back及writeallocate。【下圖來自STM32H7參考手冊】
此時CPU對該區(qū)域進(jìn)行寫操作發(fā)生Cache分配,數(shù)據(jù)會先寫到Cache里。要等到Cache重分配或手動刷新Cache時才會將Cache里的新數(shù)據(jù)寫到RAM內(nèi)存。
這里有三種方案可選用來解決這個問題:
第一種方案就是,CPU做數(shù)據(jù)更新操作后,對相應(yīng)存儲區(qū)執(zhí)行Cache清除操作,讓Cache的新數(shù)據(jù)及時寫到RAM內(nèi)存,即添加下面打紅勾的代碼。
第二種方案就是針對CPU修改的數(shù)據(jù)存儲區(qū)進(jìn)行MPU設(shè)置,配置為write through或關(guān)閉該區(qū)域Cacheable特性。下面將其配置為Writethrough屬性。【下面截圖來自ARM相關(guān)技術(shù)手冊。C:Cacheable,B:Bufferable,S:Shareable】
使用STM32圖形化配置工具CubeMx進(jìn)行MPU相關(guān)配置【參見下圖】:
第三種方案,簡單粗暴且有效,那就是關(guān)閉芯片D-Cache的使用。如果對開啟D-Cache不在乎或者只是前期功能調(diào)試先關(guān)掉無妨,后面再去調(diào)整也可以。
上面簡單介紹了在開啟D-Cache情況下,CPU不定期修改Cacheable內(nèi)存數(shù)據(jù),DMA讀取相應(yīng)內(nèi)存而發(fā)生的數(shù)據(jù)不一致問題的解決方案,以供參考。
最后提醒下,當(dāng)我們使用SCB_CleanDCache_by_Addr()函數(shù)清除Cache時,需注意給定地址要遵循32字節(jié)對齊的原則。【注:上面截圖來自STM32H7Cube庫。】
審核編輯:湯梓紅
-
Cache
+關(guān)注
關(guān)注
0文章
129瀏覽量
28347 -
uart
+關(guān)注
關(guān)注
22文章
1237瀏覽量
101419 -
dma
+關(guān)注
關(guān)注
3文章
561瀏覽量
100602 -
STM32H743
+關(guān)注
關(guān)注
0文章
24瀏覽量
1724
原文標(biāo)題:開啟Cache后UART無法發(fā)送新數(shù)據(jù)
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論