日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

华大 MCU 之七 DMA 导致 SPI 异常停止的原因分析、DMA 配置的那些坑

發布時間:2024/10/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 华大 MCU 之七 DMA 导致 SPI 异常停止的原因分析、DMA 配置的那些坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

緣起

??在最近的項目測試中發現,SPI 通信總是莫名其妙的失敗,查看寄存器發現 SPI 已經被停止了。根據手冊,SPI 在異常情況下會被強制停止(SPI 的使能為被清零),而根據波形顯示通信過程沒有問題。下圖是我實際中的 DMA 及 SPI 使用情況:

  • SPI1 僅使用發送功能,SPI2 僅使用接收功能,兩者均使用 DMA。由于 SPI 沒有僅發送模式,因此 SPI2 必須要配置一個 TX,否則導致 SPI 報錯(實際并不配置 SPI 的發送引腳)。
  • 在初始化時,先初始化了 SPI2(含 DMA),然后再初始化的 SPI1(含DMA),這里是關鍵。
  • 在初始化之后,SPI 立刻開始工作(有數據通信)。其中,SPI2 大約以 8MHz 的速率不停的接收數據,SPI1 則以 1MHz 的速率在需要的時候才會發送數據。
  • 問題是在以上流程中,在配置 SPI2 時,有概率導致 SPI2 異常停止!
  • 問題分析

    ??最初懷疑是 SPI 的問題,因為在初始實現這部分功能時就遇到了很多坑,我也寫過博文華大 MCU 之五 SPI 從機 DMA 模式 配置(不能正常接收問題處理) 來專門記錄遇到的問題。但是再一次整理了一下 SPI 的配置流程,并沒有發現啥問題。在測試中發現,將 SPI2 使用的 DMA 停止,則不會出現問題,于是開始調查 DMA 的問題。

    DMA 的坑

    ??最開始將問題重點放到了 DMA 的配置上,懷疑是不是 DMA 部分配置項不正確。但是,讀數情況下 SPI 是工作正常的,如果是配置不對,應該是一個必出現的問題。轉而又開始懷疑是不是配置時序(寄存器的配置的先后順序)不對,反復查看代碼也沒有發現問題。正在一籌莫展之時,有同事提出了手冊中 DMA 章節給出的一個注意事項:

    ??其實,最開始實現 SPI 驅動時就關注過該注意事項,只是開始的理解是,這條注意事項是針對同一通道而言的,同一通道在工作時不能再次配置上面說的這些寄存器,不同 DMA 通道之間應該互不影響。然而實際情況是,只要 DMA 有任意一個通道在傳輸數據,其他所有通道都不可以配置!

    ??這就導致了一個很大的問題,外設在工作中不可避免的要重新配置 DMA。例如,SPI 的 DMA 發送,由于發送數據長度是動態變化的,必須每次重新進行配置,則根據上面這一條,必須把該 DMA 下的其他通道(例如上面我的 SPI1 使用的通道)也都全部停止,這樣就可能導致其他外設丟失數據。

    ??最麻煩的是,這個問題沒有找到任何其他的解決方法,只能是停止該 DMA 下的所有通道,進而來配置自己需要的那個通道參數。起初在尋找解決方法的時候,也考慮是不是可以用下圖所示的寄存器位來進行一下判斷,而是實際是下面的位根本沒有任何用處。

    還是以我上面的使用示例來說,SPI2 作為從機接收,由于使用了 DMA,MCU 并不能確定數據何時到來。即使 MCU 檢測 DMAACT 未動作,可能在實際配置通道時,DMA 又變為了動作狀態。

    配置

    ??根據手冊,使用 DMA 時需要先寫寄存器將 DMA 控制器使能,使能方法是寫 DMA 使能寄存器 DMA_EN.EN 位。 如下圖所示:

    我試了一下,不先使能貌似也沒法發現啥問題啊!不知道為啥!?

    無法獲取當前傳出數據長度

    ??先來說一下需求:在串口驅動中,串口的接收使用 DMA 來實現,DMA 配置為循環模式,在指定緩沖區中循環存放收到的數據,通過讀寫指針來標記數據的讀和寫位置。
    ??然而,驅動庫中 DMA 接口并沒有能獲取當前 DMA 傳輸了多少字節的接口!!!無奈只能選擇修改驅動庫,添加一些指定的接口,如下圖所示:

    ??后來,為了不修改驅動庫,我直接把接口放到了自己的驅動里面,然后使用寄存器直接讀取:M4DMA1->MONRPT0_f.DRPT,這樣的話,需要注意與通道號的對應關系,如 MONRPT0 即通道 0。

    中斷的使用

    ??在華大的 DMA 中,中斷默認都是開啟的,這點在配置 DMA 的時候需要特殊注意。我們需要使用 DMA 的屏蔽中斷寄存器來屏蔽不使用的中斷。如下圖示:

    在實際寫代碼時,需要調用 en_result_t DMA_DisableIrq(M4_DMA_TypeDef* pstcDmaReg, uint8_t u8Ch, en_dma_irq_sel_t enIrqSel); 來關閉不需要的中中斷。例如,DMA 的塊傳輸完成中斷 和 傳輸完成中斷 通常不會一起使用!這點對于用慣了 ST MCU 的人來說需要特殊注意!

    結論

  • 在使用中,發現華大 MCU 的外設配置中,有不少的坑,尤其是對于我這種用慣了 STM32 的人來說。例如之前說的 SPI、中斷、這里說的 DMA 等等。
  • 千萬不要完全相信華大 MCU 驅動庫中給出的示例,里面是丟三落四各種錯誤!
  • 在用戶手冊中一些比較重要的點,手冊往往是一筆帶過,在我們實際使用中容易被忽略,而往往忽略的就是問題的關鍵。而且對于異常情況,手冊中沒有很詳細的描述,導致真正出現問題時,從手冊中不能很快分析出原因。
  • 對于某些外設,有很多用來觀察外設工作的寄存器(ST 沒有這部分寄存器),我們在實際使用中,往往需要等待這些寄存器中的某些位被置位之后才可以繼續操作,否則會出現各種錯誤
  • 參考

  • HC32F460系列用戶手冊Rev1.21.pdf
  • 總結

    以上是生活随笔為你收集整理的华大 MCU 之七 DMA 导致 SPI 异常停止的原因分析、DMA 配置的那些坑的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩大尺度在线观看 | 成人区人妻精品一区 | 在线免费看污网站 | 美丽姑娘免费观看在线观看 | 精品国产18久久久久久二百 | 欧美 日韩 国产 成人 在线 | 污动漫网站 | www.av色| 四虎影视成人 | 久久久影院| av资源共享 | 久久艹在线 | 极品尤物一区二区三区 | 国产精品精品久久久 | 欧美精品videosex极品 | 成人在线观看亚洲 | 日韩免费观看av | 国产51视频 | 免费人成网 | 狠狠综合一区 | 日日干夜夜草 | 秋霞黄色网 | 中文字幕第23页 | 亚洲a在线播放 | 免费观看视频一区二区 | av第一福利大全导航 | 青草久久久久 | 亚洲精品字幕在线观看 | 影音先锋成人资源站 | 中文字幕一区二区三区四区五区 | h在线网站 | 黑鬼巨鞭白妞冒白浆 | 青草草在线视频 | 成人自拍视频 | 九九热免费精品视频 | 美女一级黄色片 | 亚洲国产成人在线视频 | 在线观看免费高清视频 | 国产高潮又爽又无遮挡又免费 | 久久综合在线 | 与亲女洗澡时伦了毛片 | 91精品99| 天海翼av | 青青操在线观看 | 国产视频第三页 | 亚洲精品久久久中文字幕 | 香蕉视频在线网站 | 最新av电影网站 | 女人下边被添全过视频 | 老熟妇毛茸茸 | 中文字幕蜜桃 | 欧美视频一区在线观看 | av综合色 | 日韩图片区 | 黄污视频在线播放 | 欧美大片在线看 | 加勒比一区二区三区 | 性日韩| 奇米精品一区二区三区四区 | 黄色片aaaa | 久久久无码人妻精品一区 | 在线岛国| 国产三级精品三级 | 黑鬼巨鞭白妞冒白浆 | 久久久男女| 精品国产乱码久久久久久久软件 | 日韩黄色片免费看 | 日韩麻豆 | 成人va在线观看 | 青青草原在线免费 | 亚洲手机在线 | 成人看片网站 | 日韩欧美国产三级 | 中文字幕在线视频网 | 激情婷婷久久 | 国产妻精品一区二区在线 | 久热国产在线 | 黄色av导航| 欧洲成人一区二区三区 | 日韩成人自拍 | 在线观看视频一区二区三区 | 曰批又黄又爽免费视频 | 一级做a爱视频 | 日本3级网站 | 亚洲网在线 | 日韩美女视频 | 午夜成人影视 | 天天爽夜夜爽视频 | 手机av在线播放 | 亚洲成人精品在线播放 | 国产高清视频免费 | 欧美色图亚洲天堂 | 四虎网站 | 亚洲videos| 亚洲热在线 | 骚色综合 | 亚洲AV无码一区二区三区性 | 另类国产| 亚洲精品中字 |