您的位置:首页 > 游戏 > 游戏 > 个人养老保险怎么买最划算_服务式办公室网_seo还有哪些方面的优化_关键词优化报价怎么样

个人养老保险怎么买最划算_服务式办公室网_seo还有哪些方面的优化_关键词优化报价怎么样

2025/4/19 6:05:06 来源:https://blog.csdn.net/m0_57585228/article/details/147030877  浏览:    关键词:个人养老保险怎么买最划算_服务式办公室网_seo还有哪些方面的优化_关键词优化报价怎么样
个人养老保险怎么买最划算_服务式办公室网_seo还有哪些方面的优化_关键词优化报价怎么样

概述

FATFS文件系统可以挂载SD卡也可以挂载FLASH eMMC等设备

SD卡需要格式化为FAT32模式 块大小默认即可

image-20250401131154037

移植

SD卡

SD卡扇区大小是 512B

SD卡 SDIO模式 可以直接在cubeMX里一键设置

先设置好SD卡的设置

这个是选择支持中文 其余是默认

image-20250401144906909

这个是检测引脚可以留空

当SD卡插入拔出时会引起检测脚的变化

image-20250401144931735

FLASH

FLASH接入FATFS需要自行修改接口,选用自定义模式

建议配合USB MSC功能使用

cubeMX配置

使用自定义模式,将扇区大小改为从512到4096都可

image-20250406164521203

设置内容

全在cubeMX生成的user_diskio.c

先导入头文件和设置扇区大小

image-20250406165626285

需要设置的APIs

全在cubeMX生成的user_diskio.c

初始化
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
DSTATUS输出错误码
DSTATUS USER_initialize (BYTE pdrv)

成功返回RES_OK 失败返回RES_ERROR

根据自己初始化写入函数

例子

这里不需要初始化直接返回成功即可

DSTATUS USER_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{/* USER CODE BEGIN INIT */UNUSED(pdrv);return RES_OK;/* USER CODE END INIT */
}
获取磁盘状态
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
DSTATUS输出错误码
DSTATUS USER_status(BYTE pdrv)

成功返回RES_OK 失败返回RES_ERROR

不使用返回即可

例子

DSTATUS USER_status(BYTE pdrv /* Physical drive number to identify the drive */
)
{/* USER CODE BEGIN STATUS */UNUSED(pdrv);return RES_OK;/* USER CODE END STATUS */
}
读取扇区
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
BYTE(uint8_t)buff缓冲区
DWORDsector扇区编号
UINT (uint32_t)count扇区数量
DSTATUS输出错误码
DRESULT USER_read(BYTE pdrv,BYTE *buff,DWORD sector,UINT count)

示例

这个函数 W25Qxx_Read_Data输入的是FLASH的地址和byte数量,因此要乘上扇区大小

DRESULT USER_read(BYTE pdrv,    /* Physical drive nmuber to identify the drive */BYTE *buff,   /* Data buffer to store read data */DWORD sector, /* Sector address in LBA */UINT count    /* Number of sectors to read */
)
{/* USER CODE BEGIN READ */W25Qxx_Read_Data(sector * USER_SECTOR_SIZE, buff, count * USER_SECTOR_SIZE);return RES_OK;/* USER CODE END READ */
}
写入扇区
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
BYTE(uint8_t)buff缓冲区
DWORDsector扇区编号
UINT (uint32_t)count扇区数量
DSTATUS输出错误码
DRESULT USER_write(BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)

示例

这个函数W25Qxx_Write 输入的是FLASH的地址和byte数量,因此要乘上扇区大小

DRESULT USER_write(BYTE pdrv,        /* Physical drive nmuber to identify the drive */const BYTE *buff, /* Data to be written */DWORD sector,     /* Sector address in LBA */UINT count        /* Number of sectors to write */
)
{/* USER CODE BEGIN WRITE *//* USER CODE HERE */W25Qxx_Write(sector * USER_SECTOR_SIZE, (uint8_t *)buff, count * USER_SECTOR_SIZE, 0);return RES_OK;/* USER CODE END WRITE */
}
控制操作
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
BYTE(uint8_t)cmd命令
void *buff缓冲区
DSTATUS输出错误码
DRESULT USER_ioctl(BYTE pdrv,BYTE cmd,void *buff)

必须要响应的命令

描述功能
GET_SECTOR_COUNT扇区数量
GET_SECTOR_SIZE扇区大小 单位byte
GET_BLOCK_SIZE区块大小

例子

使用W25Q128 16MB

扇区大小为4096=4KB

扇区数为 4096 这里写4095

区块直接写1 即可

DRESULT USER_ioctl(BYTE pdrv, /* Physical drive nmuber (0..) */BYTE cmd,  /* Control code */void *buff /* Buffer to send/receive control data */
)
{/* USER CODE BEGIN IOCTL */DRESULT res = RES_OK;switch (cmd){case CTRL_SYNC:res = RES_OK;break;case CTRL_TRIM:res = RES_OK;break;case GET_SECTOR_COUNT:*(DWORD *)buff = 4095;break;case GET_SECTOR_SIZE:*(DWORD *)buff = USER_SECTOR_SIZE;break;case GET_BLOCK_SIZE:*(DWORD *)buff = 1;break;}return res;/* USER CODE END IOCTL */
}

APIs

地址问题

根据初始化顺序,驱动器的根地址分别为0:/ 1:/

比如这个例子里 SD卡的根地址是0:/ USER(可以设为FLASH等) 地址为1:/

image-20250401151430074

挂载

输入输出
描述名称功能
FATFS*fs句柄
const TCHAR*path地址
BYTEopt是否立即加载(一般写1)
FRESULT输出错误码
FRESULT f_mount (FATFS* fs,const TCHAR* path,BYTE opt)

挂载例子

f_mount(&hFatfs, "0:/", 1);

打开文件

输入输出
描述名称功能
FIL*fp文件
const TCHAR*path地址
BYTEmode模式
FRESULT输出错误码
mode
描述功能
FA_READ只读
FA_WRITE只写
FA_OPEN_EXISTING如果文件存在,则打开;否则打开失败
FA_CREATE_NEW创建一个文件,如果文件存在,则创建失败
FA_CREATE_ALWAYS创建一个文件,如果文件存在,则覆盖原文件
FA_OPEN_ALWAYS如果文件存在,则打开,如果不存在则创建一个文件并打开

可以输入 FA_READ | FA_WRITE 来使用读写

FRESULT f_open (FIL* fp,const TCHAR* path,BYTE mode)

打开后光标指向开头

关闭文件

输入输出
描述名称功能
FIL*fp文件
FRESULT输出错误码
FRESULT f_close (FIL* fp)

读文件

输入输出
描述名称功能
FIL*fp文件
void*buff缓冲区
UINTbtr操作数量
UINT*br已操作数量
FRESULT输出错误码
FRESULT f_read (FIL* fp,void* buff,UINT btr,UINT* br)

会从光标处开始读取 指针自增

写文件

输入输出
描述名称功能
FIL*fp文件
void*buff缓冲区
UINTbtr操作数量
UINT*br已操作数量
FRESULT输出错误码
FRESULT f_write (FIL* fp,const void* buff,UINT btw,UINT* bw)

会从光标处开始写入 指针自增

打印到文件

输入输出
描述名称功能
FIL*fp文件
const TCHAR*fmt规则格式串
.........
int输出写入数量
int f_printf (FIL* fp,const TCHAR* fmt,...)

会从光标处开始写入 指针自增

获取文件大小

输入输出
描述名称功能
FIL*fp文件
FSIZE_t输出大小
f_size(fp)

改变光标位置

输入输出
描述名称功能
FIL*fp文件
FSIZE_tofs从顶部开始的偏移
FRESULT输出错误码
FRESULT f_lseek (FIL* fp,FSIZE_t ofs)

删除文件

输入输出
描述名称功能
const TCHAR*path路径
FRESULT输出错误码
FRESULT f_unlink (const TCHAR* path)

检查文件是否存在

输入输出
描述名称功能
const TCHAR*path路径
FILINFO*fno信息
FRESULT输出不存在FR_NO_FILE,存在FR_OK
FRESULT f_stat (const TCHAR* path,FILINFO* fno)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com