免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1338 | 回复: 0
打印 上一主题 下一主题

SD卡Fatfs文件系统BMP文件读取显示 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览
http://blog.163.com/wanghengzhi@126/blog/static/168853652201158114745198/

调试了一段时间才调试通过,代码是移植别人的。这段代码在网上很多,现在测试通过了,但是有几个小问题要注意。

首先说下硬件平台是奋斗的stm32开发板,320*240的2.4寸TFT(有点小,SD卡Fatfs文件系统BMP文件读取显示 - 豆子 - 代码豆子)。

说下遇到的问题:

  1. startup_stm32f10x_hd.s 文件里再次修改堆栈大小,上次调试SD卡的时候就已经调整了,这次再次调整,见下图。但是还是有个问题,板子上啊的stm32f103vet6 是512K的ram。按理说堆栈可以调整到 “Stack_Size      EQU      0x00080000 ”   但是却只能调整到0x0000F0F0这个位置,大家有谁知道的可以告诉我。
    SD卡Fatfs文件系统BMP文件读取显示 - 豆子 - 代码豆子 
  • 在操作SD卡的时候,读取到BMP文件的内容要先释放到一个数组空间里,这个空间大小要设定好,否则会出莫名奇妙的问题。
  • BMP图片的文件名不能太长,否则无法读取,这个应该是Fatfs的问题,没有具体测试是几个,但是不能超过10个英文字母(包括10个)。
  • 显示的格式要实现调整好,像我这块屏是320*240的,事先用画图进行修改好,他们的尺寸值要是8的倍数,否则读取时会出错。下面是修改的方法,(估计大家都会,就是怕自己忘记了SD卡Fatfs文件系统BMP文件读取显示 - 豆子 - 代码豆子),见下图。
    SD卡Fatfs文件系统BMP文件读取显示 - 豆子 - 代码豆子
     
  • 下面就是把代码贴出来,这个代码只是移植成功了,但是BMP文件的格式没有去细致了解,中间一部分代码没有去深入的探究其原因。

    C语言: Codee#20097
    #include "TFCard_BMP.h"
    /*==================================================================
                            用到的变量及宏定义
    ==================================================================*/
    BMP_HEAD  bmp;   //图片文件头
    BMP_POINT point;

    /*==================================================================
    * Function    : RGB888ToRGB565
    * Description    : 把24位图变成16位图
    * Input Para    : unsigned char r , unsigned char g , unsigned char b
    * Output Para    : void
    * Return Value: 颜色值
    ==================================================================*/
    u32 RGB888ToRGB565(unsigned char r , unsigned char g , unsigned char b)
    {
        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
    ==================================================================*/
    void DrawPixel(unsigned int x , unsigned int y , int Color)
    {
        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
    ==================================================================*/
    void Show_BMP( unsigned char type , unsigned int point_x , unsigned int point_y , char *path )
    {
        FATFS fs;            // 磁盘挂载点
        FIL  fil;           // 文件打开点         
        FRESULT res;        // 返回值类型结构体

        //unsigned char buffer[4096*4];  // file copy buffer
        unsigned char buffer[50000];     // 这个数组和堆栈空间大小直接相关

        unsigned int  br;                // File R/W count
        unsigned long tx,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<bmp.pic_h_l;ty++)
                {
                    res = f_read(&fil , buffer , (bmp.pic_w_l)*3 , &br) ;
                    for(tx=0;tx<bmp.pic_w_l;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));
                            }
                            else if(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) );    // 如果不是白色就显示ICON的颜色
                                }
                           
                            }
                           
                        }
                    }
                }
                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(....

          

    有什么错误或者不对的地方欢迎大家批评指正。  
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP