五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

STM32 - SDIO 使用 DMA 傳輸數(shù)據(jù)時卡住

2023-08-10 05:41 作者:山路旁的輝翎  | 我要投稿

STM32F407 在調(diào)試 SD I/O?卡的數(shù)據(jù)讀寫命令 CMD53 時,發(fā)現(xiàn) DMA?傳輸數(shù)據(jù)時卡在了等待傳輸完成這一步,DMA2_FLAG_TC3 始終未置位。

SDIO 使用四位總線,時鐘為 24 MHz;DMA 使用 LL 庫,配置如下:

在網(wǎng)絡上搜索后,發(fā)現(xiàn)很多人都遇到了這個問題,而且解決方法那叫一個百花齊放——但是全部木大。經(jīng)過不斷的調(diào)試,這里也為各位提供一種全新的方法。

首先,懷疑 DMA 提供的標志位 DMA2_FLAG_TC3 與 SDIO 狀態(tài)不同步,于是改為?SDIO_FLAG_DATAEND,結(jié)果還是卡在同樣的地方。

想了一遍數(shù)據(jù)傳輸過程,似乎操作 SDIO 接口的順序有問題,修改后如下圖所示。

可以看到,讀取時 SDIO_FLAG_CMDACT 和 SDIO_FLAG_DATAEND 可以一起判斷,不必先等待命令發(fā)送再傳輸數(shù)據(jù)。其實是我寫反了......但是能用( ̄▽ ̄)

然而,SDIO 卡住的問題仍然沒有解決。既然 CMD53 已經(jīng)找不到問題了,那就看看初始化過程:

看起來平平無奇,對吧?但是注意,“如果在 CMD53 中不停啟用 DMA,DMA 將鎖住”,DMA?已經(jīng)提前啟用的情況下依然鎖住,說明問題不在于此,至少不僅在于此。完全沒有頭緒的我開始來回翻看參考手冊,突然發(fā)現(xiàn) SDIO 一章幾乎每個寄存器下都有這樣一句話:

寫入同一寄存器至少需間隔 3 * SDIO_CK + 2 * PCLK2

經(jīng)過查看,只有 __SDIO_OPERATION_ENABLE__SDIO_DMA_ENABLE短時間內(nèi)連續(xù)寫入同一寄存器,而之前的?SDIO 中斷配置恰好將這段間隔補上了——這也解釋了為什么不能等到調(diào)用?CMD53 時再啟用 DMA。

解決方法很簡單,同時寫入即可:

這件事告訴我們,遇到問題時數(shù)據(jù)手冊參考手冊比網(wǎng)絡搜索有用多了,當然也別忘記查看庫函數(shù)實現(xiàn)!

參考手冊內(nèi)容摘自:https://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf

插個題外話,為什么要關注庫函數(shù)實現(xiàn)呢?看看遠處的?stm32f4xx_ll_sdmmc.h 吧家人們:

__SDIO_GET_IT 后面的空格直接改變了宏定義,在不修改庫函數(shù)的前提下只能使用?__SDIO_GET_FLAG 代替,強迫癥震怒。

最后,小聲罵一句:GPIO 模擬薄紗若至硬件 I2C!

STM32 - SDIO 使用 DMA 傳輸數(shù)據(jù)時卡住的評論 (共 條)

分享到微博請遵守國家法律
包头市| 丹凤县| 景洪市| 沁阳市| 沂源县| 如东县| 望城县| 海阳市| 丹江口市| 上犹县| 蕉岭县| 远安县| 磐安县| 盘山县| 彰化市| 邛崃市| 长兴县| 缙云县| 文成县| 龙井市| 瑞金市| 永定县| 莲花县| 四平市| 罗平县| 长岛县| 古丈县| 黄骅市| 泸溪县| 论坛| 体育| 洛阳市| 海晏县| 绥化市| 塘沽区| 邵武市| 石景山区| 通许县| 宁化县| 中宁县| 宣化县|