STM32也要bad apple-TFT彩屏版
很久之前就在B站上看到各种屏幕放bad apple,所谓“有屏幕的地方就有bad apple”。前端时间刚好一直在学stm32,所以便打算自己用自己手上这块野火stm32f103开发板、以及TFT液晶屏来放bad apple。之前做项目时一直在参考CSDN上各种大佬写的文章,受益匪浅。但是关于用TFT彩屏来放bad apple找的到很少,所以在完成后,打算自己写一篇博客来记录下。
一、 大体思路
前面在b站上看各种大佬的作品,大致懂了思路。stm32f103处理速度毕竟有限,所以要想提高刷屏速度,最好让stm32直接读bin文件的图片,这样省去解码bmp图片的过程,才会大大提高刷屏速度。所以先把bad apple图片转成bin文件,然后存在sd卡中,然后用FAT文件系统去读sd卡,然后把像素点写进液晶屏中。
二、准备材料
stm32f103开发板、3.2寸TFT彩屏、sd卡
二、详细步骤
1.把图片转为bin文件
我在CSDN上下了一套bad apple的图片让后用Img2lcd直接批量转化就行了,如下图
注意:
(1)输出灰度选16位真彩色,因为TFT液晶读的RGB565。
(2)包含图像头数据钩去掉。
由于Img2Lcd批量转化是得到一个个的bin文件,开始我试着一个个地读bin文件发现开始刷屏速度还行,但是到几千张地时候i速度越来越慢,所以建议把所有的bin文件合成一个来读。这里我用来CMD命令来合并bin文件。
首先我们把所有bin文件放到D盘data文件夹里
第一步,D:加 enter键,显示D:\
第二步,cd(空格) D:\data 加enter键,显示D:\data>
第三步,type(空格) *.bin>res 加enter键
2.初始化IO口和TFT液晶屏
这里直接用野火的源码就行了,就不废话了。
3.移植文件系统
这里野火视频里讲的也很详细,也不多说了,注意也不把支持中文的C936头文件包含进来,因为用不到,更重要的是影响刷屏速度。
4.读SD卡中的bin文件,液晶显示
这里直接上代码的,关键在于指针操作
```c
BYTE pColorData[51200]; //定义一个数据缓冲区
FIL binfsrc;
FATFS binfs[1];
FRESULT binpres;
void Lcd_show_bin(unsigned char *pic_name)
{
int i,j,k;
unsigned char tmp_name[20];
WORD data;
BYTE * pdata = pColorData;
BYTE * tmp_pdata;
unsigned int read_num;
sprintf((char*)tmp_name,"0:%s",pic_name);
f_mount(&binfs[0],"0:",1);
binpres = f_open( &binfsrc , (char *)tmp_name, FA_OPEN_EXISTING | FA_READ);
for(k=0;k<5356;k++) //一共5356张图片
{
for(j=0;j<3;j++) //一张图片有2*240*320字节数据,所以分三次读 3*51200
{
tmp_pdata = NULL;
f_lseek (&binfsrc,(51200*j+k*300*512));
f_read(&binfsrc,pdata,51200,&read_num);
tmp_pdata = pdata;
for(i=0;i<25600;i++) //每个像素点两个字节,即一个字
{
data = LD_WORD(tmp_pdata); //逐字读
ILI9341_Write_Data(data);
tmp_pdata = tmp_pdata + 2;
}
}
}
f_close(&binfsrc);
}
然后再来看主函数
unsigned char name[9]={"/new.bin"}; //文件名
int main(void)
{
ILI9341_Init (); //LCD初始化
ILI9341_GramScan(3);
ILI9341_OpenWindow ( 0,0,320,240 );
ILI9341_Write_Cmd ( CMD_SetPixel );
Lcd_show_bin(name);
}
```c
这样我们就能看到TFT彩屏上放起来bad apple 的动画了,大概能达到20FPS,我没有试着用寄存器开发,感觉用寄存器开发可能速度会跟快些。
代码传送门:
https://download.csdn.net/download/weixin_43789065/11989531