用 STM32CubeMX 快速生成一個 SD 卡讀寫程序
前提:默認已經裝好 MDK V5 和 STM32CubeMX。
硬件平台: STM32F4xx 系列,並通過 SDIO 連接 SD 卡。
Step1.新建工程
選擇芯片型號。

Step2.配置時鍾引腳

Step3.配置 SDIO 為 SD 4bit 寬度總線

Step4.配置時鍾樹, SDIO 模塊輸入要求為 48MHz 時鍾

Step5.配置 SDIO 時鍾分頻系數 CLKDIV。計算公式為 SDIO_CK = 48MHz/(CLKDIV+2)
如下圖, CLKDIV=2,則 SDIO 時鍾 SDIO_CK=48MHz/(2+2)=12MHz。

Step6.使用 DMA 傳輸

Step7.使能 SDIO 中斷

Step8.配置 NVIC
注意,此處要求 SDIO 中斷優先級必須高於 DMA2 stream3 和 DMA2 stream6 的中斷優先級。
因此,將 DMA2 stream3 和 DMA2 stream6 的中斷優先級都將為 2(或者更低)。

Step9. 生成 MDK 工程及代碼
特別注意,一定要加大堆棧大小,默認的堆棧大小有可能不夠用。

Step10.打開 MDK 工程


Step11.選擇芯片型號
第10、11步會出現在你你的keil沒有固件包的情況下,如果你的keil已經有了估計包就不會出現了。

Step12.編譯工程

Step13.添加代碼
在 main.c 文件添加一個變量和一個數組定義。

在 main 函數的 while(1)中循環讀取 SD 卡扇區的代碼,如下圖。

其中, HAL_SD_ReadBlocks_DMA()函數可在 stm32f4xx_hal_sd.h 找到其原型,在 stm32f4xx_hal_sd.c 找到其實現。
Step14.再編譯下載運行程序
用 J-Link 仿真調試,在 MDK 中觀察 ReadAddr 和 dat_buf[]的值, dat_buf[]中的數據就是 SD卡上 ReadAddr 為起始地址的一個扇區的數據
觀察結構體變量 SDCardInfo,會發現 SD 卡的容量、卡類型等基本信息都已經被包含其中。
我使用的是 8GB 的 SD 卡, SDCardInfo. CardCapacity=0x1d2400000,即約 7.28GB。

由於本程序是直接操作 SD 卡的物理扇區,而直接寫物理扇區可能會破壞 SD 卡原有的文件
系統,所以代碼中沒有進行寫操作的演示。有興趣的朋友可自己實驗,但要提前備份 SD 卡內的文件。
