无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網(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ù)時卡住的評論 (共 條)

分享到微博請遵守國家法律
洮南市| 乌兰浩特市| 宜都市| 新巴尔虎右旗| 阿城市| 渝中区| 溆浦县| 南靖县| 江西省| 新竹县| 武隆县| 吉林市| 米脂县| 佛山市| 清河县| 苍溪县| 绥芬河市| 民乐县| 马鞍山市| 洛扎县| 方正县| 白山市| 崇左市| 阿图什市| 濉溪县| 禄丰县| 瑞安市| 江安县| 苏尼特左旗| 临夏县| 栾城县| 浮梁县| 汤原县| 潞城市| 延吉市| 正定县| 汉阴县| 凤山市| 高雄市| 临夏县| 吴川市|