Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4471094
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-07-04 17:34:14

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语言:
    #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(....

          

    有什么错误或者不对的地方欢迎大家批评指正。  
    阅读(2499) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~