调试了一段时间才调试经过,代码是移植他人的。这段代码在网上许多,现在测验经过了,可是有几个小问题要注意。
首要说下硬件渠道是斗争的stm32开发板,320*240的2.4寸TFT(有点小,)。
说下遇到的问题:
- startup_stm32f10x_hd.s 文件里再次修正仓库巨细,前次调试SD卡的时分就现已调整了,这次再次调整,见下图。可是仍是有个问题,板子上啊的stm32f103vet6 是512K的ram。按理说仓库能够调整到“Stack_Size EQU 0x00080000 ”可是却只能调整到0x0000F0F0这个方位,我们有谁知道的能够告诉我。
- 在操作SD卡的时分,读取到BMP文件的内容要先释放到一个数组空间里,这个空间巨细要设定好,不然会出莫名美妙的问题。
- BMP图片的文件名不能太长,不然无法读取,这个应该是Fatfs的问题,没有详细测验是几个,可是不能超过10个英文字母(包含10个)。
- 显现的格局要完成调整好,像我这块屏是320*240的,事先用画图进行修正好,他们的尺度值要是8的倍数,不然读取时会犯错。下面是修正的办法,(估量我们都会,便是怕自己忘记了),见下图。
下面便是把代码贴出来,这个代码仅仅移植成功了,可是BMP文件的格局没有去详尽了解,中心一部分代码没有去深化的探究其原因。
/*==================================================================
用到的变量及宏界说
==================================================================*/
BMP_HEADbmp;//图片文件头
BMP_POINTpoint;
/*==================================================================
* Function : RGB888ToRGB565
* Description : 把24位图变成16位图
* Input Para : unsigned char r , unsigned char g , unsigned char b
* Output Para : void
* Return Value: 色彩值
==================================================================*/
u32RGB888ToRGB565(unsignedcharr,unsignedcharg,unsignedcharb)
{
return(u32) (r&0xF8)<<8| (g&0xFC)<<3| (b&0xF8)>>3;
}
/*==================================================================
* Function : DrawPixel
* Description : 画点函数,在TFT的某一点上画一个色彩点
* Input Para : unsigned int x , unsigned int y , int Color ===》 x坐标,y坐标,色彩值
* Output Para : void
* Return Value: void
==================================================================*/
voidDrawPixel(unsignedintx,unsignedinty,intColor)
{
LCD_SetGramPoint(x,y);
LCD_WR_Data(Color);
}
/*==================================================================
* Function : Show_BMP
* Description : 显现BMP格局的文件,分为图片和图标,图片尺度是240*320是彻底显现,图标只显现内容,其他白色的部分保持本来的色彩
* Input Para : unsigned char type , unsigned int point_x , unsigned int point_y , char *path
===》 显现的类型:PCITURE图片,ICON图标 ,x轴起始点 ,y轴起始点 ,图片在SD卡里的途径
* Output Para : void
* Return Value: void
==================================================================*/
voidShow_BMP(unsignedchartype,unsignedintpoint_x,unsignedintpoint_y,char*path)
{
FATFSfs;// 磁盘挂载点
FILfil;// 文件打开点
FRESULTres;// 返回值类型结构体
//unsigned char buffer[4096*4]; // file copy buffer
unsignedcharbuffer[50000];// 这个数组和仓库空间巨细直接相关
unsignedintbr;// File R/W count
unsignedlongtx,ty,r_data,g_data,b_data;
disk_initialize(0);// 初始化磁盘
res=f_mount(0,&fs);// 挂载设备
while(1)
{
res=f_open(&fil,path,FA_OPEN_EXISTING|FA_READ);// 读取图标途径
res=f_read(&fil,&bmp,sizeof(bmp),&br);// 读取文件
if((bmp.pic_head[0]==B)&&(bmp.pic_head[1]==M))// 判别是不是BMP文件
{
res=f_lseek(&fil,((bmp.pic_data_address_h<<16)|bmp.pic_data_address_l));// 采用了Windows的BMP格局,BMP原点在左下角
for(ty=0;ty
res=f_read(&fil,buffer,(bmp.pic_w_l)*3,&br) ;
for(tx=0;tx
r_data=*(tx*3+2+buffer);
g_data=*(tx*3+1+buffer);
b_data=*(tx*3+0+buffer);
if(tx<240)
{
point.x=tx;
point.y=bmp.pic_h_l-1-ty;
point.r=r_data;
point.g=g_data;
point.b=b_data;
if(type==PICTURE)// 假如显现的是图片的话,白色部分照旧显现
{
DrawPixel(point.x+point_x,point.y+point_y,RGB888ToRGB565(point.r,point.g,point.b));
}
elseif(type==ICON)// 假如显现的是图标的话,白色部分不显现
{// 以下代码依据 DrawPixel() 函数更改添加
LCD_SetGramPoint(point.x+point_x,point.y+point_y);// 设定x轴,y轴的坐标
if(RGB888ToRGB565(point.r,point.g,point.b)==0xFFFF)// 判别是不是白色部分
{
LCD_WR_Data(ili9320_BGR2RGB(LCD_RD_data()) );// 假如是白色就读取当时色彩值并显现
}
else
{
LCD_WR_Data(RGB888ToRGB565(point.r,point.g,point.b) );// 假如不是白色就显现%&&&&&%ON的色彩
}
}
}
}
}
f_close(&fil);// 封闭文件
f_mount(0,NULL);// 卸载设备
break;// 跳出while(1)
}// End of if((bmp.pic_head….
}// End of while(1)….
}// End of void Show_BMP(….
有什么过错或许不对的当地欢迎我们批评指正。