STM32 FATFS SDMMC

张开发
2026/4/9 15:05:33 15 分钟阅读

分享文章

STM32 FATFS SDMMC
#include “SD.h”#ifndefFATFS_UTIL_H#defineFATFS_UTIL_H#includeff.h#includemain.h#includelvgl.h#defineMAX_FILES500// 最大文件数#defineMAX_NAME_LEN50// 文件名最大长度包含 \0externcharfile_list[MAX_FILES][MAX_NAME_LEN];externintfile_count;voidList_SD_Files(void);intSD_ReadFile(char*flname);intSD_WriteFile(char*newfname,char*data,UINT*bw);// LVGL界面更新函数voidUpdate_SD_Files_To_LVGL(lv_obj_t*tabview);#endif/* FATFS_UTIL_H */#include “SD.C”#includeSD.h#includeff.h#includeusart.h#includestring.h#includelvgl.h#includestdio.h#includeevents_init.h// 全局 FatFs 对象和文件操作变量FATFS fs;/* FatFs 文件系统对象 */FIL fil;/* 文件对象 */FRESULT fres;/* FatFs 函数返回结果 */// 文件列表存储charfile_list[MAX_FILES][MAX_NAME_LEN];intfile_count0;// 打印文件信息内部使用staticvoidprint_file_info(FILINFO*fno);voidList_SD_Files(void){file_count0;DIR dir;FILINFO fno;UINT i0;charpath[]0:;// 挂载文件系统fresf_mount(fs,path,1);if(fres!FR_OK){HAL_UART_Transmit(huart1,(uint8_t*)failed,6,1000);return;}HAL_UART_Transmit(huart1,(uint8_t*)successful,10,1000);HAL_UART_Transmit(huart1,(uint8_t*)\r\n,2,1000);// 打开根目录fresf_opendir(dir,path);if(fres!FR_OK){HAL_UART_Transmit(huart1,(uint8_t*)failedFF,8,1000);return;}// 读取目录项while(1){fresf_readdir(dir,fno);if(fres!FR_OK||fno.fname[0]0)break;// 添加过滤跳过系统文件夹if(strcmp(fno.fname,System Volume Information)0||strcmp(fno.fname,$RECYCLE.BIN)0||strcmp(fno.fname,.)0||strcmp(fno.fname,..)0){continue;}print_file_info(fno);}// 清理资源f_closedir(dir);f_mount(NULL,path,0);}staticvoidprint_file_info(FILINFO*fno){// 打印文件名HAL_UART_Transmit(huart1,(uint8_t*)fno-fname,strlen(fno-fname),1000);strncpy(file_list[file_count],fno-fname,MAX_NAME_LEN-1);file_list[file_count][MAX_NAME_LEN-1]\0;file_count;HAL_UART_Transmit(huart1,(uint8_t*)\r\n,2,1000);}intSD_ReadFile(char*flname){charpath[]0:;charline[100];// 挂载文件系统fresf_mount(fs,path,1);if(fres!FR_OK)return(int)fres;// 打开文件fresf_open(fil,flname,FA_READ);if(fres!FR_OK){f_mount(NULL,path,0);return(int)fres;}// 逐行读取while(f_gets(line,sizeof(line),fil)){HAL_UART_Transmit(huart1,(uint8_t*)line,strlen(line),1000);HAL_UART_Transmit(huart1,(uint8_t*)\r\n,2,1000);}// 关闭文件并卸载f_close(fil);f_mount(NULL,path,0);return(int)fres;}intSD_WriteFile(char*newfname,char*data,UINT*bw){charpath[]0:;UINT lenstrlen(data);// 挂载文件系统fresf_mount(fs,path,1);if(fres!FR_OK)return(int)fres;// 创建/打开文件fresf_open(fil,newfname,FA_CREATE_ALWAYS|FA_WRITE|FA_READ);if(fres!FR_OK){f_mount(NULL,path,0);return(int)fres;}// 写入数据fresf_write(fil,data,len,bw);if(fresFR_OK){HAL_UART_Transmit(huart1,(uint8_t*)Write successful,16,1000);HAL_UART_Transmit(huart1,(uint8_t*)\r\n,2,1000);}else{HAL_UART_Transmit(huart1,(uint8_t*)Write failed,12,1000);HAL_UART_Transmit(huart1,(uint8_t*)\r\n,2,1000);}// 刷新并关闭f_sync(fil);f_close(fil);f_mount(NULL,path,0);return(int)fres;}// 将SD卡文件列表更新到LVGL界面 - 仅显示文件名voidUpdate_SD_Files_To_LVGL(lv_obj_t*tab_page){if(tab_pageNULL){//HAL_UART_Transmit(huart1, (uint8_t*)Tab page is NULL\r\n, 18, 1000);return;}lv_obj_t*list_buttonssMax_list[200];// 清除tab页面中的所有子对象lv_obj_clean(tab_page);// 重新添加所有文件按钮for(inti0;ifile_count;i){if(strlen(file_list[i])0){list_buttonssMax_list[i]lv_list_add_btn(guider_ui.screen_1_list_1,LV_SYMBOL_FILE,file_list[i]);}}// 如果没有文件显示提示信息if(file_count0){lv_obj_t*no_file_labellv_label_create(tab_page);lv_label_set_text(no_file_label,No files found);lv_obj_set_style_text_color(no_file_label,lv_color_hex(0x888888),0);lv_obj_align(no_file_label,LV_ALIGN_CENTER,0,0);}//HAL_UART_Transmit(huart1, (uint8_t*)Files displayed on LVGL (only filenames)\r\n, 42, 1000);}调用List_SD_Files();// 列出所有文件/* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE */List_SD_Files();// 列出所有文件//SD_WriteFile(test.txt, Hello STM32XXX!, NULL); // 写入文件//SD_ReadFile(file_list[0]); // 读取第一个文件HAL_Delay(5000);/* USER CODE BEGIN 3 */}挂载失败调节ClockDiv修改值为1到1023voidMX_SDMMC1_SD_Init(void){/* USER CODE BEGIN SDMMC1_Init 0 *//* USER CODE END SDMMC1_Init 0 *//* USER CODE BEGIN SDMMC1_Init 1 *//* USER CODE END SDMMC1_Init 1 */hsd1.InstanceSDMMC1;hsd1.Init.ClockEdgeSDMMC_CLOCK_EDGE_RISING;hsd1.Init.ClockPowerSaveSDMMC_CLOCK_POWER_SAVE_DISABLE;hsd1.Init.BusWideSDMMC_BUS_WIDE_4B;hsd1.Init.HardwareFlowControlSDMMC_HARDWARE_FLOW_CONTROL_DISABLE;hsd1.Init.ClockDiv100;或者更全面的过滤方法参考FATFS遍历技巧// 过滤系统元文件以$开头的if(fno.fname$)continue;// 过滤系统卷标信息if(strcmp(fno.fname,System Volume Information)0)continue;

更多文章