×
单片机 > 单片机程序设计 > 详情

SD卡Fatfs文件系统BMP文件读取显示

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

首先说下硬件平台是奋斗的stm32开发板,320*240的2.4寸TFT(有点小,)。

 


 

说下遇到的问题:

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

下面就是把代码贴出来,这个代码只是移植成功了,但是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) <> 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             {
                res = f_read(&fil , buffer , (bmp.pic_w_l)*3 , &br) ;
                for(tx=0;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(....

      


有什么错误或者不对的地方欢迎大家批评指正。  
关键字:SD卡  Fatfs文件系统  BMP文件  读取显示

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些