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

发布者:自由梦想最新更新时间:2016-10-06 来源: eefocus关键字:SD卡  Fatfs文件系统  BMP文件  读取显示 手机看文章 扫描二维码
随时随地手机看文章
调试了一段时间才调试通过,代码是移植别人的。这段代码在网上很多,现在测试通过了,但是有几个小问题要注意。

首先说下硬件平台是奋斗的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             {
                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文件  读取显示 引用地址:SD卡Fatfs文件系统BMP文件读取显示

上一篇:STM32_TIM3_PWM_MDK
下一篇:STM32 之 外部开门狗(iwdg)

推荐阅读最新更新时间:2024-03-16 15:13

基于NiosⅡ软核处理器下SD卡驱动设计
  近年来,基于FPGA的软核处理器以其高度的设计灵活性和低成本在嵌入式市场中得到重视并不断发展。其中具有代表性的软核处理器有Ahera的NiosⅡ处理器和Xilinx的MicroBlaze处理器。NiosⅡ处理器具有完全的可定制性,包括处理器的定制,外设的定制和接口的定制等;32位的NiosⅡ处理器具有超过200 DIMP的性能,而其成本只有同级别性能ARM处理器的l/10。此外,SD存储卡以其大容量和小尺寸的特点,成为市面上各种嵌入式消费产品最常见的存储媒介,探讨SD卡设备的设计具有广泛的应用价值。这里将结合NiosⅡ处理器的总线架构,分析SD卡的接口协议和驱动程序设计方法,并给出SD卡设备在NiosⅡ处理器的设计实例。  
[电源管理]
STM32G0开发笔记:SD卡模块的使用方法
使用Platformio平台的libopencm3开发框架来开发STM32G0,下面介绍SD卡模块的使用方法。 1 新建项目 在PIO主页新建项目spi_sdcard,框架选择libopencm3,开发板选择 MonkeyPi_STM32_G070RB; 新建完成后在src目录新建主程序文件main.c; 然后更改项目文件platformio.ini的烧写和调试方式: 1upload_protocol = cmsis-dap 2debug_tool = cmsis-dap 2 编写程序 2.1 加入FATFS库 从网站fatfs http://elm-chan.org/fsw/ff/00index_e.html 下载最新的源码
[单片机]
STM32G0开发笔记:<font color='red'>SD卡</font>模块的使用方法
S3C2440上MMC/SD卡驱动分析(二)
下面的文章主要是转载的,先记录下自己的经验。 MMC/SD驱动有两种模式:FIFO和DMA。在代码中两种方式都予以了实现,在make menuconfig时候,可以选择是使用fifo方式还是DMA方式。其中FIFO方式就是 向FIFO寄存器写入和读取。FIFO模式刚开始不太明白,FIFO就是起到缓存的作用,可以提高响应速度。具体在代码的操作中,写入时就是将要发送的数据用while循环依次写入FIFO寄存器的地址(只是一个寄存器),硬件上的实现使得我们虽然写入时都是写入了FIFO寄存器(它是FIFO的起始),但是多个数据在FIFO中依次排列的,这里应该用到了移位器和锁存器。 读取时也是相同的,只读FIFO寄存器,就可以将FIFO
[单片机]
SD卡的管脚排列和总线读写方式
SD卡的引脚定义: SD卡引脚功能详述: 引脚 编号 SD模式 SPI模式 名称 类型 描述 名称 类型 描述 1 CD/DAT3 IO或PP 卡检测/ 数据线3 #CS I 片选 2 CMD PP 命令/ 回应 DI I 数据输入 3 VSS1 S 电源地 VSS S 电源地 4 VDD S 电源 VDD S 电源 5 CLK I 时钟 SCLK I 时钟
[单片机]
<font color='red'>SD卡</font>的管脚排列和总线读写方式
单片机软件SPI和硬件SPI读写SD卡,TF卡测试程序
软件SPI和硬件SPI读写SD卡,TF卡测试程序 SD卡模块和SD卡 软件SPI读写SD卡程序 测试平台:STC89C516和STC12C5A60S2 内存卡大小:128MB和2GB 晶振:均为12MHz 硬件SPI读写SD卡程序 测试平台:STC12C5A60S2 内存卡大小:128MB和2GB 晶振:12MHz (89C52没有硬件SPI) 为了尽可能的不给后来者留坑,这些代码我在发出来之前反复测试过,确保无误, 还有就是关于SD卡程序的读写我在程序中写的很清楚,这里不再赘述 单片机源程序如下: #include public.h #include SD.h //测试平台:STC89C516和STC12C
[单片机]
单片机软件SPI和硬件SPI读写<font color='red'>SD卡</font>,TF卡测试程序
mini2440 sd卡加载过程详解
最近在研究wifi模组, 是sdio接口的, 而手头刚好有一块mini2440,了解了一下sdio加载的过程, 发现和sd卡加载的过程是类似的。 这里用mini2440的内核源码, 来剖析一下sd卡的加载过程: 首先, mini2440内核加载的时候, 就会指定一部分设备初始化列表: //---------------------------- arch/arm/mach-s3c2440/mach-mini2440.c ----------------------------// /* devices we initialise */ static struct platform_device *mini2440_de
[单片机]
基于AD7862和dsPIC30F的数据采集系统
在现代控制系统中,数据采集系统就像控制系统的“眼睛”和“耳朵”一样,成为控制系统不可或缺的重要部分。它是各种控制系统获取信息的一种重要途径。由于数据采集系统的精度和实时性对于整个控制系统的性能至关重要,所以必须合理设计使其能提供预期的采样速度、达到一定的转换精度,并应该做到电路简单、抗干扰性能强。本采集系统采用ADI公司生产的12位模数转换器AD7862,它是一款高速、低功耗、双核12位模数转换器。能够满足系统对采样精度和采样速度的要求。控制器件采用dsPIC30F6010A数字信号控制芯片,它是Microchip公司生产的高性能16位数字信号控制器,内核包含一个DSP引擎,从而能够显著增强系统的运算和吞吐能力。 在某些数
[测试测量]
基于AD7862和dsPIC30F的数据采集系统
stm32f103c8t6移植Fatfs文件系统出现的一些问题
一、环境 keil5,使用库函数 二、移植对象 stm32f103zet6 stm32f103c8t6 三、连接方式 硬件SPI1(PA5,6,7) 四、主函数代码 #include stdio.h #include delay.h #include sys.h #include oled.h #include malloc.h #include MMC_SD.h #include ff.h #include exfuns.h void SD_Read_Sectorx(u32 sec); int main(void) { u32 total,free; delay_ini
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved