STM32CubeMX系列教程18:文件系统FATFS
删除上一章SDMMC的应用程序。在main.c文件前添加变量。fs为文件系统工作区,fil为文件对象结构的指针。rtext/wtext分别为读写缓存,bytesread/byteswritten分别存储读写的字节数。filename存储文件名(FATFS文件系统配置时使能了长文件名,最长255字节,若不支持长文件名,则文件名最多8个字节)。
/* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ FATFS fs; // Work area (file system object) for logical drive FIL fil; // file objects uint32_t byteswritten; /* File write counts */ uint32_t bytesread; /* File read counts */ uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */ uint8_t rtext[100]; /* File read buffers */ char filename[] = "STM32cube.txt"; /* USER CODE END PV */
在main函数中添加应用程序。程序中首先注册一个文件系统对象,然后新建STM32cube.txt文件,将数据写文件中再读出来,判断文件系统是否工作正常。
/* USER CODE BEGIN 2 */ printf("\r\n ****** FatFs Example ******\r\n\r\n"); /*##-1- Register the file system object to the FatFs module ##############*/ retSD = f_mount(&fs, "", 0); if(retSD) { printf(" mount error : %d \r\n",retSD); Error_Handler(); } else printf(" mount sucess!!! \r\n"); /*##-2- Create and Open new text file objects with write access ######*/ retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); if(retSD) printf(" open file error : %d\r\n",retSD); else printf(" open file sucess!!! \r\n"); /*##-3- Write data to the text files ###############################*/ retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); if(retSD) printf(" write file error : %d\r\n",retSD); else { printf(" write file sucess!!! \r\n"); printf(" write Data : %s\r\n",wtext); } /*##-4- Close the open text files ################################*/ retSD = f_close(&fil); if(retSD) printf(" close error : %d\r\n",retSD); else printf(" close sucess!!! \r\n"); /*##-5- Open the text files object with read access ##############*/ retSD = f_open(&fil, filename, FA_READ); if(retSD) printf(" open file error : %d\r\n",retSD); else printf(" open file sucess!!! \r\n"); /*##-6- Read data from the text files ##########################*/ retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread); if(retSD) printf(" read error!!! %d\r\n",retSD); else { printf(" read sucess!!! \r\n"); printf(" read Data : %s\r\n",rtext); } /*##-7- Close the open text files ############################*/ retSD = f_close(&fil); if(retSD) printf(" close error!!! %d\r\n",retSD); else printf(" close sucess!!! \r\n"); /*##-8- Compare read data with the expected data ############*/ if(bytesread == byteswritten) { printf(" FatFs is working well!!!\r\n"); } /* USER CODE END 2 */
在main.c文件后面添加错误处理函数。
/* USER CODE BEGIN 4 */
static void Error_Handler(void)
{
printf("something wrong ....\r\n");
/* User may add here some code to deal with this error */
while(1)
{
}
}
/* USER CODE END 4 */
在main.c文件前面添加错误处理函数声明。
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
static void Error_Handler(void);
/* USER CODE END PFP */
编译程序并下载到开发板。将Micro SD卡插入Micro SD Storage Board中,再插到Open746I-C开发的SDMMC接口中。打开串口调试助手,设置波特率为115200,按下复位串口助手上面会显示如下信息。
下载简介一下FATFS的几个操作函数。1.f_mount在FatFs模块上注册、注销一个工作区(文件系统对象)。
FRESULT f_mount (
FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/
const TCHAR* path, /* Logical drive number to be mounted/unmounted */
BYTE opt /* 0:Do not mount (delayed mount), 1:Mount immediately */
)
参数
fs 工作区(文件系统对象)指针
path 注册/注销工作区的逻辑驱动器号
opt 注册或注销选项
2.f_open
创建/打开一个文件对象
FRESULT f_open (
FIL* fp, /* Pointer to the blank file object */
const TCHAR* path, /* Pointer to the file name */
BYTE mode /* Access mode and file open mode flags */
)
fp 将被创建的文件对象结构的指针
path 文件名指针,指定将创建或打开的文件名mode 访问类型和打开方法,由一下标准的一个组合指定的。
模式 描述 FA_READ 指定读访问对象。可以从文件中读取数据。 与FA_WRITE 结 合可以进行读写访问。 FA_WRITE 指定写访问对象。可以向文件中写入数据。与FA_READ 结合 可以进行读写访问。 FA_OPEN_EXISTING 打开文件。如果文件不存在,则打开失败。(默认) FA_OPEN_ALWAYS 如果文件存在,则打开;否则,创建一个新文件。 FA_CREATE_NEW 创建一个新文件。如果文件已存在,则创建失败。 FA_CREATE_ALWAYS 创建一个新文件。如果文件已存在,则它将被截断并覆盖。
3.f_close关闭一个打开的文件
FRESULT f_close (
FIL *fp /* Pointer to the file object to be closed */
)
fp 指向将被关闭的已打开的文件对象结构的指针。
4.f_read
从一个打开的文件中读取数据
FRESULT f_read (
FIL* fp, /* Pointer to the file object */
void* buff, /* Pointer to data buffer */
UINT btr, /* Number of bytes to read */
UINT* br /* Pointer to number of bytes read */
)
fp 指向将被读取的已打开的文件对象结构的指针
buff 指向存储读取数据的缓冲区的指针
btr 要读取的字节数
br 指向返回已读取字节数的UINT变量的指针,返回为实际读取的字节数。
5.f_write写入数据到一个已打开的文件
FRESULT f_write (
FIL* fp, /* Pointer to the file object */
const void *buff, /* Pointer to the data to be written */
UINT btw, /* Number of bytes to write */
UINT* bw /* Pointer to number of bytes written */
)
fp 指向将被写入的已打开的文件对象结构的指针
buff 指向存储写入数据的缓冲区的指针
btr 要写入的字节数
br 指向返回已写入字节数的UINT变量的指针,返回为实际写入的字节数。
另外FatFs还有很多API操作函数,在这里不再作详细的介绍,详细信息请查看FatFs文件系统官网。