首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 FatFS 移植经验分享(4)

STM32 FatFS 移植经验分享(4)

五 FatFS初步使用
        接下来就是使用FatFS了,看了这个函数我找回了当初初学C语言的感觉,打开一个文件,然后读一些数据,然后创建另一个文件,在文件中写一些数据,最后关闭文件。
  • int main(void)
  • {
  •   //初始化Systick
  •   RCC_Config();
  •   //初始化串口
  •   USART1_Config();
  •   //初始化SPI1
  •   SPI1_Config();
  •   printf("start to read file\n");
  •   /* Register volume work area (never fails) */
  •   f_mount(0, &fatfs);
  •   printf("\nOpen a test file (test.txt).\n");
  • rc = f_open(&fil, "test.txt", FA_READ);
  • if (rc) die(rc);
  •         printf("\nType the file content.\n");
  •         for (;;) {
  •                 rc = f_read(&fil, buff, sizeof(buff), &br);        /* Read a chunk of file */
  •                 if (rc || !br) break;                                    /* Error or end of file */
  •                 for (i = 0; i < br; i++)                                /* Type the data */
  •                         putchar(buff);
  •         }
  •         if (rc) die(rc);
  •         printf("\nClose the file.\n");
  •         rc = f_close(&fil);
  •         if (rc) die(rc);
  •         printf("\nCreate a new file (hello.txt).\n");
  •         rc = f_open(&fil, "HELLO.TXT", FA_WRITE | FA_CREATE_ALWAYS);
  •         if (rc) die(rc);
  •         printf("\nWrite a text data. (Hello world!)\n");
  •         rc = f_write(&fil, "Hello world!\r\n", 14, &bw);
  •         if (rc) die(rc);
  •         printf("%u bytes written.\n", bw);
  •         printf("\nClose the file.\n");
  •         rc = f_close(&fil);
  •         if (rc) die(rc);
  •   while (1)
  •   {
  •   }
  • }

复制代码
如果出现失败的话,程序会进入die函数,该函数会输出错误代码,并进入一个无限循环。
通过串口的输出结果如下所示。

<IGNORE_JS_OP>


我再把SD卡从目标板上拿下,查看文件中的内容。的确hello.txt文件中写了hello world字符(应该还有回车和换行符)。

<IGNORE_JS_OP>


六         我的错误经历
        再快要移植成功的时候,我一运行程序,程序就进入die函数,并显示错误1,提示应该是SD卡操作错误。我通过断点调试和printf输出,把问题定位到发送cmd0处,返回的结果为一个非法的命令。我从CMD17命令入手,查阅了网上各位大神的经验,有说是发送命令的延时时候不够。但是照着这个修改之后问题存在,无奈之下在电脑面前苦苦思考。直到我的女朋友,在愚人节那天“玩”我,当时我正在仔细的检查代码,她和我说某某老师要找我并提醒我一定要拿手机,我收拾起我凌乱的思绪,立刻跑过去时,她却打电话给我说愚人节快乐。我很无奈但也有点开心的回到电脑面前,一动鼠标就看到了某些异样。
#define CMD17        (7)                        /* READ_SINGLE_BLOCK */
我把CMD17命令的宏定义写成了7,而实际上是17。就这么一个简答的错误,花费了我一天的时间。也非常感谢女朋友的这个愚人节玩笑,没有她或许就无法发现这个问题。
        一个尚未解决的问题!
        还有一个比较特殊的地方请聪明的你注意一下,在generic中man函数中,把这些定义在了main函数里面。这些定义如下
  •           FRESULT rc;                                /* Result code */
  •         FATFS fatfs;                                /* File system object */
  •         FIL fil;                                                /* File object */
  •         DIR dir;                                        /* Directory object */
  •         FILINFO fno;                                /* File information object */
  •         UINT bw, br, i;
  •         BYTE buff[128];

复制代码
如果把这些变量的声明都放在main函数中的话,系统将会运行到一个异常中,如下图所示。这个错误会让人非常的沮丧。虽然我没有找到原因,但是我找到了解决的方法。把这些变量的声明放在函数之外
<IGNORE_JS_OP>

IAR版本 V5.5
继承事业,薪火相传
返回列表