#include "board.h" #include "hpm_sdmmc_sd.h" #include "soft_sdcard.h" #include "ff.h" #include "hard_sdio_sd.h" #include "diskio.h" #include "my_math.h" #include "soft_delay.h" #include "soft_time.h" #include #include #include /* //==========================连续写入测试============================= ... (注释内容保持不变) */ /** ****************************************************************************** * 定义变量 ****************************************************************************** */ FATFS fs; /* FatFs文件系统对象 */ FIL fnew_data, fnew_log; /* 文件对象 */ FRESULT res_sd; /* 文件操作结果 */ UINT frnum; /* 文件成功读数量 */ UINT fwnum; /* 文件成功写数量 */ // BYTE ReadBuffer[_MAX_SS] = {0}; /* 读缓冲区 */ // BYTE WriteBuffer[_MAX_SS] = {0}; /* 写缓冲区*/ BYTE work[FF_MAX_SS] = {0}; /* 工作区 (larger is better for processing time) */ DIR logdir; DIR posdir; FILINFO fno; int file_num = 0; // FATFS文件名不区分大小写。默认大写。 const char *logpath = "LOG"; const char *pospath = "POS"; static uint8_t _sd_init_ok = 0; /*========== HPM6750 适配:添加设备定义 ==========*/ #define SDMMC_BASE BOARD_APP_SDXC_BASE #define SDMMC_IRQn BOARD_APP_SDXC_IRQn #define DEV_SD 0 uint8_t sdcard_initok(void) { return _sd_init_ok; } /** * @brief 初始化 SD 卡 * @param init_type * @arg 0 初始化 SD 卡, 1 格式化 SD 卡 */ void sdcard_inital(uint8_t init_type) { // 硬件初始化 被中间件做了? /*========== HPM6750 适配:等待SD卡插入并初始化 ==========*/ while ((disk_initialize(DEV_SD))) // 检测不到SD卡 { printf("SD CARD ERR \n"); delay_ms(600); } /*========== HPM6750 适配:配置中断 ==========*/ // intc_m_enable_irq_with_priority(SDMMC_IRQn, 1); 要启动中断??? // SDIO方式挂载文件系统,文件系统挂载时会对SDIO设备初始化 /*========== HPM6750 适配:保持空路径 ==========*/ res_sd = f_mount(&fs, "", 1); /*----------------------- 格式化测试 ---------------------------*/ /* 如果没有文件系统就格式化创建创建文件系统 */ if (res_sd == FR_NO_FILESYSTEM || init_type == 1) { /* 格式化 */ /*========== HPM6750 适配:MKFS_PARM结构体 ==========*/ MKFS_PARM mkfs_parm; mkfs_parm.fmt = FM_ANY; mkfs_parm.n_fat = 0; mkfs_parm.align = 0; mkfs_parm.n_root = 0; mkfs_parm.au_size = 0; /* 保持空路径 */ res_sd = f_mkfs("", &mkfs_parm, work, sizeof(work)); if (res_sd == FR_OK) { /* 格式化后,先取消挂载 */ res_sd = f_mount(NULL, "", 1); /* 重新挂载 */ res_sd = f_mount(&fs, "", 1); } else { // 格式化失败。》》 printf("sd card format fail!\n"); while (1) ; } } else if (res_sd != FR_OK) { // SD卡挂载文件系统失败,可能原因:SD卡初始化不成功。\r\n"); printf("sd card mount fail!\n"); while (1) ; } else { // 文件系统挂载成功,可以进行读写测试\r\n"); } // 创建文件夹 res_sd = f_mkdir(logpath); res_sd = f_mkdir(pospath); // 检查是否存在LOG文件 f_open(&fnew_data, "LOG/LOG_FLY.DAT", FA_CREATE_NEW); f_close(&fnew_data); DWORD nclst; unsigned long free_size = 0; FATFS *fs_p = &fs; // 检查剩余容量 res_sd = f_getfree("", &nclst, &fs_p); free_size = nclst * fs_p->csize / 2; // 打开log文件夹, 读下一个的文件 res_sd = f_opendir(&logdir, logpath); res_sd = f_readdir(&logdir, &fno); // 如果剩余容量小于96MB, 删除部分数据文件, 防止写满 while (free_size < 96 * 1024) { if (fno.fname[0] != 'L') { char datafile_path[20] = ""; // 拼接文件路径 strcat(datafile_path, logpath); strcat(datafile_path, "/"); strcat(datafile_path, fno.fname); // 删除一个文件 f_unlink(datafile_path); } // 再读一下剩余的容量是否够用 res_sd = f_getfree("", &nclst, &fs_p); free_size = nclst * fs_p->csize / 2; // 读下一个文件 res_sd = f_readdir(&logdir, &fno); } _sd_init_ok = 1; // 关闭文件夹 res_sd = f_closedir(&logdir); }