基于STM32的BMP图片解码系统

发布者:恬淡如云最新更新时间:2012-07-27 来源: 电子设计工程 关键字:BMP图片  ARM微控制器  STM32  SD卡 手机看文章 扫描二维码
随时随地手机看文章
    在现代便携式设备的应用过程中,常常需要在系统中显示一些图片,而在各种图片格式中,BMP又是最具代表性的一种图片格式。
    BMP是一种与硬件设备无关的图像文件格式,使用非常广泛。它采用位映射存储格式,除了图像深度可选以外,BMP文件的图像深度可选1、4、8及24 bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
    典型的BMP图像文件由3部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。
    ARM公司作为全球32位低功耗处理器设计领域的领导者,曾经设计过很多高性能低功耗的处理器,广泛应用于各种便携式手持系统中,意法半导体公司的STM32处理器采用ARM公司最新的V7体系架构的内核Cortex-M3,它的速度比ARM7快三分之一,功耗低四分之三,同时集成了分支预测,单周期乘法,硬件除法等功能,大大提高了处理器的数据处理能力,同时采用最新的Thumb-2指令集,有效地降低了代码的密度,提高了程序的执行救率,通过对功耗和性能的分析,本文中采用的处理器为STM32F103RBT6,它可以实现最新的在应用中编程,使得系统的软件更新更加容易实现,达到了性能和功耗的平衡,可以应用于很多领域,如工业控制,温度测量等。

1 系统的工作原理
    本系统以STM32F103RBT6为核心,采用晶彩光电的AM240320TFT液晶模块作为显示器,完成对解码后图片的显示,需要显示的图片存储在SD卡中,处理器通过SPI方式读取SD卡里面的图片信息,由于STM32内部RAM很小,不能作为整幅图片的缓冲区,所以本系统的设计过程中采用了用时间换空间的方式,即采用了边解码边显示的方法,省去了外部数据RAM,随之而来的就是显示的速度比直接调到内存中要慢一些。
1.1 STM32F系列ARM微控制器简介
    STM32F103RBT6使用高性能的ARM Cortex-M3 32位的RISC内核,工作频率为72 MHz,内置高速存储器(高达128 K字节的闪存和20 K字节的SRAM),丰富的增强I/O端口和连接到两条APB总线的外设。所有型号的器件都包含2个12位的ADC、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:多达2个I2C和SPI、3个USART、一个USB和一个CAN。供电电压2.0~3.6 V,一系列的省电模式保证低功耗应用的要求。
1.2 TFT液量显示模块简介
    TFT液晶显示屏是薄膜晶体管型液晶显示屏。TFT液晶为每个像素都设有一个半导体开关,每个像素都可以通过点脉冲直接控制,因而每个节点都相对独立,并可以连续控制,不仅提高了显示屏的反应速度,同时可以精确控制显示色阶,所以,TFT液晶的笆彩更真。本文中采用的TFT液晶屏分辨率位320x240,采用的控制芯片为ILI9320,自带总大小为172 820(240x320x1818)的显存,模块的16位数据线与显寸的对应关系为565方式,它支持多种控制输入信号。本文中采用的是8080接口,通过IO模拟8080总线协议。
1.3 SD卡的特点
    SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛应用于便携式装置,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡一般支持2种操作模式:SD卡模式和SPI模式,本系统的设计过程中采用SPI模式完成SD卡的读写操作。
1.4 FAT文件系统简介
    常用的文件系统有FAT12/16/32等,FAT12是最古老的文件系统,只能管理8 M左右的空间。现在基本淘汰了。FAT16则可以管理2 G的空间(通过特殊处理也能管理2 G以上的空间),而FAT32则能管理到2 TB(2 048 GB)的空间。FAT32较FAT16的优势还在于FAT32采用了更小的簇,可以更有效的保存信息,而不会造成多的浪费。
    本系统设计过程中采用了FAT32文件系统,它的主要组成部分如下:
    MBR称为主引导记录区,该区存储了分区表等信息,位于SD卡的扇区0(物理扇区),在其分区信息里面记录了DBR所在的位置,SD卡一般只会有一个分区,所以也就只要找到分区1的DBR所在位置就可以了。
    DBR称为操作系统引导记录区,如果没有MBR,那么DBR就位于0扇区;如果有,则必须通过MBR区得到DBR所在的地址,然后读出DBR信息。在DBR区,可以知道每个扇区所占用的字节数、每个簇的扇区数、FAT表的份数、每个FAT表的扇区敷、跟目录簇号、FAT表1所在的扇区等一系列非常重要的信息。
    FAT称为文件分配表(FAT表),一个卡上会存在2个FAT表,一个用作备份,一个使用。FAT表一般紧随DBR,另一个FAT表则紧随第一个FAT表,这样只要知道了第一个FAT表的位置及大小,那么第二个FAT表的位置也就确定了。FAT表记录了每个文件的位置和区域,是一种链式结构。
    FDT称为文件根目录表,这个区域固定为32个扇区,假设每个扇区为512个字节。那么根目录下最多存放512个文件(假设都用短文件名存储,每个短文件名占32个字节)。文件目录表是另一个重要的部分,FAT文件系统中(仅以短文件名介绍),文件目录项在目录表下以32个字节的方式记录。

2 系统硬件设计
2.1 供电部分电路设计
    整个系统中的元件均为3.3 V器件。由于系统供电采用电池或者直流电源供电,通过三端稳压芯片LM1117-3.3,为主控芯片STM32F103 RBT6供电,用二极管IN4007串接在电源正极,为系统提供电源反接保护。供电部分原理如图1所示。

a.jpg[page]

2.2 液晶显示部分电路设计
    液晶显示部分主要由微控制器STM32F103RBT6驱动AM240320LSTNQW-00H完成人机界面状态的显示,通过发送命令字,完成液晶模块的初始化,完成对内容的显示,显示部分的硬件电路接口图如图2所示。

b.jpg


2.3 SD卡读写部分的硬件设计
    处理器主机可以选择SD卡模式和SPI模式中任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。SPI模式允许简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。通过读取SD卡中的文件,识别出各个目录下的图片数据,然后对数据进行解码。驱动液晶完成图片的显示,SD卡接口部分电路如图3所示。

c.jpg

[page]

3 BMP图片的解码算法
3.1 BMP文件组成
    BMP文件由文件头、位图信息头、颜色信息和图形数据4部分组成。BMP文件头数据结构舍有BMP文件的类型、文件大小和位图起始位置等信息,它占14个字节。BMP位图信息头数据用予说明位图的尺寸等信息,它占40个字节。BMP颜色表用于说明位图中的颜色,它有若干个表项,每一个表项定义一种颜色。位图信息头和颜色表组成位图信息,位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上,Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。
3.2 BMP图片的读取显示算法
    首先根据读取到的BMP图片数据得到BMP的头部信息,得到文件类型,大小和文件的起始位置,然后读取BMP位图信息头,这里面记录了图片的格式的信息,如BMP图片的宽度和高度,以及每个像素所占的位数,下面举例来说明BMP图片的解码过程。
    常用的BMP图片格式有24位真彩图,16位图,和32位图,解码过程略有不同,下面分别介绍,首先是24位图,当根据BMP的头文件信息得到数据的起始地址之后,从起始地址开始读数据,假设每次读入512字节,由于AM240320TFT采用16位的565方式显示,即就是说需要把每个像素所占的24位致据,也就是3个字节,转换为16位的数据,即2个字节,这里以前3个字节为例来说明解码算法:
    d.jpg
    其中codor为需要提供给液晶显示器每个像素点的颜色值,tmp_color为解码过程中的临时变量,数组temp存储24位格式的像素值。同样也可以解码16位颜色图和32位颜色图,解码16位颜色图的算法比较简单,只需要解出连续的两个值然后组合成16位的565格式的颜色值送到液晶显示,其解码算法如下:
    e.jpg
    在32位图的解码过程中需要注意一个问题,就是32位图中实际上只使用了24位存储像素值,也就是32位中的前3位,最后一位没有存储像素值信息,所以在解码的过程中只需要解码前3位,将第4位跳过,具体解码算法如下:
    f.jpg
3.3 STM32解码并显示BMP图片程序
    在BMP图片解码过程中,有两种方式:一种是将BMP图片数据从外部SD卡中调入内存中,从内存中解码,解码后将图片数据显示在TFT屏上;第二种方式是一边从SD卡中读数据一边解码显示,两种方式各有优缺点。第一种方式的优点是由于整个解码过程全部在内存中进行,所以解码的速度比较快,显示图片的速度快。由于一般处理器内部RAM都是有限的,而这种方式对RAM的消耗特别大,所以采用这种方式需要外扩SRAM。第二种方式是从SD卡总边读取边解码,例如一般FAT32文件簇的大小都是512字节,所以可以以簇为单位来读取图片信息,然后显示接着读取下一簇,这种方式的缺点是,由于SD卡的SPI方式速度较慢,解码一张320x240的图片大概需要1s,但是这种方式对系统的内存消耗比较低,比较适合于没有外部RAM的系统。本系统中,采用第二种方式进行解码显示,STM32采用外部8 MHz的晶振作为输入时钟,内部锁相环将时钟倍频到72 MHz作为系统时钟,采用GPIO口模拟8080时序并行驱动2.8寸TFT屏,屏幕分辨率为320x240,处理器首先完成各种外设初始化,接着初始化FAT文件系统,然后从SD卡中读取一簇的数据,解码显示,接着读取下一簇。整个程序的流程图如图4所示。

g.jpg



4 结论
    本文采用了基于ARM的Cortex-M3内核的STM32,它基于最新ARMv7架构,设计了一个BMP图片解码系统,完成了在2.8寸TFT屏上解码并显示BMP图片,通过读取SD卡中的图片数据,边读取边解码显示,实现了在内存有限的处理器中的BMP图片的解码算法。

关键字:BMP图片  ARM微控制器  STM32  SD卡 引用地址:基于STM32的BMP图片解码系统

上一篇:基于STM32的MIT-BIH心电数据的D/A回放
下一篇:基于STM32和CPLD的等精度测频设计

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

​​​​​​​简述STM32 CAN总线的设置
简述CAN总线 最近公司开发CAN总线项目,以前也学习了,没有实际的用于项目制作,现在具体的总结一下,也是借鉴了很多大神的资料,站在巨人的肩膀之上写下来这篇文章 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信 协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种 各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求 不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、 “通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公
[单片机]
​​​​​​​简述<font color='red'>STM32</font> CAN总线的设置
STM32系列之SPI_NSS的理解
之前也是对SPI的NSS一头雾水,看其他手册上说的NSS就是片选信号。大多数的SPI从机的片选有效为低电平,当某一从机的NSS引脚为低电平时,该机被选中,就可以和主机通过SPI通信了。所有的主机和从机其实都有片选信号,只有片选了,才能工作。但是主机的片选是通过软件配置完成的,读完下面的几段,希望能给您说清楚。 在STM32中,当要配置为slave时,只要将它的NSS引脚配置为低电平即可。那么如果要SPI配置为master时,也要配置这个NSS,但此时配置为SPI_NSS_Soft。究竟什么是SPI_NSS_Soft和SPI_NSS_Hard呢?我们来看一下数据手册的说明吧:在stm32的spi.h文件里面是这么定义的 #defin
[单片机]
基于STM32的嵌入式语音识别模块设计
介绍了一种以ARM为核心的嵌入式语音识别模块的设计与实现。模块的核心处理单元选用ST公司的基于ARM Cortex-M3内核的32位处理器STM32F103C8T6。本模块以对话管理单元为中心,通过以LD3320芯片为核心的硬件单元实现语音识别功能,采用嵌入式操作系统μC/OS-II来实现统一的任务调度和外围设备管理。经过大量的实验数据验证,本文设计的语音识别模块具有高实时性、高识别率、高稳定性的优点。 服务机器人以服务为目的,因此人们需要一种更方便、更自然、更加人性化的方式与机器人交互,而不再满足于复杂的键盘和按钮操作。基于听觉的人机交互是该领域的一个重要发展方向。目前主流的语音识别技术是基于统计模式。然而,由于统计模型训练算
[单片机]
基于<font color='red'>STM32</font>的嵌入式语音识别模块设计
IAR全面支持兆易创新基于Arm® Cortex®-M7内核的超高性能MCU
IAR嵌入式开发解决方案现已全面支持兆易创新GD32H7系列,与合作伙伴一同为高端创新应用提供开发利器 中国上海—2023年7月13日,嵌入式开发软件和服务的全球领导者IAR与业界领先的半导体器件供应商兆易创新(GigaDevice)联合宣布, 最新发布的IAR Embedded Workbench for Arm 9.40版本已全面支持兆易创新基于Arm® Cortex®-M7内核的超高性能MCU微控制器——GD32H737/757/759系列,为开发人员提供高效的工具链。 GD32H737/757/759系列超高性能MCU基于600MHz Arm® Cortex®-M7内核,凭借双发射6级流水线架构,以及支持高带
[嵌入式]
IAR全面支持兆易创新基于<font color='red'>Arm</font>® Cortex®-M7内核的超高性能<font color='red'>MCU</font>
STM32——如何配置GPIO的led点亮
GPIO_Init(); 1、使能GPIO的时钟 2、设置GPIO目标引脚 3、控制GPIO引脚输出高低电平 IO操作重要结构体:GPIO_InitTypeDef typedef struct { uint32_t Pin; 操作的管脚 uint32_t Mode; 模式选择 uint32_t Pull; 上拉下拉,或者都不加 uint32_t Speed; 速度选择 uint32_t Alternate; 管脚复用模式 } GPIO_InitTypeDef; GPIO的led点亮: void GPIO_Init(void) { GPIO_I
[单片机]
STM32编程之从寄存器到标准库
【1】上集说到寄存器编程之点灯仪式,寄存器编程看似简单,是因为点灯本身就很简单,大家知道寄存器编程是怎么回事就行了,下面我们改造一下前篇文章的程序,渐渐地我们就往标准库靠拢了!新世界,更精彩,打起精神! 【2】引入头文件 改动很小,就是把宏定义移到了.h文件中,再在.c文件中include头文件即可。以上便是头文件的引入。值得注意的是头文件开头两句和最后一句是格式,是为了防止重复声明,不加的话容易粗心出错! 【3】引入文件夹和混合编译 问题:两个.c问题如何同时编译 只需要一步配置即可,这里我们新建了一个文件夹,也完成了混合编程的目的,下一步就可以接触标准库编程方式了,下篇文章再见!
[单片机]
STM32的HAL库与标准库的区别
新手在入门 STM32 的时候,一般大多数都会选用标准库和 HAL 库,而极少部分人会通过直接配置寄存器进行开发。 对于刚入门的朋友,可能没法直观了解这些不同开发发方式之间的区别,本文试图以一种非常直白的方式,用自己的理解去将这些东西表述出来。 配置寄存器 不少先学了 51单片机的朋友可能会知道,会有一小部分人或教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了 STM32 就变得不太容易行得通了。 因为 STM32 的寄存器数量是 51单片机的十数倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。也有人喜欢去直接操作寄存器,因为这样更接近原理,代码更
[单片机]
<font color='red'>STM32</font>的HAL库与标准库的区别
深度解析STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。 01驱动流程 使用FSMC驱动LCD 关于FSMC,把数据写入相应的地址,FSMC就会把地址从FSMC_A出去,写入的数据会会从FSMC_D发出去。至于片选等信号线都是自动的。读的话,直接读相应的地址,就会拿到改地址上的数据。 FSMC驱动外部SRAM时,外部SRAM的控制一般有: 地址线(如A0~A25) 数据线(如D0~D15) 写信号(WE,即WR) 读信号(OE,即RD) 片选信号
[单片机]
深度解析<font color='red'>STM32</font>驱动LCD原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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