新聞中心

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

STM32的FATFS文件系統(tǒng)移植筆記

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

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

本文引用地址:http://butianyuan.cn/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文件可以在網上下載,參考的程序比較多,本工程使用的這個文件也是在網上下載并進行一定的修改過的。本文件中函數的實現方式可以參考源代碼。
五、文件系統(tǒng)測試
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、添加支持中文編碼的文件
重新編譯會發(fā)現有如圖3的錯誤。原因是要支持中文文件名需要包含另外一個文件cc936.c,該文件在FATFS文件系統(tǒng)源碼的.srcoption目錄下,將它添加到工程文件目錄FATFS中。如圖4是我們添加文件后的工程文件結構,再次編譯就通過了。如圖5所示。我們發(fā)現增加這個文件后代碼量增加了很多,主要原因是這個文件是我們支持中文所需要的中文編碼文件。


圖3


圖4


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


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


七、源文件下載
STM32_FATFS_SPI.rar


上一頁 1 2 下一頁

關鍵詞: STM32FATFS文件系統(tǒng)移植筆

評論


相關推薦

技術專區(qū)

關閉