新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的FATFS文件系統移植筆記

        STM32的FATFS文件系統移植筆記

        作者: 時間:2016-11-26 來源:網絡 收藏
        復制代碼

        MSD0_WriteSingleBlock()和MSD0_WriteMultiBlock()函數都是SD卡操作的底層函數,我們在SPI_MSD0_Driver.c文件中實現。
        7、實現disk_ioctl()函數
        該函數在磁盤格式化、獲取文件系統信息等操作時會被調用。
        實現后的程序如下:

        本文引用地址:http://www.104case.com/article/201611/321826.htm
        1. DRESULT disk_ioctl (
        2. BYTE drv, /* Physical drive nmuber (0..) */
        3. BYTE ctrl, /* Control code */
        4. void *buff /* Buffer to send/receive control data */
        5. )
        6. {
        7. if (drv==0)
        8. {
        9. MSD0_GetCardInfo(&SD0_CardInfo);
        10. switch (ctrl)
        11. {
        12. case CTRL_SYNC :
        13. return RES_OK;
        14. case GET_SECTOR_COUNT :
        15. *(DWORD*)buff = SD0_CardInfo.Capacity/SD0_CardInfo.BlockSize;
        16. return RES_OK;
        17. case GET_BLOCK_SIZE :
        18. *(WORD*)buff = SD0_CardInfo.BlockSize;
        19. return RES_OK;
        20. case CTRL_POWER :
        21. break;
        22. case CTRL_LOCK :
        23. break;
        24. case CTRL_EJECT :
        25. break;
        26. /* MMC/SDC command */
        27. case MMC_GET_TYPE :
        28. break;
        29. case MMC_GET_CSD :
        30. break;
        31. case MMC_GET_CID :
        32. break;
        33. case MMC_GET_OCR :
        34. break;
        35. case MMC_GET_SDSTAT :
        36. break;
        37. }
        38. }else if(drv==1){
        39. switch (ctrl)
        40. {
        41. case CTRL_SYNC :
        42. return RES_OK;
        43. case GET_SECTOR_COUNT :
        44. return RES_OK;
        45. case GET_SECTOR_SIZE :
        46. return RES_OK;
        47. case GET_BLOCK_SIZE :
        48. return RES_OK;
        49. case CTRL_POWER :
        50. break;
        51. case CTRL_LOCK :
        52. break;
        53. case CTRL_EJECT :
        54. break;
        55. /* MMC/SDC command */
        56. case MMC_GET_TYPE :
        57. break;
        58. case MMC_GET_CSD :
        59. break;
        60. case MMC_GET_CID :
        61. break;
        62. case MMC_GET_OCR :
        63. break;
        64. case MMC_GET_SDSTAT :
        65. break;
        66. }
        67. }
        68. else{
        69. return RES_PARERR;
        70. }
        71. return RES_PARERR;
        72. }
        復制代碼

        MSD0_GetCardInfo()函數也在SPI_MSD0_Driver.c文件中實現,其中SD0_CardInfo為PMSD_CARDINFO類型的全局變量,它在SPI_MSD0_Driver.h文件中被定義。
        8、到此diskio.c這個文件中的所有函數就已經實現,下一步就是實現SPI_MSD0_Driver.c文件中的相關函數,SPI_MSD0_Driver.c文件可以在網上下載,參考的程序比較多,本工程使用的這個文件也是在網上下載并進行一定的修改過的。本文件中函數的實現方式可以參考源代碼。
        五、文件系統測試
        1、測試寫文件
        測試代碼如下:

        1. //寫文件測試
        2. printf("write file test......");
        3. res = f_open(&fdst, "0:/test.txt", FA_CREATE_ALWAYS | FA_WRITE);
        4. if(res != FR_OK){
        5. printf("open file error : %d",res);
        6. }else{
        7. res = f_write(&fdst, textFileBuffer, sizeof(textFileBuffer), &bw); /* Write it to the dst file */
        8. if(res == FR_OK){
        9. printf("write data ok! %d",bw);
        10. }else{
        11. printf("write data error : %d",res);
        12. }
        13. /*close file */
        14. f_close(&fdst);
        15. }
        復制代碼

        注意:成功打開文件后一定要調用f_close()函數,否則數據無法寫入SD卡中。
        2、測試讀文件

        1. //讀文件測試
        2. printf("read file test......");
        3. res = f_open(&fsrc, "0:/test.txt", FA_OPEN_EXISTING | FA_READ);
        4. if(res != FR_OK){
        5. printf("open file error : %d",res);
        6. }else{
        7. res = f_read(&fsrc, buffer, sizeof(textFileBuffer), &br); /* Read a chunk of src file */
        8. if(res==FR_OK){
        9. printf("read data num : %d",br);
        10. printf("%s",buffer);
        11. }else{
        12. printf("read file error : %d",res);
        13. }
        14. /*close file */
        15. f_close(&fsrc);
        16. }
        復制代碼

        3、測試結果
        測試結果如圖2所示。


        圖2
        六、中文長文件名支持
        1、要支持長文件名需要在ffconf.h文件中修改兩個宏定義。如下為我們修改后的宏定義。
        #define _CODE_PAGE 936
        #define _USE_LFN 1 /* 0 to 3 */
        2、添加支持中文編碼的文件
        重新編譯會發現有如圖3的錯誤。原因是要支持中文文件名需要包含另外一個文件cc936.c,該文件在FATFS文件系統源碼的.srcoption目錄下,將它添加到工程文件目錄FATFS中。如圖4是我們添加文件后的工程文件結構,再次編譯就通過了。如圖5所示。我們發現增加這個文件后代碼量增加了很多,主要原因是這個文件是我們支持中文所需要的中文編碼文件。


        圖3


        圖4


        圖5
        3、再次下載到板子中運行,發現中文的長文件名顯示正常了。如圖6所示。


        4、若不需要支持中文長文件名而只支持英文長文件名則可以將宏定義做如下修改:
        #define _CODE_PAGE 437
        #define _USE_LFN 1 /* 0 to 3 */
        同時將ccsbcs.c添加到工程目錄中,這樣就可以減小很多大代碼量。將程序下載板子后再次運行結果如圖7所示,可以看到可以支持英文的長文件名。


        七、源文件下載
        STM32_FATFS_SPI.rar


        上一頁 1 2 下一頁

        關鍵詞: STM32FATFS文件系統移植筆

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 溆浦县| 商丘市| 曲阳县| 礼泉县| 绍兴市| 读书| 萨迦县| 简阳市| 开原市| 来安县| 金乡县| 商南县| 曲阜市| 巫山县| 平安县| 交城县| 株洲市| 北海市| 黄龙县| 凯里市| 石门县| 南溪县| 漯河市| 宣恩县| 白城市| 福清市| 大埔区| 广汉市| 全椒县| 青海省| 阜康市| 商城县| 泸西县| 平和县| 八宿县| 延寿县| 滨州市| 鄯善县| 扎鲁特旗| 延长县| 温泉县|