基于CortexM3的SD卡图片浏览器

发布者:LIGANG888最新更新时间:2012-09-07 来源: 单片机与嵌入式系统应用 关键字:CortexM3  SD卡  图片浏览器  LM3S8962 手机看文章 扫描二维码
随时随地手机看文章

引言

        目前,对于图片解码器的研究主要是针对PC环境,设计工作只是在原有基础上的升级,对系统和硬件的考虑较少,不能在嵌入式系统中直接实现。本文设计了一种嵌入式图片解码器。通过FatFs文件系统识别图片文件的格式,调用相应的格式解码单元实现图像重构,并在TFT液晶显示器上进行显示。

1 系统硬件设计

        系统的核心CPU采用LM3S8962,具有丰富的外围接口以及多种片内的硬件接口功能(如UART、SPI、I2C、PWM等)。整个系统的硬件电路包括SD卡电路、TFT液晶显示电路、独立按键电路。

1.1 SD卡电路

       SD卡有两种工作模式,即SD和SPI模式。由于LM3S8962具有SPI接口,为此该嵌入式系统采用SPI模式。SD卡电路如图1所示。 SD卡的信号检测线CARD_INSERT接CPU的PG0端口,CARD_WP检测卡写保护接CPU的PE2。SD卡的供电电路采用P型MOS管 2SJ355的可控电路,由CARD_POWER跳接CPU的PG1脚进行控制。片选线CARD_CS接CPU的PA3。时钟信号CARD_SCK接 CPU的PA2。SPI主机输出从机输入CARD_MOSI、主机输入从机输出CARD_MISO分别接CPU的PA5、PA4。

图1 SD卡电路

 

        TFT液晶显示电路中,显示器的数据线D0~D7接CPU的PB0~PB7,地址线A0~A7接CPU的PC0~PC7。TFT背面板LED+、TFT驱动电源都采用3.3 V供电。独立按键为CPU的PD0~PD3口,当按键被按下时,CPU检测到的引脚为低电平。

2 软件设计

        为使整个系统正常读取SD卡的数据文件和目录,需再创建一个可被Windows操作系统认知的文件系统。考虑到兼容性和方便性,本设计在 μC/OSII操作系统的基础上移植了一种小型嵌入式文件系统FatFs。该文件系统具有支持多种操作系统、易于移植和存储速度快的特点。

2.1 SD卡驱动设计

       SD卡驱动不但需要完成SD卡控制器中相应寄存器的设置和向SD卡发送命令,还要实现SD卡的初始化、读写等操作。目的是为其上层提供相应的功能函数,屏蔽直接对硬件的具体操作。SD卡的驱动使用了ZLG/SD的MMC/SD的软件包。软件包中提供一些常用的API函数,只需调用相关的API 函数就可以实现对SD卡的访问,其中包括SD_Initialize(初始化SD卡)、SD_ReadBlock(读SD卡的一个块)、 SD_WriteBlock(写SD卡的一个块)、SD_EraseBlock(擦除SD卡的多个块)等。

2.2 FatFs文件系统设计

        FatFs是一个开源的文件管理系统,常用于小型嵌入式系统中实现文件系统,支持FAT12、FAT16、FAT32,遵循ANSI C标准,不依赖于硬件平台。对FatFs的移植,首先需要定义数据类型并与CPU.H的数据类型匹配;其次,使FatFs中的底层函数直接调用 ZLG/SD软件包的函数。例如:

        DRESULT disk_read (BYTE drv, BYTE *buff, DWORD sector, BYTE count){
        if(count==1){
        SD_ReadBlock (sector, buff);//读取SD卡的一个块,调用SD_ReadBlock
        }
        else{
        SD_ReadMultiBlock (sector, count, buff);//读取SD卡的多个块,调用SD_ReadMultiBlock
        }
        return FALSE;
        }

        由于篇幅有限,底层函数调用SD软件包的函数不一一列出。通过这些操作就可以调用f_open、f_read、f_write等函数来进行文件的创建、读写等操作。[page]

3 图片解码分析

3.1 JPG格式的分析

        JPEG专家组开发了2种基本的压缩算法、2种数据编码方法和4种编码模式。在实际应用中,绝大多数JPG图像使用的是DCT(离散余弦变换)、Huffman(哈夫曼)编码、顺序模式。JPG编码过程主要包括颜色转换、DCT变换、量化、熵编码及Huffman编码等部分。

        软件实现图像解码的过程就是图像编码的逆过程,程序编程步骤如下:

        ① 初始化FatFs文件系统,并利用f_open函数打开jpg格式的文件,用f_read从JPG格式文件中读取图片编码的相关信息,如图像大小、量化表、Huffman表等。

        ② 读取最小编码单元数据,对其进行熵解码、反量化、反离散余弦变换、YCrCb模式向RGB模式转换等,并将最后的解码数据保存至Buffer或直接输出至显示。

        ③ 不断重复第②步过程,直至整张图片解码完毕。

3.2 BMP格式的分析

        BMP(Bitmap,位图)是Windows采用的图像文件格式。位图文件由4个部分组成:位图文件头(bitmapfile header)、位图信息头(bitmapinformation header)、彩色表(color table)和定义位图的字节阵列。BMP图像的色深,常见有1、4、8、16、24和32位,分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色。这就需要建立相应的彩色表实现位图的显示。编程实现位图显示的步骤如下:

        ① 初始化FatFs文件系统,并BMP格式文件中读取图片编码的相关信息,如图像像素数据、图像位数、RGB值等。

        ② 根据像素索引定位相应颜色在彩色表中的位置。文件定位到相应彩色项,取出索引对应的颜色。

        ③ 从文件读取的RGB数据,转换为TFT支持的格式(本系统选用的TFT支持RGB565格式)。在液晶上画出该像素,直到画完整个图像为止。

3.3 GIF格式的分析

        一个GIF文件的结构可分为文件头(file header)、GIF数据流(GIF data stream)和文件终结器(trailer)3个部分。GIF文件格式采用了可变长度的LZW压缩编码。LZW压缩有3个重要的对象:数据流 (CharStream)、编码流(CodeStream)和编译表(String Table)。在编码时,数据流是输入对象(图像的光栅数据序列),编码流就是输出对象(存储在GIF文件的图像数据)。在解码软件实现上流程与JPG、 BMP相类似,都是先调用GIF格式文件再创建进行GIF_LZW解码,最后在TFT上显示出来。需要注意的是,在解码过程中,编码流则是输入对象,数据流是输出对象。编译表是在编码和解码时都须要借助的对象。

4 模块化测试

        整个系统采用模块化的设计,利用μC/OSII操作系统进行任务管理。以任务Task_BMP为例,对24位真彩色BMP位图的显示进行测试,程序如下:

        Task_BMP{
        f_mount(0, &fs);
        res = f_open(&fsrc, "ab.BMP", FA_OPEN_EXISTING | FA_READ);
        res = f_read(&fsrc, &bmp, sizeof(bmp), &br);
        if((bmp.pic_head[0]==\'B\')&&(bmp.pic_head[1]==\'M\')){//用文件头判断是否为BMP文件
        res= f_lseek(&fsrc,((bmp.pic_data_address_h<<16)|bmp.pic_data_address_l));//采用了Windows的BMP格式,BMP原点在左下角
        for(tx= bmp.pic_h_l;tx>0;tx--){
        f_read(&fsrc, buffer, (bmp.pic_w_l)*3, &br);
        for(ty=0;ty r_data = *(ty*3 +2+buffer);
        g_data = *(ty*3 +1+buffer);
        b_data = *(ty*3 +0+buffer);
        if(tx point.x = tx;
        point.y = ty;
        point.r = r_data;
        point.g = g_data;
        point.b = b_data;
        pixelDraw(point.y ,point.x,RGB888ToRGB565(point.r,point.g,point.b));//24位转换成TFT支持的16位并显示
        }
        }
        }
        }
        f_close(&fsrc);
        }

结语

        本文提出了一种嵌入式图片浏览器的设计思路,以模块化的方法完成了设计过程,可方便地根据应用需求完善解码库的设计,使其能够在实际平台上良好地运行。本设计基本达到了预期效果,虽然不能作为一种通用图片浏览器的方案,但在需要用到图片解码器的GPS、手持PDA、远程监控系统设计上仍然具有一定的参考价值。

关键字:CortexM3  SD卡  图片浏览器  LM3S8962 引用地址:基于CortexM3的SD卡图片浏览器

上一篇:基于Cortex-M3核的车间智能照明设计
下一篇:CortexM3内核的μC/OSII安全性与稳定性的研究

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

STM32--vs1053 WAV录音实现(保存在SD卡
一:VS1053介绍 1.vs1053支持ogg/mp3/aac/wma/midi音频解码,IMA ADPCM编码 2.SPI时序图 二:WAV格式介绍 VS1053 MP3模块支持2种格式的WAV录音: PCM格式或者IMA ADPCM格式,其中PCM(脉冲编码调制)是最基本的WAVE 文件格式,这种文件直接存储采样的声音数 据没有经过任何的压缩。而IAM ADPCM则是使用了压缩算法,压缩比率为4:1。 我们主要讨论 PCM,因为这个最简单。我们将利用 VS1053 实现 16 位,8Khz 采样率的单声道WAV 录音(PCM格式)。 WAVE 文件是由若干个 Chunk 组成的。按照在文件中的出现位置包括:RIFF
[单片机]
【STM32Cube-19】使用SDMMC接口读写SD卡数据
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SDMMC外设读取SD卡数据。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): Micro SD卡 小熊派开发板板载 Micro SD 卡槽,最大支持 32 GB,需要提前自行准备一张 Micro SD卡,如图: 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码; 准备一个串口调试助手,这里我使用的是Serial Port Utility; Keil MDK和串口助手Serial Port Utility 的安
[单片机]
【STM32Cube-19】使用SDMMC接口读写<font color='red'>SD卡</font>数据
MSP430 SD卡SPI读写操作(3) —— SD卡读写实现(以MSP430F5438A为例)
本节提供了MSP430F5438A SPI读写SD卡的示例代码,使用官方函数库msp430_driverlib_2_60_00_02,使用IAR for msp430 6.3通过编译。 本节代码未对SD卡进行区分,因此只针对SDHC卡进行操作,程序在金士顿 8GB SDHC microSD卡经过验证可以正常运行。 sdhc.h #ifndef _SDHC_H_ #define _SDHC_H_ #define SDHC_INIT_CLK 125000 #define SDHC_HIGH_CLK 3125000 #define SDHC_CS_PORT GPIO_PORT_P9 #define SDHC_CS_PIN
[单片机]
STM32与SD卡通信问题详解
SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。 我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。 1)驱动层 驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任何一个STM32的外设,只要用库函数都离不开这一对互相对应的
[单片机]
SD卡新标准面世 超高解像影片时代将至
    SD协会公布了最新的SD卡规格SD 5.0,它除了是目前最快的规格,也新增了影片速度的分级Video Speed Class,记忆卡将支持4K、8K、3D及360度视频的拍摄,当然也支持更高的照片拍摄速度。   有关的Video Speed Class将会以V6 (6MB/s.) 至V90 (90MB/s.) 等标示,出现在记忆卡及相机上,让大家更容易判断是否用了最适合的选择,不过要留意是在SDHC、SDXC UHS-I及UHS-II的SD卡上才会出现这些标示。 V60和V90主要用于8K摄录,4K的话就可以用较低档次。   而SD 5.0本身使用最新的快闪记忆体技术,可更有效率处理大容量档案。至于8K
[家用电子]
SD卡简介(SDIO方式)
一。 SD卡的常用寄存器 SDIO可以带多个SD卡,通过RCA(相对卡地址寄存器)可以确定要访问哪个卡。 二。 SD卡初始化流程 通过初始化后就可以区分出四种卡。 VHS的四位一般设置为0001b。所以CMD8指令一般参数为0x1AA。 对于2.0的卡,CCS=1为SDHC的卡,CCS=0为SDSC的卡,对于1.0的卡忽略该位。 三。 SD卡单块数据块读取流程 四。SD卡多块数据块的读取流程 五。 SD卡单块写数据块流程 六。 SD卡多块数据块写入流程 这里重点看“card status”位,SD卡的状态。
[单片机]
<font color='red'>SD卡</font>简介(SDIO方式)
STM32+SDIO+FATFS文件系统 直读SD卡
网上关于小型嵌入式的文件系统有好多~当然要数 FATFS 很是出名 一来小巧,二来免费。当然了国产的振南的znFAT 一样开源好用而且极其的省资源~!非常适合51单片。更重要的是国语的支持,呵呵!这次在STM32上为SD卡移植文件系统还是非常简单顺利的,这多亏了ST 官方提供的驱动,而我自己不用动手编写SD卡的命令省了很多时间而且官方做的驱动虽然效率一般但是极其严谨我很是佩服。 FATFS的官方网站是 http://elm-chan.org/fsw/ff/00index_e.html znFAT的官方网站是 http://www.znmcu.cn/softshow.asp?id=47 今天上午问个妹子要电话,没给我.....
[单片机]
STM32+SDIO+FATFS文件系统 直读<font color='red'>SD卡</font>
基于MCF51QE128的SD卡文件系统设计
引言 MCF51QEl28微控制器是FREESCALE公司生产的8位/32位兼容的低功耗微处理器。工作电压的典型值是3.6V,与SD卡的工作电压兼容,可直接与SD卡连接而无需电平转换电路。SD卡因为其体积小、功耗低、容量大且成本低,目前被广泛应用于各类嵌入式数据采集系统中。本文针对此类应用,通过实测512MB SD卡数据,以实例的形式深入解析了FATl6文件系统的存储原则,并给出了实现方案。 1 FATl6文件系统 SD卡格式化为FAT文件系统时,一般只采用1个分区,以便于存储空间的管理。FATl6主要由图1所示的6个阴影部分组成。通常情况下,每扇区的大小为512字节。 1. 1 主引导记录 MBR(Ma
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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