OpenEdv-开源电子网

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

显示图片dir目录只能使用指针吗以及文件系统指定管理内存

[复制链接]

40

主题

137

帖子

0

精华

高级会员

Rank: 4

积分
579
金钱
579
注册时间
2019-8-4
在线时间
187 小时
发表于 2020-1-11 12:32:15 | 显示全部楼层 |阅读模式
15金钱
本帖最后由 taomao 于 2020-1-11 15:04 编辑

//DIR*picdirge
while(res==FR_OK)//打开成功
        {        
                dir_sdi(&picdir,picindextbl[curindex]); //这样子不行
//问题1: 为什么改为picdirge (声明的一个结构体指针)才可以,使用结构体在程序调试的时候就发现picfileinfo.lfname为空,并未存储长文件名,不知为何,大神能指明可能的原因吗,比较懵逼
        res=f_readdir(&picdir,&picfileinfo);                       //读取目录下的一个文件
        if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出
//问题2:这个不是循环播放图片吗,怎么可能退出这个循环,所以打开文件正常的情况下,后面的释放变量内存永远都不会执行吧

             fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                        
                strcpy((char*)pname,"0:/PICTURE/");                                //复制路径(目录)
                strcat((char*)pname,(const char*)fn);                          //将文件名接在后面
                 LCD_Clear(BLACK);
                 ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片   
                Show_Str(2,2,240,16,pname,16,1);                                 //显示图片名字
                t=0;
                while(1)
                {
                        key=KEY_Scan(0);                //扫描按键
                        if(t>250)key=1;                        //模拟一次按下KEY0   
                        if((t%20)==0)LED0=!LED0;//LED0闪烁,提示程序正在运行.
                        if(key==KEY1_PRES)                //上一张
                        {
                                if(curindex)curindex--;
                                else curindex=totpicnum-1;
                                break;
                        }else if(key==KEY0_PRES)//下一张
                        {
                                curindex++;                           
                                if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始
                                break;
                        }else if(key==WKUP_PRES)
                        {
                                pause=!pause;
                                LED1=!pause;         //暂停的时候LED1亮.  
                        }
                        if(pause==0)t++;
                        delay_ms(10);
                }                                            
                res=0;  
        }                                                                                          
        myfree(SRAMIN,picfileinfo.lfname);        //释放内存                           
        myfree(SRAMIN,pname);                                //释放内存                           
        myfree(SRAMIN,picindextbl);                        //释放内存               
}问题4   文件系统如何指定管理内存的大小,比如说例程说文件系统管理W25QXX前面12M的空间,但我想改为10M,因为我发现使用文件系统管理,W25QXX_Read这个函数就不起作用了,望知道的大神贴出代码告知在哪里设置问题5   
minibmp_decode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u16 acolor,u8 mode)aclor这个参数不是用来混合改变原图片的颜色吗,
tmp_color=piclib_alpha_blend(tmp_color,acolor,mode&0X1F);
问题6 用串口调试新建文件显示返回值为0x11,我查了是LFN工作缓冲区不能分配,这个怎么解决
问题7 在底层diskio.c添加了例程RTC.C例程,并且按格式返回时间,怎么还不能显示文件创建时间信息,还有RTC为什么掉电很长时间,比如说1个小时,时间又会重新计数(短时间不会),
DWORD get_fattime (void)
{                                 
        u32 time;
        time=(u32)(calendar.w_year-1987)<<25;
        time+=(u32)calendar.w_month<<21;
        time+=(u32)calendar.w_date<<16;
        time+=(u32)calendar.hour<<11;
        time+=(u32)calendar.min<<5;
        time+=calendar.sec/2;
        return time;
}                          
还有一个问题,原子哥,需不需要加f_closdir()这一句;







下面是自己的bmp.c文件,自己看懂例程后删掉例程再自己一步一步写的,有些许改动
u8 stdbmp_decode(const u8 *filename)
{
        FIL *ftemp;
        BITMAPINFO* bmp1;
        u8 res,*data,rgb=0,bit,bicompression,flag;
        UINT br;
        u16 color=0,xsize,x0=0,realy,y0,count=0,readlen=BMP_DBUF_SIZE,x=0,skip;
        u32 off;
        
        data=mymalloc(SRAMIN,BMP_DBUF_SIZE);
        ftemp=mymalloc(SRAMIN,sizeof(FIL));
        bmp1=mymalloc(SRAMIN,sizeof(BITMAPINFO));
        if(data==NULL||ftemp==NULL||bmp1==NULL) return 20;
        
        
        res=f_open(ftemp,(TCHAR*)filename,0x01);
        res=f_read(ftemp,data,BMP_DBUF_SIZE,(UINT*)&br);
        if(res!=0) return res;
        bmp1=(BITMAPINFO*)data;//没有分配空间
        picinfo.ImgHeight=bmp1->bmiHeader.biHeight;
        
        
        
        picinfo.ImgWidth=bmp1->bmiHeader.biWidth;
        bit=bmp1->bmiHeader.biBitCount;
        bicompression=bmp1->bmiHeader.biCompression;
        off=bmp1->bmfHeader.bfOffBits;
        xsize=((bit/8*picinfo.ImgWidth)%4)?(((bit/8*picinfo.ImgWidth)/4+1)*4)bit/8*picinfo.ImgWidth);
        ai_draw_init();
        
        y0=picinfo.ImgHeight;
        realy=(y0*picinfo.Div_Fac)>>13;
        
        while(1)
        {
                while(off<readlen)
                {
                        //while(count<xsize)
                        if(bit==8) return 21;
                        if(bit==16)
                        {
                                switch(rgb)
                                {
                                        case 0:
                                        {
                                                if(bicompression==BI_RGB)
                                                {
                                                        color=data[off]&0x1f;
                                                        color+=(u16)(data[off]&0xe0)<<1;
                                                }
                                                else color=data[off];
                                                break;
                                        }
                                        case 1:
                                                if(bicompression==BI_RGB) color+=(u16)data[off]<<9;
                                                else color+=(u16)data[off]<<8;
                                                break;
                                }
                        }
                        if(bit==24)
                        {
                                switch(rgb)
                                {
                                        case 0: color=data[off]>>3;break;
                                        case 1: color+=((u16)data[off]&0xfc)<<3;break;
                                        case 2: color+=((u16)data[off]&0xf8)<<8;break;
                                }
                        }
                        if(bit==32)
                        {
                                switch(rgb)
                                {
                                        case 0: color=data[off]>>3;break;
                                        case 1: color+=((u16)data[off]&0xfc)<<3;break;
                                        case 2: color+=((u16)data[off]&0xf8)<<8;break;
                                        case 3: break;
                                }
                        }
                        off++;
                        rgb++;
                        count++;
                        if(rgb==bit/8)
                        {
                                x0++;
                                rgb=0;
                                x=(x0*picinfo.Div_Fac)>>13;
                                flag=is_element_ok(x,realy,1);
                                if(flag) LCD_DrawPoint(picinfo.S_XOFF+x,realy+picinfo.S_YOFF-1,color);
                                color=0;
                        }
                        if(count==xsize)
                        {
                                if(y0==0) break;
                                y0--;
                                realy=(y0*picinfo.Div_Fac)>>13;
                                flag=is_element_ok(x,realy,0);
                                while(!flag) //此处改动,当图像在竖直方向缩小时,不必再执行上面代码,直接跳过数组里面的像素
                                {
                                        off+=xsize;
                                        y0--;
                                        realy=(y0*picinfo.Div_Fac)>>13;
                                        flag=is_element_ok(x,realy,0);
                                }
                                x0=0;
                                count=0;
                        }
                }
                if(off>BMP_DBUF_SIZE) //万一跳过的像素超出2K,文件指针偏移
                {
                        skip=off-BMP_DBUF_SIZE;
                        f_lseek(ftemp,f_tell(ftemp)+skip);
                }
                off=0;
                res=f_read(ftemp,data,readlen,(UINT*)&br);
                if(res||br==0) break;
                if(BMP_DBUF_SIZE!=br) readlen=br;
        }
         myfree(SRAMIN,data);
         myfree(SRAMIN,ftemp);
         myfree(SRAMIN,bmp1);
         f_close(ftemp);
         return res;
}





最佳答案

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

1,因为dir_sdi函数要求 2,break以后,在外部函数可以继续进来的。这里是检测到了结束。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-1-11 12:32:16 | 显示全部楼层
1,因为dir_sdi函数要求
2,break以后,在外部函数可以继续进来的。这里是检测到了结束。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

40

主题

137

帖子

0

精华

高级会员

Rank: 4

积分
579
金钱
579
注册时间
2019-8-4
在线时间
187 小时
 楼主| 发表于 2020-1-13 17:48:09 | 显示全部楼层
我说,版主,还有一些问题没有答完之前,能缓个几天在设置最佳答案吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 17:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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