初级会员

- 积分
- 118
- 金钱
- 118
- 注册时间
- 2013-7-2
- 在线时间
- 20 小时
|
10金钱
我现在做一个图片从SD卡读取,然后存储到外部flash的实验,用了文件系统,写入和读取显示可以实现,但是显示了几秒钟就进入到HardFault_Handler这个死循环里。
还有一个问题,外部flash是存储数据用的,但是我每次要开机写入图片数据才能读取显示,如果没有开机写入图片的话,即使之前写过也读不到。求各位大神指点一二!![mw_shl_code=applescript,true]#include "bmp_flash.h"
#include "piclib.h"
#include "bmp.h"
#include "string.h"
#include "flash.h"
#include "lcd.h"
u8 bmp_to_flash(const u8 *filename,u32 Write_Addr)////这个是把bmp文件写入外部flash的函数
{
FIL* f_bmp;
u16 br;
//u8 color_byte;
//u16 y;
//u16 countpix=0;//¼Ç¼ÏñËØ
//x,yμÄêμ¼ê×ø±ê
//u16 realx=0;
//u16 realy=0;
//u8 yok=1;
u8 res;
u32 WriteAddr;
u8 *databuf; /
u16 readlen=BMP_DBUF_SIZE;//
u8 *bmpbuf; //
//u8 biCompression=0; //
//u16 rowlen; //
//BITMAPINFO *pbmp; //
#if BMP_USE_MALLOC == 1 //
databuf=(u8*)mymalloc(readlen); /
if(databuf==NULL)return PIC_MEM_ERR; //.
f_bmp=(FIL *)mymalloc(sizeof(FIL)); /
if(f_bmp==NULL) /
{
myfree(databuf);
return PIC_MEM_ERR;
}
#else //
databuf=bmpreadbuf;
f_bmp=&f_bfile;
#endif
WriteAddr=Write_Addr;
res=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//
if(res==0)//
{
f_read(f_bmp,databuf,readlen,(UINT*)&br); //
bmpbuf=databuf;
SPI_Flash_Write(bmpbuf,WriteAddr,readlen);
WriteAddr=WriteAddr+readlen;
while(1)
{
res=f_read(f_bmp,databuf,readlen,(UINT *)&br);//
if(br!=readlen)readlen=br; //
if(res||br==0)break;
bmpbuf=databuf;
SPI_Flash_Write(bmpbuf,WriteAddr,readlen);
WriteAddr=WriteAddr+br;
//count=0;
}
f_close(f_bmp);//1رÕÎļt
}
#if BMP_USE_MALLOC == 1 //ê1óÃmalloc
myfree(databuf);
myfree(f_bmp);
#endif
return res; //BMPÏÔê¾½áêø.
}
u8 flash_to_bmp(u32 Read_Addr) ////这个是从外部flash读取图片数据的程序
{
FIL* ff_bmp;
u16 br;
u16 count;
u8 rgb ,color_byte;
u32 bmp_flag=0;
u16 x ,y,color;
u16 countpix=0;//
//x,yμÄêμ¼ê×ø±ê
u16 realx=0;
u16 realy=0;
u8 yok=1;
u8 res=0;
u32 ReadAddr;
u8 *f_databuf; //
u16 readlen=BMP_DBUF_SIZE;//
u8 *bmpbuf; //
u8 biCompression=0; //
u16 rowlen; //
BITMAPINFO *pbmp; //
#if BMP_USE_MALLOC == 1 //
f_databuf=(u8*)mymalloc(readlen); //
if(f_databuf==NULL)return PIC_MEM_ERR; //
ff_bmp=(FIL *)mymalloc(sizeof(FIL));
if(ff_bmp==NULL)
{
myfree(f_databuf);
return PIC_MEM_ERR;
}
#else //
f_databuf=bmpreadbuf;
ff_bmp=&f_bfile;
#endif
ReadAddr=Read_Addr;
//res=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//′ò¿aÎļt
if(res==0)//′ò¿a3é1|.
{
//f_read(f_bmp,databuf,readlen,(UINT*)&br); //¶á3öreadlen¸ö×Ö½ú
SPI_Flash_Read(f_databuf,ReadAddr,readlen); //读取图片数据ReadAddr=ReadAddr+readlen;
pbmp=(BITMAPINFO*)f_databuf;
count=pbmp->bmfHeader.bfOffBits; //êy¾YÆ«òÆ,μÃμ½êy¾Y¶ÎμÄ¿aê¼μØÖ·
color_byte=pbmp->bmiHeader.biBitCount/8; //2êé«Î» 16/24/32
biCompression=pbmp->bmiHeader.biCompression;//Ñ1Ëõ·½ê½
picinfo.ImgHeight=pbmp->bmiHeader.biHeight; //μÃμ½í¼Æ¬¸ß¶è
picinfo.ImgWidth=pbmp->bmiHeader.biWidth; //μÃμ½í¼Æ¬¿í¶è
ai_draw_init();//
if((picinfo.ImgWidth*color_byte)%4)rowlen=((picinfo.ImgWidth*color_byte)/4+1)*4;
else rowlen=picinfo.ImgWidth*color_byte;
//¿aê¼½aÂëBMP
color=0;//ÑÕé«Çå¿Õ
x=0 ;
y=picinfo.ImgHeight;
rgb=0;
realy=(y*picinfo.Div_Fac)>>13;
bmpbuf=f_databuf;
//SPI_Flash_Write(bmpbuf,WriteAddr,readlen);
while(1)
{
while(count<readlen) //
{
if(color_byte==3) //24λÑÕé«í¼
{
switch (rgb)
{
case 0:
color=bmpbuf[count]>>3; //B
break ;
case 1:
color+=((u16)bmpbuf[count]<<3)&0X07E0;//G
break;
case 2 :
color+=((u16)bmpbuf[count]<<8)&0XF800;//R
break ;
}
}else if(color_byte==2) /
{
switch(rgb)
{
case 0 :
if(biCompression==BI_RGB)//RGB:5,5,5
{
color=((u16)bmpbuf[count]&0X1F); //R
color+=(((u16)bmpbuf[count])&0XE0)<<1; //G
}else //RGB:5,6,5
{
color=bmpbuf[count]; //G,B
}
break ;
case 1 :
if(biCompression==BI_RGB)//RGB:5,5,5
{
color+=(u16)bmpbuf[count]<<9; //R,G
}else //RGB:5,6,5
{
color+=(u16)bmpbuf[count]<<8; //R,G
}
break ;
}
}else if(color_byte==4)//32λÑÕé«í¼
{
switch (rgb)
{
case 0:
color=bmpbuf[count]>>3; //B
break ;
case 1:
color+=((u16)bmpbuf[count]<<3)&0X07E0;//G
break;
case 2 :
color+=((u16)bmpbuf[count]<<8)&0XF800;//R
break ;
case 3 :
//alphabend=bmpbuf[count];//2»¶áè¡ ALPHAí¨μà
break ;
}
}else if(color_byte==1)//
{
}
rgb++;
count++ ;
if(rgb==color_byte) //
{
if(x<picinfo.ImgWidth)
{
realx=(x*picinfo.Div_Fac)>>13;//xÖáêμ¼êÖμ
if(is_element_ok(realx,realy,1)&&yok)//·ûoÏìõ¼t
{
pic_phy.draw_point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF-1,color);
//POINT_COLOR=color;
//LCD_DrawPoint(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF);
//SRAMLCD.Draw_Point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF,color);
}
}
x++;//xÖáÔö¼óò»¸öÏñËØ
color=0x00;
rgb=0;
}
countpix++;//
if(countpix>=rowlen)//
{
y--;
if(y==0)break;
realy=(y*picinfo.Div_Fac)>>13;//
if(is_element_ok(realx,realy,0))yok=1;//
else yok=0;
x=0;
countpix=0;
color=0x00;
rgb=0;
}
bmp_flag++;
}
//res=f_read(f_bmp,databuf,readlen,(UINT *)&br);
SPI_Flash_Read(f_databuf,ReadAddr,readlen);
if(br!=readlen)readlen=br;
if(res||br==0||bmp_flag>=(picinfo.ImgHeight*picinfo.ImgWidth*color_byte-1))break;
//if(res||br==0||bmp_flag>=4700)break;
bmpbuf=f_databuf;
ReadAddr=ReadAddr+readlen;
count=0;
}
f_close(ff_bmp);//1رÕÎļt
}
#if BMP_USE_MALLOC == 1 //ê1óÃmalloc
myfree(f_databuf);
myfree(ff_bmp);
#endif
return res; //BMPÏÔê¾½áêø.
}
[/mw_shl_code]
|
|