OpenEdv-开源电子网

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

求解答,stm32 sd卡使用fatfs文件管理,在调用f_open函数时返回12号错误

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-6-26
在线时间
8 小时
发表于 2020-12-19 00:51:01 | 显示全部楼层 |阅读模式
1金钱
stm32 sd卡使用fatfs文件管理,在调用f_open函数时返回12号错误,FR_NOT_ENABLED,        /* (12) The volume has no work area */
以下为源代码
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "malloc.h"  
#include "MMC_SD.h"   
#include "diskio.h"
#include "integer.h"
#include "stm32f10x.h"
#include "ffconf.h"
#include "ff.h"
u8 buff[128];   
u8 read_buffer[128];
FIL fill;                         
UINT br,bw;                       
FATFS *fs;
static FRESULT res;

int main(void)
{
        int i=0;
        u8 t=0;         
         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init();                   
        uart_init(115200);                
        LED_Init();                                 
        mem_init();                               


        while(SD_Initialize())
        {
                delay_ms(500);                                       
                delay_ms(500);
                LED0=!LED0;
        }
                                                                                    
        printf("SD Card OK    ");
        printf("SD Card Size:     MB");
       
         delay_ms(1000);

         res = f_mount(fs,"0:",1);                                   //
        if(res != RES_OK)
        {
              printf("f_mount error!\r\n");
              delay_ms(500);
        }
         else {
              printf("f_mount successful!\r\n");
         }

         res = f_open(&fill,"0:/test.txt",FA_READ | FA_WRITE | FA_CREATE_ALWAYS);
       
        delay_ms(500);
         if(res!=RES_OK)
       {       
              t=res;
              printf("open %d  ",t);
         }
         else{       
               printf("f_open succeed");
         }
         delay_ms(500);
         
         for(i = 0;i < 128;i++)
         {
                buff[i] = i % 256;
          }
        res = f_write(&fill,buff,128,&bw);  
                               
        if(res!=RES_OK)
        {
              t=res;
              printf("write %d  ",t);         
         }
         else{
              printf("f_write succeed");
         }
         delay_ms(500);
         
        res = f_read(&fill,read_buffer,128,&br);
        if(res != RES_OK || br != 128)
       {
            t=res;
            printf("read %d  ",t);
          }
        else{
                printf("f_read successful!\r\n");
        }
                               
        delay_ms(500);
         f_close(&fill);
         
          for(i=0;i<128;i++)
        {
                printf("%d ",read_buffer[i]);
        }
        delay_ms(1000);
        while(1)
        {
             LED0=!LED0;
             delay_ms(1000);
        }              
}


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

使用道具 举报

0

主题

130

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1872
金钱
1872
注册时间
2016-10-23
在线时间
262 小时
发表于 2020-12-19 20:03:06 | 显示全部楼层
f_mount(fs,"0:",1);   没给fs 申请内存
回复

使用道具 举报

0

主题

130

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1872
金钱
1872
注册时间
2016-10-23
在线时间
262 小时
发表于 2020-12-19 20:23:43 | 显示全部楼层
本帖最后由 a1156284 于 2020-12-19 20:27 编辑

FATFS *fs
这只是一个指针

原子官方例程里是 会申请内存空间的

原子官方例程里是 会申请内存空间的

为工作区 文件结构 等分配一定空间

为工作区 文件结构 等分配一定空间

这是fatfs 结构体,可以看到用到了很多变量

这是fatfs 结构体,可以看到用到了很多变量
6年嵌入式老玩家 深圳
回复

使用道具 举报

0

主题

130

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1872
金钱
1872
注册时间
2016-10-23
在线时间
262 小时
发表于 2020-12-19 20:32:24 | 显示全部楼层
FATFS fs;
f_mount(&fs,"0:",1);
你可以改成这样试下。

也可以用 mymalloc 对fatfs 需要使用的 内存进行 管理,不需要 或者 内存 不够的 的时候 可以 释放掉。再分配给其他地方用。
6年嵌入式老玩家 深圳
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 15:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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