在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

開啟Cache后UART無法發送新數據

茶話MCU ? 來源:茶話MCU ? 作者:茶話MCU ? 2022-11-23 09:02 ? 次閱讀

有人使用STM32H743做產品開發, DMA 傳輸待發送的數據到 UART 發送寄存器做后續UART通信。在開啟D-Cache的情況下,發現UART沒法發送更新過的數據。

具體應用場景是這樣的,源數據放在STM32H743片內D1域的AXI-SRAM區,數據會不定期地被CPU修改,然后讓DMA將數據傳輸到USART3的發送寄存器進行后續UART通信。結合手冊可以查得USART3位于D2域。[下面截圖來自STM32H7芯片參考手冊]

6957715a-6ac4-11ed-8abf-dac502259ad0.png

目前開啟了D-Cache/I-Cache。我基于現有場景寫了一段簡單的如下測試代碼【編譯環境使用STM32CubeIDE】:

__attribute__((section(".Source"))) uint8_t Source[5];

uint32_t TimeOut;

uint8_t Variable=0;

696d97c8-6ac4-11ed-8abf-dac502259ad0.png

6987d1e2-6ac4-11ed-8abf-dac502259ad0.png

基于上面測試代碼,也重現了相同現象。即盡管CPU在不停修改源端數據,可目的端UART3的TDR寄存器的數據總保持0不變。【注:我這里的DMA使用的Memory to Memory方式,并非要一定這樣操作。你完全可以基于UART事件使用Memory to Peripheral的方式。】

699cf540-6ac4-11ed-8abf-dac502259ad0.png

這里排除了其它方面的原因,該現象是因為開啟了D-Cache并使用write back策略而導致的不同主設備訪問同一內存而產生的數據不一致的問題。

現在CPU不時修改AXI-SRAM1指定區域的數據,DMA到同一位置讀取數據送到UART發送寄存器。畫個圖示意下:

69bd7888-6ac4-11ed-8abf-dac502259ad0.png

對于STM32H743片內AXI-SRAM1區域,其默認的存儲屬性為write back及writeallocate。【下圖來自STM32H7參考手冊】

69d5228a-6ac4-11ed-8abf-dac502259ad0.png

此時CPU對該區域進行寫操作發生Cache分配,數據會先寫到Cache里。要等到Cache重分配或手動刷新Cache時才會將Cache里的新數據寫到RAM內存。

這里有三種方案可選用來解決這個問題:

第一種方案就是,CPU做數據更新操作后,對相應存儲區執行Cache清除操作,讓Cache的新數據及時寫到RAM內存,即添加下面打紅勾的代碼。

69faf514-6ac4-11ed-8abf-dac502259ad0.png

第二種方案就是針對CPU修改的數據存儲區進行MPU設置,配置為write through或關閉該區域Cacheable特性。下面將其配置為Writethrough屬性。【下面截圖來自ARM相關技術手冊。C:Cacheable,B:Bufferable,S:Shareable】

6a1bc596-6ac4-11ed-8abf-dac502259ad0.png

使用STM32圖形化配置工具CubeMx進行MPU相關配置【參見下圖】:

6a36452e-6ac4-11ed-8abf-dac502259ad0.png

第三種方案,簡單粗暴且有效,那就是關閉芯片D-Cache的使用。如果對開啟D-Cache不在乎或者只是前期功能調試先關掉無妨,后面再去調整也可以。

上面簡單介紹了在開啟D-Cache情況下,CPU不定期修改Cacheable內存數據,DMA讀取相應內存而發生的數據不一致問題的解決方案,以供參考。

6a5e537a-6ac4-11ed-8abf-dac502259ad0.png

最后提醒下,當我們使用SCB_CleanDCache_by_Addr()函數清除Cache時,需注意給定地址要遵循32字節對齊的原則。【注:上面截圖來自STM32H7Cube庫。】

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Cache
    +關注

    關注

    0

    文章

    129

    瀏覽量

    28959
  • uart
    +關注

    關注

    22

    文章

    1273

    瀏覽量

    103464
  • dma
    dma
    +關注

    關注

    3

    文章

    574

    瀏覽量

    102566
  • STM32H743
    +關注

    關注

    0

    文章

    24

    瀏覽量

    2239

原文標題:開啟Cache后UART無法發送新數據

文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    ZYNQ進階:PL端UART 發送設計案例

    在 ZYNQ進階之路2 中我們講解了PL端PWM呼吸燈的設計,本節我們講解PL端實現串口UART發送設計; 首先新建一個串口發送的工程,工程建立在ZYNQ進階之路1中已經講述,這里不再累述; 下面
    的頭像 發表于 11-25 17:26 ?3905次閱讀
    ZYNQ進階:PL端<b class='flag-5'>UART</b> <b class='flag-5'>發送</b>設計案例

    STM32h7開啟Cache,串口發送DMA會導致中斷觸發如何解決?

    STM32h7 開啟Cache,串口使用發送DMA發送數據會導致中斷觸發(只
    發表于 03-12 07:37

    為什么無法使用Lpuart_Uart_Ip_ 發送任何數據回調中的AsyncSend?

    我已經實現了基于 LPUART 的 DMA ,我可以發送使用 Lpuart_Uart_Ip_ 接收的數據同步發送 in lpuart_6_callback , 但是,我
    發表于 04-11 07:51

    cc2530為什么在休眠喚醒無法發送數據

    cc2530為什么在休眠喚醒無法發送數據?contiki系統cc2530上循環間斷發送數據,每
    發表于 03-30 15:10

    怎么用UART發送和接收數據

    你好。我這里有幾個RN4871。我對它們很感興趣,因為我可以完全替換MCU,直接使用RN4871,運行腳本。改變名稱和波特率沒問題。現在我需要能夠用UART發送和接收數據。用戶點擊電話應用程序中
    發表于 04-20 10:07

    am335x裸機開啟mmu和cache,ucos2任務不能調度如何排查?

    beaglebone 開啟mmu和cache,ucos2卡在 OSStartHighRdy,無法調度任務,請問如何排查?
    發表于 01-12 06:41

    CH573 TMOS開啟sleep串口異常怎么解決?

    使用例程包BLE-UART工程修改未開啟sleep前UART0_SendString(PS, 12),串口0發送數據正常不丟
    發表于 09-07 07:19

    UART 發送數據丟失最后一個字節

    STM32 UART 發送數據丟失最后一個字節
    發表于 12-04 15:10 ?0次下載

    關于UART發送數據丟失最后一個字節問題的詳細解析-pdf

    STM32 UART_發送數據丟失最后一個字節
    發表于 04-10 11:23 ?3次下載

    UART需要使用DMA發送嗎 ?

    UART需要使用DMA發送嗎?
    的頭像 發表于 03-07 16:57 ?7472次閱讀

    什么是 Cache? Cache讀寫原理

    由于寫入數據和讀取指令分別通過 D-Cache 和 I-Cache,所以需要同步 D-Cache 和 I-Cache,即復制
    發表于 12-06 09:55 ?3439次閱讀

    如何根據UART傳輸協議將數據發送出去呢?

    和接收部分相反,UART發送數據部分是CPU將需要發送數據寫到發送
    的頭像 發表于 06-05 15:59 ?3187次閱讀
    如何根據<b class='flag-5'>UART</b>傳輸協議將<b class='flag-5'>數據</b><b class='flag-5'>發送</b>出去呢?

    UART發送數據丟失最后一個字節

    電子發燒友網站提供《UART發送數據丟失最后一個字節.pdf》資料免費下載
    發表于 08-01 17:57 ?1次下載
    <b class='flag-5'>UART</b><b class='flag-5'>發送</b><b class='flag-5'>數據</b>丟失最后一個字節

    UART數據幀與發送

    保持在高電壓電平。為了開始數據傳輸,發送 UART數據線從高電平拉到低電平(從 1 到 0)。接收 UART
    的頭像 發表于 11-09 17:42 ?1101次閱讀

    GD32F103C8T6 Uart3無法發送數據

    以用來實現與其他外設或者外部設備的數據交互。 然而,在一些情況下,用戶可能會遇到UART3無法發送數據的問題。在接下來的文章中,我們將深入探
    的頭像 發表于 01-09 10:57 ?2380次閱讀
    主站蜘蛛池模板: 国产毛片久久国产 | 久久国产乱子伦精品免费一 | 欧美一级在线免费观看 | 午夜寂寞影视 | 91精品国产亚洲爽啪在线影院 | 免费亚洲成人 | 亚洲国产视频网 | 最新版天堂资源中文官网 | 国产精品一级香蕉一区 | 一级特黄aaa大片免费看 | 欧美一区二区三区影院 | 特黄特色大片免费播放路01 | 日本黄视频在线播放 | 在线观看视频一区二区 | 婷婷四房综合激情五月性色 | 亚洲国产成人精彩精品 | 啪啪网站免费看 | www.色午夜.com | 亚洲伦理一区二区三区 | 久久综合操 | 午夜免费片在线观看不卡 | 亚洲 欧美 丝袜 制服 在线 | 中文字幕天堂 | 久久精品在 | h视频在线播放 | 天天尻逼| www在线观看 | 国产成人精品曰本亚洲78 | 啪啪国产视频 | 中文字幕在线观看日剧网 | 日韩在线网 | 人人做天天爱夜夜爽中字 | 精品国产污网站在线观看15 | 综合久久2o19 | 色综合天天色综合 | 边摸边吃奶边做视频叫床韩剧 | 深夜动态福利gif进出粗暴 | 男女午夜特黄毛片免费 | 新版天堂资源在线官网8 | 欧美日韩一区二区三区视频 | 五月婷婷之综合激情 |