OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4510|回复: 6

关于正点原子fatfs的demo,外部flash文件系统必须从地址0开始吗?

[复制链接]

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2021-12-3 15:36:59 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 ssssssssssss 于 2021-12-3 17:25 编辑

下面是正点原子代码:
#define SD_CARD         0  //SD卡,卷标为0
#define EX_FLASH 1        //外部flash,卷标为1

#define FLASH_SECTOR_SIZE         512                          
//对于W25Q128
//前12M字节给fatfs用,12M字节后,用于存放字库,字库占用3.09M.        剩余部分,给客户自己用                                    
u16            FLASH_SECTOR_COUNT=2048*12;        //W25Q1218,前12M字节给FATFS占用
#define FLASH_BLOCK_SIZE           8             //每个BLOCK有8个扇区
如果我用flash的任意的连续的12M一段空间来给fatfs用,代码应该怎么改?
  1. //初始化磁盘
  2. DSTATUS disk_initialize (
  3.         BYTE pdrv                                /* Physical drive nmuber (0..) */
  4. )
  5. {
  6.         u8 res=0;            
  7.         switch(pdrv)
  8.         {
  9.                 case SD_CARD://SD卡
  10.                         res=SD_Init();//SD卡初始化
  11.                           break;
  12.                 case EX_FLASH://外部flash
  13.                         W25QXX_Init();
  14.                         FLASH_SECTOR_COUNT=2048*12;//W25Q1218,前12M字节给FATFS占用
  15.                          break;
  16.                 default:
  17.                         res=1;
  18.         }                 
  19.         if(res)return  STA_NOINIT;
  20.         else return 0; //初始化成功
  21. }  

  22. //获得磁盘状态
  23. DSTATUS disk_status (
  24.         BYTE pdrv                /* Physical drive nmuber (0..) */
  25. )
  26. {
  27.         return 0;
  28. }

  29. //读扇区
  30. //drv:磁盘编号0~9
  31. //*buff:数据接收缓冲首地址
  32. //sector:扇区地址
  33. //count:需要读取的扇区数
  34. DRESULT disk_read (
  35.         BYTE pdrv,                /* Physical drive nmuber (0..) */
  36.         BYTE *buff,                /* Data buffer to store read data */
  37.         DWORD sector,        /* Sector address (LBA) */
  38.         UINT count                /* Number of sectors to read (1..128) */
  39. )
  40. {
  41.         u8 res=0;
  42.     if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误                          
  43.         switch(pdrv)
  44.         {
  45.                 case SD_CARD://SD卡
  46.                         res=SD_ReadDisk(buff,sector,count);         
  47.                         while(res)//读出错
  48.                         {
  49.                                 SD_Init();        //重新初始化SD卡
  50.                                 res=SD_ReadDisk(buff,sector,count);        
  51.                                 //printf("sd rd error:%d\r\n",res);
  52.                         }
  53.                         break;
  54.                 case EX_FLASH://外部flash
  55.                         for(;count>0;count--)
  56.                         {
  57.                                 W25QXX_Read(buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
  58.                                 sector++;
  59.                                 buff+=FLASH_SECTOR_SIZE;
  60.                         }
  61.                         res=0;
  62.                         break;
  63.                 default:
  64.                         res=1;
  65.         }
  66.    //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
  67.     if(res==0x00)return RES_OK;         
  68.     else return RES_ERROR;           
  69. }

  70. //写扇区
  71. //drv:磁盘编号0~9
  72. //*buff:发送数据首地址
  73. //sector:扇区地址
  74. //count:需要写入的扇区数
  75. #if _USE_WRITE
  76. DRESULT disk_write (
  77.         BYTE pdrv,                        /* Physical drive nmuber (0..) */
  78.         const BYTE *buff,        /* Data to be written */
  79.         DWORD sector,                /* Sector address (LBA) */
  80.         UINT count                        /* Number of sectors to write (1..128) */
  81. )
  82. {
  83.         u8 res=0;  
  84.     if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误                          
  85.         switch(pdrv)
  86.         {
  87.                 case SD_CARD://SD卡
  88.                         res=SD_WriteDisk((u8*)buff,sector,count);
  89.                         while(res)//写出错
  90.                         {
  91.                                 SD_Init();        //重新初始化SD卡
  92.                                 res=SD_WriteDisk((u8*)buff,sector,count);        
  93.                                 //printf("sd wr error:%d\r\n",res);
  94.                         }
  95.                         break;
  96.                 case EX_FLASH://外部flash
  97.                         for(;count>0;count--)
  98.                         {                                                                                    
  99.                                 W25QXX_Write((u8*)buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
  100.                                 sector++;
  101.                                 buff+=FLASH_SECTOR_SIZE;
  102.                         }
  103.                         res=0;
  104.                         break;
  105.                 default:
  106.                         res=1;
  107.         }
  108.     //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
  109.     if(res == 0x00)return RES_OK;         
  110.     else return RES_ERROR;        
  111. }
  112. #endif


  113. //其他表参数的获得
  114. //drv:磁盘编号0~9
  115. //ctrl:控制代码
  116. //*buff:发送/接收缓冲区指针
  117. #if _USE_IOCTL
  118. DRESULT disk_ioctl (
  119.         BYTE pdrv,                /* Physical drive nmuber (0..) */
  120.         BYTE cmd,                /* Control code */
  121.         void *buff                /* Buffer to send/receive control data */
  122. )
  123. {
  124.         DRESULT res;                                                                              
  125.         if(pdrv==SD_CARD)//SD卡
  126.         {
  127.             switch(cmd)
  128.             {
  129.                     case CTRL_SYNC:
  130.                                 res = RES_OK;
  131.                         break;         
  132.                     case GET_SECTOR_SIZE:
  133.                                 *(DWORD*)buff = 512;
  134.                         res = RES_OK;
  135.                         break;         
  136.                     case GET_BLOCK_SIZE:
  137.                                 *(WORD*)buff = SDCardInfo.CardBlockSize;
  138.                         res = RES_OK;
  139.                         break;         
  140.                     case GET_SECTOR_COUNT:
  141.                         *(DWORD*)buff = SDCardInfo.CardCapacity/512;
  142.                         res = RES_OK;
  143.                         break;
  144.                     default:
  145.                         res = RES_PARERR;
  146.                         break;
  147.             }
  148.         }else if(pdrv==EX_FLASH)        //外部FLASH  
  149.         {
  150.             switch(cmd)
  151.             {
  152.                     case CTRL_SYNC:
  153.                                 res = RES_OK;
  154.                         break;         
  155.                     case GET_SECTOR_SIZE:
  156.                         *(WORD*)buff = FLASH_SECTOR_SIZE;
  157.                         res = RES_OK;
  158.                         break;         
  159.                     case GET_BLOCK_SIZE:
  160.                         *(WORD*)buff = FLASH_BLOCK_SIZE;
  161.                         res = RES_OK;
  162.                         break;         
  163.                     case GET_SECTOR_COUNT:
  164.                         *(DWORD*)buff = FLASH_SECTOR_COUNT;
  165.                         res = RES_OK;
  166.                         break;
  167.                     default:
  168.                         res = RES_PARERR;
  169.                         break;
  170.             }
  171.         }else res=RES_ERROR;//其他的不支持
  172.     return res;
  173. }
  174. #endif
  175. //获得时间
  176. //User defined function to give a current time to fatfs module      */
  177. //31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */                                                                                                                                                                                                                                          
  178. //15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */                                                                                                                                                                                                                                                
  179. DWORD get_fattime (void)
  180. {                                 
  181.         return 0;
  182. }                        
  183. //动态分配内存
  184. void *ff_memalloc (UINT size)                        
  185. {
  186.         return (void*)mymalloc(SRAMIN,size);
  187. }
  188. //释放内存
  189. void ff_memfree (void* mf)                 
  190. {
  191.         myfree(SRAMIN,mf);
  192. }


复制代码



如果我用flash的任意的12M空间来给fatfs用,代码应该怎么改?


实验39 FATFS实验.zip

8.77 MB, 下载次数: 111

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2021-12-3 15:38:50 | 显示全部楼层
帮顶                  
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2021-12-3 16:54:35 | 显示全部楼层
怎么任意,分配给FATFS使用的空间不连续?
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
 楼主| 发表于 2021-12-3 17:11:11 | 显示全部楼层
GJJ1999 发表于 2021-12-3 16:54
怎么任意,分配给FATFS使用的空间不连续?

中间任一段12M,当然是连续的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2021-12-4 01:05:02 | 显示全部楼层
ssssssssssss 发表于 2021-12-3 17:11
中间任一段12M,当然是连续的

将spi flash操作的地方加上首地址就可以了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
 楼主| 发表于 2021-12-6 11:18:35 | 显示全部楼层
正点原子 发表于 2021-12-4 01:05
将spi flash操作的地方加上首地址就可以了。。。

W25QXX_Read(buff,FLASH_START_ADDR+sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);

W25QXX_Write((u8*)buff,FLASH_START_ADDR+sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);






对的吧?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2021-12-7 01:24:27 | 显示全部楼层
ssssssssssss 发表于 2021-12-6 11:18
W25QXX_Read(buff,FLASH_START_ADDR+sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);

W25QXX_Write((u ...

是的,差不多就是这个意思
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 09:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表