云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 基于spi-flash的fatfs配置

基于spi-flash的fatfs配置

  • 62 次阅读
  • 3 次下载
  • 2025/6/26 0:41:05

基于spi-flash的fatfs配置

——王京石 硬件平台:stm32f103VCT6、w25x16 软件平台:fatfs R0.10 由于产品需要存储大量数据,stm32单片机存储有限需要使用外部flash辅助存储。考虑各方面原因最后选用了一款spi-flash型号为w25x16,spi总线操作,拥有2M的存储单元。为了方便,我们想到了使用文件系统fatfs。此文档记录了配置流程,为以后做参考。

一、 底层移植

Fatfs的diskio.c与diskio.h文件用于兼容底层接口,主要配置过程就是重写 disk_initialize、disk_status、disk_read、disk_write、disk_ioctl、get_fattime六个函数以兼容不同的硬件设备。

1、设备初始化 DSTATUS disk_initialize (BYTE pdrv) 用于初始化硬件设备,在本次项目中主要就是初始化SPI总线接口,这个底层函数在执行应用层的open、write、read等函数是都会被执行。本项目没有对flash进行分区操作,因此设备号应该为0。

DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber (0..) */ ) {

if(pdrv == 0) //设备号为0则进行初始化操作 { SPI_Flash_Init(); return 0; //返回0表示成功 } else { return STA_NODISK; } }

2、读取设备状态 DSTATUS disk_status (BYTE pdrv); 用于读取设备状态,判断设备是否处于空闲状态,由于本项目使用的存储单元为spi-flash所以始终是可以操作的状态,因此始终返回OK就可以。

DSTATUS disk_status ( BYTE pdrv /* Physical drive nmuber (0..) */ ) {

}

if(pdrv == 0) return 0;

else return STA_NODISK;

3、读扇区操作 DRESULT disk_read ( BYTE pdrv, BYTE *buff, DWORD sector, UINT count )

/* 物理设备号 */ /* 读取数据缓冲 */ /* 扇区号 */

/* 读取的扇区个数(1-128) */

使用读操作在指定扇区里读取出数据。

DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ UINT count /* Number of sectors to read (1..128) */ ) { if(pdrv != 0) return RES_WRPRT; SPI_Flash_Read(buff, ((uint32_t)sector) << 12, ((uint32_t)count) << 12); return RES_OK; }

4、写扇区操作DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); 使用写操作在指定扇区里写入相应数据,再写入之前必须要擦除扇区。由于w25x16最小的擦除块为4096字节,因此将fatfs的扇区定义为4096,而w25x16一次性写入256字节数据,因此每个扇区需要写入八次数据。 DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ UINT count /* Number of sectors to write (1..128) */ ) { BYTE *buf = (uint8_t*)buff; uint32_t secAddr = ((uint32_t)sector) << 12;

}

uint8_t i;

if(pdrv != 0) return RES_WRPRT;

for(i=0; i < count; i++) { SPI_Flash_Erase_Sector(sector); sector ++;

SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;

SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;

SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;

SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256; SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;

}

return RES_OK;

5、磁盘控制函数 DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); 主要用于应用层程序同步磁盘、获取扇区大小、获取磁盘总扇区数、磁盘擦除块大小与擦除操作等功能。注意通过数组buff带入或是带出的参数必须要格式匹配。

#if _USE_IOCTL DRESULT disk_ioctl ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE cmd, /* Control code */

) {

void *buff /* Buffer to send/receive control data */

if(pdrv != 0) return RES_WRPRT;

switch(cmd) {

case CTRL_SYNC : //spi-flash不需要同步,这一项始终返回0 return RES_OK;

case GET_SECTOR_SIZE : *((WORD *)buff) = 4096; //始终通过buff返回扇区大小就可以了 return RES_OK;

case GET_SECTOR_COUNT : *((DWORD *)buff) = 512; //始终通过buff返回总扇区数就可以了 return RES_OK;

case GET_BLOCK_SIZE : //禁止擦除功能,这两项无意义 return RES_OK;

case CTRL_ERASE_SECTOR : return RES_OK; }

6. 获取时间 DWORD get_fattime (void) 在写操作时需要调用的函数,如果需要真实的时间信息则使用RTC始终读出时间信息通过这个函数返回,本项目中不需要时间因此始终返回0就可以了。

/* RTC function */ #if !_FS_READONLY DWORD

get_fattime (void) { return 0; }

#endif

二、 fatfs配置

在移植完底层之后还需要根据需求配置fatfs,修改各种配置宏是主要的配置手段。

1、配置数据类型

搜索更多关于: 基于spi-flash的fatfs配置 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

基于spi-flash的fatfs配置 ——王京石 硬件平台:stm32f103VCT6、w25x16 软件平台:fatfs R0.10 由于产品需要存储大量数据,stm32单片机存储有限需要使用外部flash辅助存储。考虑各方面原因最后选用了一款spi-flash型号为w25x16,spi总线操作,拥有2M的存储单元。为了方便,我们想到了使用文件系统fatfs。此文档记录了配置流程,为以后做参考。 一、 底层移植 Fatfs的diskio.c与diskio.h文件用于兼容底层接口,主要配置过程就是重写 disk_initialize、disk_status、disk_read、disk_write

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com