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文件系统,输出文件列表的主要内容,如果未能解决你的问题,请参考以下文章