读取SD卡bin文件显示图片
Coding
环境搭建:
- 硬件平台:STM32H750XBH6
- 开发环境:STM32CubeMX V6.8.1+KEIL V5.28.0.0
- STM32H750固件版本:package V1.11.0
- 仿真下载驱动:ST-Link
前言:STM32H750XBH6 的flash只有128K,存储图片数组显然是不够的,使用sd卡存储图片的二进制bin文件,读取文件并显示在lcd上,这里不使用硬解码图片,还没有学习到,另外读取sd卡的bin文件还可以做一个简易bootloader,直接sd卡启动是吧,学习这部分还是有必要的
以下分为两个部分进行,
初步实现 :读取sd卡bin文件保存在一个buffer,buffer刷写到LCD上
这里还是使用了flash,过大的bin文件,buffer无法全部放下,先使用一个小图片制作bin文件,能够显示在lcd上成功一大半了
最终实现 :一行行刷写在LCD上,buffer仅需要一行显示像素大小 作为缓冲
800*480 16位色的屏幕,一帧显示需要750K 使用这么大的缓冲区不现实,我的flash才128k
这里仅使用一行buffer作为缓冲,一行行刷,比如我的屏幕800*480 16位色, 刷一行的buffer需要 1600字节,使用到的flash 只占用1k到2k 大小
图片bin文件制作
我们还可以生成一个.h文件做对比,查看我们生成的bin文件是否对应
查看看.h文件生成的数组
查看bin文件
我们使用16进制文件查看,上面的数组保存的是十六进制格式
可以看到是与之一一对应的
将该bin文件放入sd卡中
我这里是放在picture/pic.bin
读取bin文件验证是否正确读取
查看串口数据
13*16+6=214 (验证正确)
刷写到LCD上
成功显示这里就不贴图了
最终实现 :一行行刷写在LCD上
制作800*480 16位的bin文件
一行行刷写
#define BUFFER_SIZE 1600 //800*2
#define TOTAL_READ 768000 //800*480*2
void sd_picture_on_lcd_unit(void)
{
lcd_clear(WHITE);
lcd_init();
g_point_color=RED; /*画笔颜色*/
lcd_display_dir(1); //屏幕显示方向:0竖屏,1横屏
lcd_clear(WHITE);
mount_sd();/*挂载sd卡*/
uint8_t buffer[BUFFER_SIZE];
uint32_t totalBytesRead = 0;
for (int i = 0; i <= (TOTAL_READ / BUFFER_SIZE); i++) {
uint32_t bytesReadThisTime = readFileContent("picture/pic01.bin", buffer, BUFFER_SIZE+1, totalBytesRead);
if (bytesReadThisTime != 1) { // 如果readFileContent返回1,则表示有错误
totalBytesRead += (bytesReadThisTime);
} else {
// 错误处理
break;
}
LCD_DrawBitmap(0, i, 800, 1, (uint16_t*)buffer);
}
}
刷写得到图片如下所示
我这就纳闷了,为什么会是这样的,前面部分颜色完全不对,还有哪里来的紫色,我开始考虑是不是某部分数据丢失,多次复位依然是这样的,我把重点转向写的程序,改过去改过来还是没用
换一张图片试试??
原图如下
刷写上如下
这时候想到了问题所在,这里的汉字以及下面的一些图标都没有问题,问题出现在了颜色上,应该是24位图转16位图出现了问题
我使用win自带的画图软件将原图24转为16位的(转换结果如下)
原来如此,这NM跟原图差这么多,刷写在LCD上的颜色与下面不同应该是软件位图转换算法不一致
既然这样,那我找找16位图吧,实在找不到了,用一个比较简约的24位转16做替代吧
刷写显示如下
还是能看的(有部分不一致为软件算法导致,可忽略,还是24位真彩显示好啊)