OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4152|回复: 8

关于外部flash存储图片并显示的问题,求大神指导!

[复制链接]

10

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-7-2
在线时间
20 小时
发表于 2016-6-16 10:34:33 | 显示全部楼层 |阅读模式
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&#206;&#187;&#209;&#213;é&#171;í&#188;
                                {
                                        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&#206;&#187;&#209;&#213;é&#171;í&#188;
                                {
                                        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&#187;&#182;áè&#161;  ALPHAí¨μà
                                                        break ;                             
                                        }       
                                }else if(color_byte==1)//
                                {
                                }
                                rgb++;          
                                count++ ;                  
                                if(rgb==color_byte) //
                                {       
                                        if(x<picinfo.ImgWidth)                                                                            
                                        {       
                                                realx=(x*picinfo.Div_Fac)>>13;//x&#214;áêμ&#188;ê&#214;μ
                                                if(is_element_ok(realx,realy,1)&&yok)//·&#251;o&#207;ì&#245;&#188;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&#214;á&#212;&#246;&#188;óò&#187;&#184;&#246;&#207;&#241;&#203;&#216;
                                        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&#216;±&#213;&#206;&#196;&#188;t
        }         
#if BMP_USE_MALLOC == 1        //ê1ó&#195;malloc       
        myfree(f_databuf);         
        myfree(ff_bmp);                 
#endif       
        return res;                //BMP&#207;&#212;ê&#190;&#189;áê&#248;.                                              
}               
[/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

可能情况太多。 不好说。 感觉是数据管理问题。
疾风追电,满月夜郎啸苍天,我辈少年狂!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11566
金钱
11566
注册时间
2014-4-1
在线时间
1319 小时
发表于 2016-6-16 10:34:34 | 显示全部楼层

可能情况太多。
不好说。
感觉是数据管理问题。

回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11566
金钱
11566
注册时间
2014-4-1
在线时间
1319 小时
发表于 2016-6-16 10:59:00 | 显示全部楼层

这问题比较难点。


回复

使用道具 举报

10

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-7-2
在线时间
20 小时
 楼主| 发表于 2016-6-16 11:02:09 | 显示全部楼层
xuande 发表于 2016-6-16 10:59
这问题比较难点。

搞了两天了,没搞明白!能读取,能显示,但是显示了一会才死机。
疾风追电,满月夜郎啸苍天,我辈少年狂!!
回复

使用道具 举报

10

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-7-2
在线时间
20 小时
 楼主| 发表于 2016-6-16 11:03:19 | 显示全部楼层
xuande 发表于 2016-6-16 10:59
这问题比较难点。

在主程序里,我是一直读取flash的数据然后显示的,不知道这么频繁的读取大数据会不会出现这样的情况啊?
疾风追电,满月夜郎啸苍天,我辈少年狂!!
回复

使用道具 举报

10

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-7-2
在线时间
20 小时
 楼主| 发表于 2016-6-16 11:16:04 | 显示全部楼层
xuande 发表于 2016-6-16 11:05
可能情况太多。
不好说。
感觉是数据管理问题。

我也有点怀疑是,但是不知道从哪优化····
疾风追电,满月夜郎啸苍天,我辈少年狂!!
回复

使用道具 举报

10

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-7-2
在线时间
20 小时
 楼主| 发表于 2016-6-16 13:55:30 | 显示全部楼层
回复

使用道具 举报

10

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-7-2
在线时间
20 小时
 楼主| 发表于 2016-6-16 14:19:37 | 显示全部楼层
xuande 发表于 2016-6-16 11:05
可能情况太多。
不好说。
感觉是数据管理问题。

问题解决了,是显示函数里的文件指针溢出了,在主函数了初始化就能可以了
疾风追电,满月夜郎啸苍天,我辈少年狂!!
回复

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
发表于 2016-6-28 17:51:11 | 显示全部楼层
羽落 发表于 2016-6-16 14:19
问题解决了,是显示函数里的文件指针溢出了,在主函数了初始化就能可以了

你好,请问具体是怎么解决的吗?我现在也是遇到这样的问题。但是不知是哪里的问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 14:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表