移植FatFs至STM32F429ZIT有一點要特別注意,就是版本相容性,本人實驗過各個FatFs與STM32F4xx_DSP_StdPeriph_Lib的版本,只有以下版本能成功運行,
STM32F4xx_DSP_StdPeriph_Lib_V1.3.0
FatFs R0.09b
以上這兩個函數套件在網上搜索找的到,STM32F4xx_DSP_StdPeriph_Lib_V1.3.0移植可以參考[STM32F407ZG-MCU學習筆記]STM32F407ZG Libraries移植與[STM32F407ZG-MCU學習筆記]STM32F407ZG專案建立,幾乎一模一樣,下面要講FatFs移植,將ff9b.zip解壓縮,
解完壓縮會得到下面兩個資料夾,主要會移植"src"裡的文件,
在"src"中的文件,
在專案中新增FatFs資料夾,在裏頭要新增inc與src這兩個資料夾
將下圖.c檔複製至\FatFs\src,
將下圖.h2檔複製至\FatFs\inc,
在專案中資料夾引入這兩隻.c檔,
在Options for Target 'Target1'中的C/C++,去引入.h檔
在\User\inc中的main.h新增引入ff.h與diskio.h,
引入完成就來修改文件,首先進行diskio.c第一階段修改,先按照下圖紅框部分修改,
再來把以下程式刪除,
result = ATA_disk_initialize();
result = MMC_disk_initialize();
result = USB_disk_initialize();
result = ATA_disk_status();
result = MMC_disk_status();
result = USB_disk_status();
result = ATA_disk_read(buff, sector, count);
result = MMC_disk_read(buff, sector, count);
result = USB_disk_read(buff, sector, count);
result = ATA_disk_write(buff, sector, count);
result = MMC_disk_write(buff, sector, count);
result = USB_disk_write(buff, sector, count);
result = ATA_disk_ioctl(cmd, buff);
result = MMC_disk_ioctl(cmd, buff);
result = USB_disk_ioctl(cmd, buff);
這樣就完成diskio.c第一階段修改,接下來修改ffconf.h,修改結果如下圖所示,
以上將FatFs移植修改完成後,接下來要針對STM32F4xx_DSP_StdPeriph_Lib_V1.3.0中的SDIO進行配置,標準函示庫引入stm32f4xx_dma.c與stm32f4xx_sdio.c,
在STM32F429_Configuration新增sdio_config.c與sdio_config.h.會將sdio的配置寫在這裡面,基本會複製STM32F4xx_DSP_StdPeriph_Lib_V1.3.0裡提供的範例來完成,
這幾隻範例程式位置分別在\STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Utilities\STM32_EVAL\STM324x9I_EVAL,圖中的四隻程式,
以及\STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Project\STM32F4xx_StdPeriph_Examples\SDIO\SDIO_uSDCard,圖中的兩隻程式,
1. 將stm324x9i_eval_sdio_sd.c中的全部程式複製至sdio_config.c
2. 將stm324x9i_eval_sdio_sd.h也是全部程式複製至sdio_config.h
3. 將stm324x9i_eval.c在要將跟SDIO有關的程式複製至sdio_config.c
4. 將stm324x9i_eval.h也是把跟SDIO有關的程式複製至sdio_config.h
由於SDIO會用到中斷部分,需要到\STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Project\STM32F4xx_StdPeriph_Examples\SDIO\SDIO_uSDCard,中的stm32f4xx_it.c來增加,
中斷配置部份可以到\STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Project\STM32F4xx_StdPeriph_Examples\SDIO\SDIO_uSDCard,中的main.c來增加,
移植完成後就進行修改,修改在sdio_config.c中的SD_Error SD_Init(void),修改如下,
再來修改uint8_t SD_Detect(void),SD偵測GPIO配置,這裡是配置在PD3,別忘了新增GPIO初始化,如下所示,
完成以上動作sdio_config.c與sdio_config.h配置完成,接下來要進行diskio.c第二階段修改,主要是新增方法,
新增完成就可以順利使用FatFs,可以寫一個簡單程式來做測試,以下是測試程式,是寫在\ExtDevices_Configuration\src中的sdcard.c,
/* 配置SDIO中斷 */
NVIC_Configuration();
/* 註冊SD Card */
f_mount(1, &fatfs);
/* 打開創造123.txt */
f_open(&fil, "1:/123.txt", FA_WRITE | FA_CREATE_ALWAYS);
/* 寫入資料ABCDEF */
f_write(&fil, "ABCDEF", 6, &bw);
/* 關掉儲存檔案 */
f_close(&fil);
完成後可以檢查SD Card是否有成功寫入這些內容,