STM32H743搭建 DMA USB SDCard Reader
開發版:原子阿波羅 + H743 核心版
CubeMX 版本 6.2
因為 H743 SDMMC+MDAM+FATFS+FreeRTOS 的資料比較少,在此提供搭建過程,也作為筆記。
要注意的是
-
根據官方文件"Getting started with STM32H7 Series SDMMC host controller",H743 的 SDMMC 已經內建 DMA,所以,在CubeMX 不會出現 DMA 選項可以勾選 SDMMC 的 DMA 必須在 MDMA 勾選設定。
-
在CubeMX,使用FreeRTOS ,會強制FATFS必須要使用 DMA,所以在FATFS的Advanced Setting選項裡必須把 Use dma template 打開
如果你有使用長檔名,記得要打開Enable LFN with dynamic working buffer on the STACK.S。MAX_SS 設定有時會引起錯誤,我的SD卡是用PC格式化,使用512可以。(下圖錯了,之前因為只對格式話與寫入測試,1024是沒問題的,但是,會無法讀出,使用512讀寫都沒問題)
-
在 sd_disk_io.c 裡,有兩個有關 DMA 的定義要設為1
/*
* when using cacheable memory region, it may be needed to maintain the cache
* validity. Enable the define below to activate a cache maintenance at each
* read and write operation.
* Notice: This is applicable only for cortex M7 based platform.
*/
/* USER CODE BEGIN enableSDDmaCacheMaintenance */
#define ENABLE_SD_DMA_CACHE_MAINTENANCE 1 //*/
/* USER CODE END enableSDDmaCacheMaintenance */
/*
* Some DMA requires 4-Byte aligned address buffer to correctly read/write data,
* in FatFs some accesses aren't thus we need a 4-byte aligned scratch buffer to correctly
* transfer data
*/
/* USER CODE BEGIN enableScratchBuffer */
#define ENABLE_SCRATCH_BUFFER 1//*/
/* USER CODE END enableScratchBuffer */
- SDMMC時鐘源PLL1Q可以取100MHz, SDMMC clock divide factor =2
記得把SDMMC的 NVIC 打開
其他的部分大致上就跟一般在CubeMX設定FreeRTOS一樣。
- 最後產生代碼,在 sd_diskio.c 裡有個小bug, line 330 附近有個變數 ret 沒有宣告,自己在適當位置加入 uint8_t ret 就行。
- 所有的FATFS資料應該都是透過列隊傳遞,所以所有的FATFS都要在 task 裡面操作,例如,在進入task 之前先做 mount SD,那就會出錯找不到Device。
大致上這樣就可以完成,只要知道設定MDMA ,沒有大坑!
以下為測試結果
程式碼在
链接:https://pan.baidu.com/s/15LbgCtOKRReESLq61sgFLA
提取码:h743
在我的板子能跑。但是,後來我加了usbdevice以後,出現很多問題。所以我不敢保證他一定能跑。我試過在RTOS上跑,可以反覆讀寫。
因為我在台灣,很少上來,也很少積分無法用金錢。所以直接給大家連接,不用積分,如果對您有幫助,希望您也能秉直互助精神,我有問題時幫助我一下,謝謝您!