打印
[STM32F1]

STM32基础篇FATFS 数码相框-BMP 图片显示

[复制链接]
4208|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
实验目标:
1. 熟悉 FATFS 文件系统。
2. 学习 BMP 图片文件格式。
3. 学习 BMP 图片的解码过程。

沙发
aizaixiyuanqian|  楼主 | 2018-4-30 19:24 | 只看该作者
FATFS  文件系统操作
在次实验,我们学习了如何移植 FATFS 文件系统,并教大家怎么读取文件系
统的内存容量。

使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2018-4-30 19:25 | 只看该作者
这次实验,我们来学习怎么读取文件系统中的文件。本次实验不是很难,大家加油。

使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2018-4-30 19:27 | 只看该作者
读取一个文件夹下所有的文件名(带后缀)
在这里我们可以使用 f_readdir()函数来读取某一个文件夹下所有文件的
文件名。

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2018-4-30 19:27 | 只看该作者
在 FATFS 使用说明里面 f_readdir()函数它还提供了一个使用例程:
FRESULT scan_files (
char* path /* Start node to be scanned (also used as work area) */
)
{
FRESULT res;
FILINFO fno;
DIR dir;
int i;
char *fn; /* This function is assuming non-Unicode cfg. */
#if _USE_LFN
static char lfn[_MAX_LFN + 1]; /* Buffer to store the LFN */
fno.lfname = lfn;
fno.lfsize = sizeof lfn;
#endif
res = f_opendir(&dir, path); /* Open the directory */
if (res == FR_OK) {
i = strlen(path);
for (;;) {
res = f_readdir(&dir, &fno); /* Read a directory item */
if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error
or end of dir */
if (fno.fname[0] == '.') continue; /* Ignore dot entry */
#if _USE_LFN
fn = *fno.lfname ? fno.lfname : fno.fname;
#else
fn = fno.fname;
#endif

使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2018-4-30 19:28 | 只看该作者
if (fno.fattrib & AM_DIR) { /* It is a directory */
sprintf(&path[i], "/%s", fn);
res = scan_files(path);
if (res != FR_OK) break;
path[i] = 0;
} else { /* It is a file. */
printf("%s/%s\n", path, fn);
}
}
}
return res;
}

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2018-4-30 19:29 | 只看该作者
在这个程序代码例程里面,程序读取 path 这个数据代表的目录下的所有文件名,并将
它们通过串口发送到电脑上面。

使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2018-4-30 19:30 | 只看该作者
在我们的例程里面,也使用了类似的程序,用来读取文件夹下所有的文件,
然后选出 BMP 文件,然后用来读取显示

使用特权

评论回复
9
aizaixiyuanqian|  楼主 | 2018-4-30 19:30 | 只看该作者
读取指定文件下所有文件的名字和后缀
uint8_t FATFS_ScanFiles(uint8_t *dir, FileNameTypeDef *file)
{
FRESULT res;
FILINFO fileInfo;
DIR dirs;
char *fn, i = 0;
#if _USE_LFN
static char lfn[_MAX_LFN + 1]; /* Buffer to store the LFN */
fileInfo.lfname = lfn;
fileInfo.lfsize = sizeof(lfn);
#endif
/* 打开文件夹 */
res = f_opendir(&dirs, (const TCHAR*)dir);
if (res == FR_OK) //成功打开文件夹
{
while (f_readdir(&dirs, &fileInfo) == FR_OK) //按照顺序读文件夹
{
if(!fileInfo.fname[0]) //如果文件名为 0,结束
{
break;
}

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2018-4-30 19:35 | 只看该作者
/* 判断文件属性 */
if((fileInfo.fattrib == AM_ARC)|(fileInfo.fattrib == AM_DIR))
{
#if _USE_LFN //为长字符串名准备
fn = *fileInfo.lfname ? fileInfo.lfname : fileInfo.fname;
#else
fn = fileInfo.fname;
#endif
/* 读取名字 */
i = 0;
while((*fn != '.') && (*fn != '\0')) //有一个成立就跳出循环
{
file->name[i] = *fn;
i++;
fn++;
}
file->name[i] = '\0';
/* 读取后缀 */
i = 0;
while(*fn != '\0')
{
file->type[i] = *fn;
i++;
fn++;
}
file->type[i] = '\0';
file++;
}//end of 文件属性判断呢
} //end of while (f_readdir(&dirs, &fileInfo) == FR_OK)//按照顺序读文件

}
return res;
}

使用特权

评论回复
11
aizaixiyuanqian|  楼主 | 2018-4-30 19:36 | 只看该作者
读取到文件名都放在输入参数 file 里面,而这个参数的格式
大家可能觉得糊涂,我们定义了一个结构体:
typedef struct
{
uint8_t type[6]; //后缀 6 个字节
uint8_t name[100];//路径和文件名字 100 个字节(支持 25 个汉字大小名
字)
} FileNameTypeDef;

使用特权

评论回复
12
aizaixiyuanqian|  楼主 | 2018-4-30 19:37 | 只看该作者
从上面定义,大家很容易看得出,这个结构体其实定义来保存一个文件的名
字和后缀名的。

使用特权

评论回复
13
aizaixiyuanqian|  楼主 | 2018-4-30 19:39 | 只看该作者
如何读取一个文件
我们可以使用 f_read()函数。在这里直接给大家提供一个例程,从例程中大
家应该很容易能够理解怎么读取一个文件。

使用特权

评论回复
14
aizaixiyuanqian|  楼主 | 2018-4-30 19:39 | 只看该作者
uint8_t FATFS_ReadFile(void)
{
FRESULT res;
FIL fsrc;
uint16_t a;
UINT br;
uint8_t buffer[512];
res = f_open(&fsrc, "图片/测试.txt", FA_READ);
if(res == FR_OK)
{
br=1;
a=0;
printf("文件内容:");
for (;;)
{
for(a=0; a<512; a++)
{
buffer[a] = 0;
}
res = f_read(&fsrc, buffer, sizeof(buffer), &br);//br 用来保存读取
到多少数据
printf("%s\r\n",buffer);
if (res || br == 0)
{
break; // error or eof
}
}
}
f_close(&fsrc); //不论是打开,还是新建文件,一定记得关闭
return 0;
}

使用特权

评论回复
15
aizaixiyuanqian|  楼主 | 2018-4-30 19:42 | 只看该作者
BMP  文件简介
BMP 文件格式,又称为 Bitmap(位图)或是 DIB(Device-Independent Device,
设备无关位图),是 Windows 系统中广泛使用的图像文件格式。由于它可以不作
任何变换地保存图像像素域的数据,因此成为我们取得 RAW 数据的重要来源。
Windows 的图形用户界面(graphical user interfaces)也在它的内建图像子系统
GDI 中对 BMP 格式提供了支持。

使用特权

评论回复
16
aizaixiyuanqian|  楼主 | 2018-4-30 19:43 | 只看该作者
BMP 图片格式在电脑上面的后缀名为:“.bmp”。它采用的是位映射的存储
格式,除了图像深度可选之外,不采用其他压缩方式。

使用特权

评论回复
17
aizaixiyuanqian|  楼主 | 2018-4-30 19:45 | 只看该作者
BMP 格式的图片一般由四个部分组成:

使用特权

评论回复
18
aizaixiyuanqian|  楼主 | 2018-4-30 19:49 | 只看该作者
这里要注意的是,BMP 格式图片存储方式是小端模式,也就是说比如:当
我们有两个字节的 bmp 信息为 0x0805,那么它在内存中存放的方式为:


使用特权

评论回复
19
aizaixiyuanqian|  楼主 | 2018-4-30 19:50 | 只看该作者
bmp 文件头(bmp file header):提供文件的格式、大小等信息。

使用特权

评论回复
20
aizaixiyuanqian|  楼主 | 2018-4-30 19:51 | 只看该作者
在这个文件头里面有一个信息对我们很有用,也就是最后一个 bfOffBits,这
个数据可以让我们读取 bmp 文件的时候,知道从什么时候开始是位图信息。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝