社区导航

 
查看: 548|回复: 0

[原创] stm32f769 寄存器配置SD卡---移植fatfs

[复制链接]

1773

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-3-13 10:59:53 | 显示全部楼层 |阅读模式
昨天开始在上周实现的SD卡读写基础上移植fatfs文件系统,开始不是很顺利,之前没有搞过,完全按照f767的例程移植的,但是在加载SD卡时一直是失败的,很郁闷,折腾了一天,结果还不理想,睡了个好觉,思路清晰了,参考的同时,也要加入自己的思想,果然很顺利的按我的思路实现了,太开心了,说明一下,本次移植的是最新的版本ff13a。需要的自己下载

下面详细介绍
按照f767的例程,把ffconf.h里面的宏定义的赋值进行修改
  1. #define FF_FS_READONLY        0
  2. /* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
  3. /  Read-only configuration removes writing API functions, f_write(), f_sync(),
  4. /  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
  5. /  and optional writing functions as well. */


  6. #define FF_FS_MINIMIZE        0
  7. /* This option defines minimization level to remove some basic API functions.
  8. /
  9. /   0: Basic functions are fully enabled.
  10. /   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()
  11. /      are removed.
  12. /   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
  13. /   3: f_lseek() function is removed in addition to 2. */


  14. #define FF_USE_STRFUNC        1
  15. /* This option switches string functions, f_gets(), f_putc(), f_puts() and f_printf().
  16. /
  17. /  0: Disable string functions.
  18. /  1: Enable without LF-CRLF conversion.
  19. /  2: Enable with LF-CRLF conversion. */


  20. #define FF_USE_FIND                0
  21. /* This option switches filtered directory read functions, f_findfirst() and
  22. /  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */


  23. #define FF_USE_MKFS                1
  24. /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */


  25. #define FF_USE_FASTSEEK        1
  26. /* This option switches fast seek function. (0:Disable or 1:Enable) */


  27. #define FF_USE_EXPAND        0
  28. /* This option switches f_expand function. (0:Disable or 1:Enable) */


  29. #define FF_USE_CHMOD        0
  30. /* This option switches attribute manipulation functions, f_chmod() and f_utime().
  31. /  (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */


  32. #define FF_USE_LABEL        1
  33. /* This option switches volume label functions, f_getlabel() and f_setlabel().
  34. /  (0:Disable or 1:Enable) */


  35. #define FF_USE_FORWARD        0
  36. /* This option switches f_forward() function. (0:Disable or 1:Enable) */


  37. /*---------------------------------------------------------------------------/
  38. / Locale and Namespace Configurations
  39. /---------------------------------------------------------------------------*/

  40. #define FF_CODE_PAGE        936
  41. /* This option specifies the OEM code page to be used on the target system.
  42. /  Incorrect code page setting can cause a file open failure.
  43. /
  44. /   437 - U.S.
  45. /   720 - Arabic
  46. /   737 - Greek
  47. /   771 - KBL
  48. /   775 - Baltic
  49. /   850 - Latin 1
  50. /   852 - Latin 2
  51. /   855 - Cyrillic
  52. /   857 - Turkish
  53. /   860 - Portuguese
  54. /   861 - Icelandic
  55. /   862 - Hebrew
  56. /   863 - Canadian French
  57. /   864 - Arabic
  58. /   865 - Nordic
  59. /   866 - Russian
  60. /   869 - Greek 2
  61. /   932 - Japanese (DBCS)
  62. /   936 - Simplified Chinese (DBCS)
  63. /   949 - Korean (DBCS)
  64. /   950 - Traditional Chinese (DBCS)
  65. /     0 - Include all code pages above and configured by f_setcp()
  66. */


  67. #define FF_USE_LFN                3
  68. #define FF_MAX_LFN                255
  69. /* The FF_USE_LFN switches the support for LFN (long file name).
  70. /
  71. /   0: Disable LFN. FF_MAX_LFN has no effect.
  72. /   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
  73. /   2: Enable LFN with dynamic working buffer on the STACK.
  74. /   3: Enable LFN with dynamic working buffer on the HEAP.
  75. /
  76. /  To enable the LFN, ffunicode.c needs to be added to the project. The LFN function
  77. /  requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and
  78. /  additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled.
  79. /  The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can
  80. /  be in range of 12 to 255. It is recommended to be set 255 to fully support LFN
  81. /  specification.
  82. /  When use stack for the working buffer, take care on stack overflow. When use heap
  83. /  memory for the working buffer, memory management functions, ff_memalloc() and
  84. /  ff_memfree() in ffsystem.c, need to be added to the project. */


  85. #define FF_LFN_UNICODE        0
  86. /* This option switches the character encoding on the API when LFN is enabled.
  87. /
  88. /   0: ANSI/OEM in current CP (TCHAR = char)
  89. /   1: Unicode in UTF-16 (TCHAR = WCHAR)
  90. /   2: Unicode in UTF-8 (TCHAR = char)
  91. /
  92. /  Also behavior of string I/O functions will be affected by this option.
  93. /  When LFN is not enabled, this option has no effect. */


  94. #define FF_LFN_BUF                255
  95. #define FF_SFN_BUF                12
  96. /* This set of options defines size of file name members in the FILINFO structure
  97. /  which is used to read out directory items. These values should be suffcient for
  98. /  the file names to read. The maximum possible length of the read file name depends
  99. /  on character encoding. When LFN is not enabled, these options have no effect. */


  100. #define FF_STRF_ENCODE        3
  101. /* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(),
  102. /  f_putc(), f_puts and f_printf() convert the character encoding in it.
  103. /  This option selects assumption of character encoding ON THE FILE to be
  104. /  read/written via those functions.
  105. /
  106. /   0: ANSI/OEM in current CP
  107. /   1: Unicode in UTF-16LE
  108. /   2: Unicode in UTF-16BE
  109. /   3: Unicode in UTF-8
  110. */


  111. #define FF_FS_RPATH                0
  112. /* This option configures support for relative path.
  113. /
  114. /   0: Disable relative path and remove related functions.
  115. /   1: Enable relative path. f_chdir() and f_chdrive() are available.
  116. /   2: f_getcwd() function is available in addition to 1.
  117. */


  118. /*---------------------------------------------------------------------------/
  119. / Drive/Volume Configurations
  120. /---------------------------------------------------------------------------*/

  121. #define FF_VOLUMES                1
  122. /* Number of volumes (logical drives) to be used. (1-10) */


  123. #define FF_STR_VOLUME_ID        0
  124. #define FF_VOLUME_STRS                "RAM","NAND","CF","SD","SD2","USB","USB2","USB3"
  125. /* FF_STR_VOLUME_ID switches string support for volume ID.
  126. /  When FF_STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive
  127. /  number in the path name. FF_VOLUME_STRS defines the drive ID strings for each
  128. /  logical drives. Number of items must be equal to FF_VOLUMES. Valid characters for
  129. /  the drive ID strings are: A-Z and 0-9. */


  130. #define FF_MULTI_PARTITION        0
  131. /* This option switches support for multiple volumes on the physical drive.
  132. /  By default (0), each logical drive number is bound to the same physical drive
  133. /  number and only an FAT volume found on the physical drive will be mounted.
  134. /  When this function is enabled (1), each logical drive number can be bound to
  135. /  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()
  136. /  funciton will be available. */


  137. #define FF_MIN_SS                512
  138. #define FF_MAX_SS                512
  139. /* This set of options configures the range of sector size to be supported. (512,
  140. /  1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and
  141. /  harddisk. But a larger value may be required for on-board flash memory and some
  142. /  type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured
  143. /  for variable sector size mode and disk_ioctl() function needs to implement
  144. /  GET_SECTOR_SIZE command. */


  145. #define FF_USE_TRIM                0
  146. /* This option switches support for ATA-TRIM. (0:Disable or 1:Enable)
  147. /  To enable Trim function, also CTRL_TRIM command should be implemented to the
  148. /  disk_ioctl() function. */


  149. #define FF_FS_NOFSINFO        0
  150. /* If you need to know correct free space on the FAT32 volume, set bit 0 of this
  151. /  option, and f_getfree() function at first time after volume mount will force
  152. /  a full FAT scan. Bit 1 controls the use of last allocated cluster number.
  153. /
  154. /  bit0=0: Use free cluster count in the FSINFO if available.
  155. /  bit0=1: Do not trust free cluster count in the FSINFO.
  156. /  bit1=0: Use last allocated cluster number in the FSINFO if available.
  157. /  bit1=1: Do not trust last allocated cluster number in the FSINFO.
  158. */



  159. /*---------------------------------------------------------------------------/
  160. / System Configurations
  161. /---------------------------------------------------------------------------*/

  162. #define FF_FS_TINY                0
  163. /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
  164. /  At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
  165. /  Instead of private sector buffer eliminated from the file object, common sector
  166. /  buffer in the filesystem object (FATFS) is used for the file data transfer. */


  167. #define FF_FS_EXFAT                1
  168. /* This option switches support for exFAT filesystem. (0:Disable or 1:Enable)
  169. /  When enable exFAT, also LFN needs to be enabled.
  170. /  Note that enabling exFAT discards ANSI C (C89) compatibility. */


  171. #define FF_FS_NORTC                0
  172. #define FF_NORTC_MON        1
  173. #define FF_NORTC_MDAY        1
  174. #define FF_NORTC_YEAR        2018
  175. /* The option FF_FS_NORTC switches timestamp functiton. If the system does not have
  176. /  any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable
  177. /  the timestamp function. All objects modified by FatFs will have a fixed timestamp
  178. /  defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time.
  179. /  To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be
  180. /  added to the project to read current time form real-time clock. FF_NORTC_MON,
  181. /  FF_NORTC_MDAY and FF_NORTC_YEAR have no effect.
  182. /  These options have no effect at read-only configuration (FF_FS_READONLY = 1). */


  183. #define FF_FS_LOCK                0
  184. /* The option FF_FS_LOCK switches file lock function to control duplicated file open
  185. /  and illegal operation to open objects. This option must be 0 when FF_FS_READONLY
  186. /  is 1.
  187. /
  188. /  0:  Disable file lock function. To avoid volume corruption, application program
  189. /      should avoid illegal open, remove and rename to the open objects.
  190. /  >0: Enable file lock function. The value defines how many files/sub-directories
  191. /      can be opened simultaneously under file lock control. Note that the file
  192. /      lock control is independent of re-entrancy. */


  193. #define FF_FS_REENTRANT        0
  194. #define FF_FS_TIMEOUT        1000
  195. #define FF_SYNC_t                HANDLE
复制代码



然后开始修改diskio.c文件
  1. /* Definitions of physical drive number for each drive */
  2. #define SD_CARD                0        /* Example: Map Ramdisk to physical drive 0 */
  3. #define DEV_MMC                1        /* Example: Map MMC/SD card to physical drive 1 */
  4. #define DEV_USB                2        /* Example: Map USB MSD to physical drive 2 */


  5. /*-----------------------------------------------------------------------*/
  6. /* Get Drive Status                                                      */
  7. /*-----------------------------------------------------------------------*/

  8. DSTATUS disk_status (
  9.         BYTE pdrv                /* Physical drive nmuber to identify the drive */
  10. )
  11. {
  12.         return 0;
  13. }



  14. /*-----------------------------------------------------------------------*/
  15. /* Inidialize a Drive                                                    */
  16. /*-----------------------------------------------------------------------*/

  17. DSTATUS disk_initialize (
  18.         BYTE pdrv                                /* Physical drive nmuber to identify the drive */
  19. )
  20. {
  21.         DSTATUS stat;

  22.         switch (pdrv) {
  23.         case SD_CARD :
  24.                 stat = sdcard_init();

  25.                 // translate the reslut code here

  26.                 break;
  27.        
  28.         }
  29.         return stat;
  30. }



  31. /*-----------------------------------------------------------------------*/
  32. /* Read Sector(s)                                                        */
  33. /*-----------------------------------------------------------------------*/

  34. DRESULT disk_read (
  35.         BYTE pdrv,                /* Physical drive nmuber to identify the drive */
  36.         BYTE *buff,                /* Data buffer to store read data */
  37.         DWORD sector,        /* Start sector in LBA */
  38.         UINT count                /* Number of sectors to read */
  39. )
  40. {
  41.         DRESULT res;

  42.         switch (pdrv) {
  43.         case SD_CARD :
  44.                 // translate the arguments here

  45.                 res = SD_ReadDisk(buff, sector, count);

  46.                 // translate the reslut code here

  47.                 break;

  48.         }

  49.         return res;
  50. }



  51. /*-----------------------------------------------------------------------*/
  52. /* Write Sector(s)                                                       */
  53. /*-----------------------------------------------------------------------*/

  54. DRESULT disk_write (
  55.         BYTE pdrv,                        /* Physical drive nmuber to identify the drive */
  56.         const BYTE *buff,        /* Data to be written */
  57.         DWORD sector,                /* Start sector in LBA */
  58.         UINT count                        /* Number of sectors to write */
  59. )
  60. {
  61.         DRESULT res;

  62.         switch (pdrv) {
  63.         case SD_CARD :
  64.                 // translate the arguments here

  65.                 res = SD_WriteDisk((u8 *)buff, sector, count);

  66.                 // translate the reslut code here

  67.                 break;


  68.         }

  69.         return res;
  70. }



  71. /*-----------------------------------------------------------------------*/
  72. /* Miscellaneous Functions                                               */
  73. /*-----------------------------------------------------------------------*/

  74. DRESULT disk_ioctl (
  75.         BYTE pdrv,                /* Physical drive nmuber (0..) */
  76.         BYTE cmd,                /* Control code */
  77.         void *buff                /* Buffer to send/receive control data */
  78. )
  79. {
  80.         DRESULT res;
  81.         int result;

  82.         switch (pdrv) {
  83.         case SD_CARD :

  84.                 // Process of the command for the RAM drive

  85.                 return res;

  86.         case DEV_MMC :

  87.                 // Process of the command for the MMC/SD card

  88.                 return res;

  89.         case DEV_USB :

  90.                 // Process of the command the USB drive

  91.                 return res;
  92.         }

  93.         return RES_PARERR;
  94. }
  95. //获得时间
  96. //User defined function to give a current time to fatfs module      */
  97. //31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */                                                                                                                                                                                                                                          
  98. //15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */                                                                                                                                                                                                                                                
  99. DWORD get_fattime (void)
  100. {                                 
  101.         return 0;
  102. }
复制代码


在main函数里面加入头文件
FATFS fatfs;
。。。。
    while(sdcard_init())//检测不到SD卡
        {
                delay_ms(500);
                LED0(led0sta^=1);//DS0闪烁
        }
    show_sdcard_info();        //打印SD卡相关信息
    sta = f_mount(&fatfs,"0:/",1);
        if (sta)
        {
                printf("SD Card 加载失败 错误码: %d \r\n",sta);
                delay_ms(800);
        }
    else
       printf("SD Card 加载成功\r\n");

编译下载后果然是打印的sd卡加载成功
捕获1.JPG



                                                           发稿与2018年3月13日
此内容由EEWORLD论坛网友star_66666原创,如需转载或用于商业用途需征得作者同意并注明出处




此帖出自stm32/stm8论坛

ff13a.zip

2.26 MB, 下载次数: 2



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-11 20:15 , Processed in 0.077323 second(s), 14 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表