五 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 |