最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

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

分享到微博請遵守國家法律
台前县| 湘西| 霍州市| 高清| 开封县| 富宁县| 隆安县| 南雄市| 贵德县| 额尔古纳市| 禄劝| 玉屏| 顺平县| 谢通门县| 通化县| 哈尔滨市| 尉氏县| 阿荣旗| 郎溪县| 伊吾县| 宜章县| 浦江县| 邯郸县| 昭觉县| 新乐市| 渑池县| 敦化市| 老河口市| 扬中市| 谢通门县| 湟中县| 兴城市| 沂源县| 榆中县| 广汉市| 南京市| 外汇| 新沂市| 商丘市| 临朐县| 永川市|