FATFS(笔记1)-SD卡创建FATFS文件系统,输出文件列表

Posted 匠心筑梦-优麒麟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FATFS(笔记1)-SD卡创建FATFS文件系统,输出文件列表相关的知识,希望对你有一定的参考价值。

使用STM32CubeMX配置MDK文件,具体配置过程自行百度

配置完成之后需要修改以下地方

 1 void MX_SDIO_SD_Init(void)
 2 {
 3 
 4   /* USER CODE BEGIN SDIO_Init 0 */
 5 
 6   /* USER CODE END SDIO_Init 0 */
 7 
 8   /* USER CODE BEGIN SDIO_Init 1 */
 9 
10   /* USER CODE END SDIO_Init 1 */
11   hsd.Instance = SDIO;
12   hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
13   hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
14   hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
15   hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
16   hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
17   hsd.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV;//此选项用CubeMX配置默认是0,需要修改成SDIO_TRANSFER_CLK_DIV
18   /* USER CODE BEGIN SDIO_Init 2 */
19 
20   /* USER CODE END SDIO_Init 2 */
21 
22 }
SDIO_TRANSFER_CLK_DIV在stm32f1xx_ll_sdmmc.中
1 /* SDIO Initialization Frequency (400KHz max) */
2 #define SDIO_INIT_CLK_DIV     ((uint8_t)0x76)    /* 48MHz / (SDMMC_INIT_CLK_DIV + 2) < 400KHz */
3 
4 /* SDIO Data Transfer Frequency (25MHz max) */
5 #define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x4)

然后在main函数中添加如下代码

  1 int main(void)
  2 {
  3   /* USER CODE BEGIN 1 */
  4     
  5   /* USER CODE END 1 */
  6 
  7   /* MCU Configuration--------------------------------------------------------*/
  8 
  9   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 10   HAL_Init();
 11 
 12   /* USER CODE BEGIN Init */
 13 
 14   /* USER CODE END Init */
 15 
 16   /* Configure the system clock */
 17   SystemClock_Config();
 18 
 19   /* USER CODE BEGIN SysInit */
 20 
 21   /* USER CODE END SysInit */
 22 
 23   /* Initialize all configured peripherals */
 24   MX_GPIO_Init();
 25   MX_SDIO_SD_Init();
 26   MX_USART1_UART_Init();
 27   MX_FATFS_Init();
 28   /* USER CODE BEGIN 2 */
 29 
 30   /* USER CODE END 2 */
 31 
 32   /* Infinite loop */
 33   /* USER CODE BEGIN WHILE */
 34     //----------------------------------------------------------------------------
 35     retSD = FATFS_LinkDriver(&SD_Driver,SDPath);
 36     if(retSD == FR_OK)
 37     {
 38         printf("链接SD卡成功!\\n");
 39     }
 40     retSD = f_mount(&SDFatFS,(TCHAR const*)SDPath,1);
 41     if(retSD == FR_OK)
 42     {
 43         printf("挂载SD卡成功!\\n");
 44     }
 45     else
 46     {
 47         printf("挂载SD卡失败!\\n");
 48         if(retSD == FR_NO_FILESYSTEM)
 49         {
 50             printf("SD没有文件系统!\\n");
 51         }
 52         else
 53         {
 54             printf("SD错误代码:%d!\\n",retSD);
 55         }
 56     }
 57     //-----------------------------------------------------------------------------
 58     printf("开始创建一个dat文件!\\n");
 59     retSD = f_open(&SDFile, "FatFs333.dat",FA_CREATE_ALWAYS | FA_WRITE );
 60     if(retSD == FR_OK)
 61     {
 62         printf("FatFs333.dat 文件创建成功!\\n");
 63     }
 64     else
 65     {
 66         printf("FatFs333.dat 文件创建失败!\\n");
 67     }
 68     retSD=f_write(&SDFile,WriteBuffer,sizeof(WriteBuffer),&fnum);
 69     if(retSD == FR_OK)
 70     {
 71         printf("FatFs333.dat 文件数据写入成功!\\n");
 72     }
 73     else
 74     {
 75         printf("FatFs333.dat 文件数据写入失败!\\n");
 76     }
 77     retSD = f_sync(&SDFile);
 78     if(retSD == FR_OK)
 79     {
 80         printf("FatFs333.dat 文件数据同步成功!\\n");
 81     }
 82     else
 83     {
 84         printf("FatFs333.dat 文件数据同步失败!\\n");
 85     }
 86     if(f_close(&SDFile) == FR_OK)
 87     {
 88         printf("FatFs333.dat 文件关闭成功!\\n");
 89     }
 90     //-------------------------------------------------------------------------------
 91         retSD = f_open(&SDFile1, "FatFs222.txt",FA_CREATE_ALWAYS | FA_WRITE );
 92     if(retSD == FR_OK)
 93     {
 94         printf("FatFs222.txt 文件创建成功!\\n");
 95     }
 96     else
 97     {
 98         printf("FatFs222.txt 文件创建失败!\\n");
 99     }
100     retSD=f_write(&SDFile1,WriteBuffer,sizeof(WriteBuffer),&fnum);
101     if(retSD == FR_OK)
102     {
103         printf("FatFs222.txt 文件数据写入成功!\\n");
104     }
105     else
106     {
107         printf("FatFs222.txt 文件数据写入失败!\\n");
108     }
109     retSD = f_sync(&SDFile1);
110     if(retSD == FR_OK)
111     {
112         printf("FatFs222.txt 文件数据同步成功!\\n");
113     }
114     else
115     {
116         printf("FatFs222.txt 文件数据同步失败!\\n");
117     }
118     if(f_close(&SDFile1) == FR_OK)
119     {
120         printf("FatFs222.txt 文件关闭成功!\\n");
121     }
122     //--------------------------------------------------------------------------------
123     //查看根目录下有哪些文件并通过串口输出
124     retSD = f_opendir(&dir,SDPath);
125     if(retSD == FR_OK)
126     {
127         printf("打开根目录成功!\\n");
128     }
129     for(int i=0;;i++)
130     {
131         retSD = f_readdir(&dir,&fno);//读取目录项,索引会自动移到下一项
132         if(retSD != FR_OK || fno.fname[0] == 0)
133         {
134             break;//说明没有文件
135         }
136         if(fno.fname[0] == \'.\')
137         {
138             continue;
139         }
140         if(fno.fattrib & AM_DIR)//判断是文件还是子目录
141         {
142             printf("(0x%02d)目录",fno.fattrib);
143         }
144         else
145         {
146             printf("(0x%02d)文件",fno.fattrib);
147         }
148         printf("名称为:%s\\r\\n",(char *)fno.fname);
149     }
150   while (1)
151   {
152         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
153         HAL_Delay(1000);
154     /* USER CODE END WHILE */
155 
156     /* USER CODE BEGIN 3 */
157   }
158   /* USER CODE END 3 */
159 }

编译下载后通过串口助手会输出如下信息

 1 链接SD卡成功!
 2 挂载SD卡成功!
 3 开始创建一个dat文件!
 4 FatFs333.dat 文件创建成功!
 5 FatFs333.dat 文件数据写入成功!
 6 FatFs333.dat 文件数据同步成功!
 7 FatFs333.dat 文件关闭成功!
 8 FatFs222.txt 文件创建成功!
 9 FatFs222.txt 文件数据写入成功!
10 FatFs222.txt 文件数据同步成功!
11 FatFs222.txt 文件关闭成功!
12 打开根目录成功!
13 (0x22)目录名称为:SYSTEM~1
14 (0x32)文件名称为:FATFS333.DAT
15 (0x32)文件名称为:FATFS222.TXT

以上是关于FATFS(笔记1)-SD卡创建FATFS文件系统,输出文件列表的主要内容,如果未能解决你的问题,请参考以下文章

STM32CubeMX学习笔记(27)——FatFs文件系统使用(操作SD卡)

STC单片机使用FatFs文件系统读取SD卡指定文件内容

贴片SD卡移植FATFS文件系统

贴片SD卡移植FATFS文件系统

贴片SD卡移植FATFS文件系统

无法使用 STM32F407 上的 Chan FatFs 库通过 SPI 写入 SD 卡文件