相较于直接在W25Q16上存储图片数据来实现图片显示,在FLASH上构建FATFS系统,然后以文件的方式来再现图片内容会更易于管理。 要在FLASH的FATFS系统上实现图片显示的主要步骤为: 1. 完成相关设备的初始化 2. 对W25Q16进行整体擦除 3. 文件系统格式化 4. 将数组中图片数据转存到文件内 5. 读取图片文件实现图片再现 6. 若将多幅图片存入文件,则需跳过前3步来多次执行第4步。 7. 若显示多幅图片,则需跳过前3步多次执行第5步。 在最初的探索时,先是以字节数据进行了测试,其运行效果如下: 图1 字节数据读写 有了这个测试结果后,在文件系统上生成与读写位图文件基本就有保障了,剩下的问题就是存储空间问题了,以为在没有其他存储方式的辅助下,只能靠在程序中开辟的数值来暂存图片数据,且所占的空间还比较大,一般ARM芯片就这样的一幅图片就会消耗掉它的所有存储空间,况为在W25Q16上构建FATFS系统,也要消耗掉很大的程序空间呢! 也是又以160*80像素点的图片进行了测试,即把数值中的数据创建成一个位图文件,然后再读取该位图文件来再现图片内容,其结果如图2和图3所示. 图2 整体构成
图3 显示效果 接下来的测试就是建立在FLASH上FATFS系统能保存位图文件吗? 第一次测试的结果是失败的,后经分析才发现,尽管第一次已经生成了位图文件,但在第二次运行时由于没有屏蔽掉对W25Q16擦除操作,所以一开始就将上一次的劳动成果全清除了,那还有任何文件可以读取呀! 经修改,将擦除操作和生成位图文件的过程屏蔽后,果然能读取文件系统的位图文件来再现图片了。 有了前面测试成果,我们就可以分次来存储多个位图文件了,并在其后就可以一次由文件系统读取多个位图文件以显示多个图片内容了。 实现数据生成位图文件的程序为: res_flash = f_open(&fnew, "0:TP1.bmp",FA_CREATE_ALWAYS | FA_WRITE );
if ( res_flash == FR_OK )
{
printf(">打开/创建CH32V103x.txt文件成功,向文件写入数据。\r\n");
// 将指定存储区内容写入到文件内
for(j=0;j<25;j++)
{
for(i=0;i<1024;i++)
{
ReadBuffer[i]= gImage_v[j*1024+i];
}
res_flash=f_write(&fnew,ReadBuffer,1024,&fnum);
}
if(res_flash==FR_OK)
{
printf(">文件写入成功,写入字节数据:%d\r\n",fnum);
}
else
{
printf("!!文件写入失败:(%d)\n",res_flash);
}
// 不再读写,关闭文件
f_close(&fnew);
}
else
{
printf("!!打开/创建文件失败。\r\n");
}
读取位图文件再现图片内容的程序为: OLED_Init();
Delay_Ms(200);
LCD_Address_Set(0,0,159,79);
res_flash = f_open(&fnew, "0:TP2.bmp",FA_OPEN_EXISTING | FA_READ);
if(res_flash == FR_OK)
{
printf(">打开文件成功。\r\n");
for(j=0;j<25;j++)
{
res_flash = f_read(&fnew, ReadBuffer, sizeof(ReadBuffer), &fnum);
for(i=0;i<512;i++)
{
LCD_WR_DATA8(ReadBuffer[i*2]);
LCD_WR_DATA8(ReadBuffer[i*2+1]);
}
}
if(res_flash==FR_OK)
{
printf(">文件读取成功,读到字节数据:%d\r\n",fnum);
}
else
{
printf("!!文件读取失败:(%d)\n",res_flash);
}
}
else
{
printf("!!打开文件失败。\r\n");
}
/* 不再读写,关闭文件 */
f_close(&fnew);
当然在FLASH上的FATFS系统较之在SD卡上的的FATFS系统在使用的方便性上还是要略逊一筹的,但却是迈向该目标的有效积累,后面载时间允许的情况下,争取解决在SD卡的FATFS系统上实现位图文件的再现问题。
|