找回密码
 注册
关于网站域名变更的通知
查看: 572|回复: 1
打印 上一主题 下一主题

基于STM32的BMP图片解码系统设计

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-21 07:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基于STM32的BMP图片解码系统设计4 X$ q1 B+ g6 i4 g
中心议题:
0 `' X+ N( I( K/ d! e- b% q( G2 N    *  图片解码系统的工作原理
1 I& k* X  v8 C$ e& z1 t) T- n    *  图片解码系统硬件设计) \1 m1 v, [3 F6 s7 v  e. L/ S# o
    *  BMP图片的解码算法
! G" _4 J( Q5 Y3 X3 X! e; Y解决方案:0 ]+ b: o, [; u, S- T' e8 q/ j
    *  采用晶彩光电的AM240320TFT液晶模块作为显示器
4 H4 I9 r5 R$ c# z2 I) S    *  采用FAT32文件系统- z* P3 z2 s3 }+ ^0 W" x
    *  采用从SD卡中读取编码的同时同步解码的方法  
2 j- ?3 R, v% G9 m9 I
' A, ?- L0 t( d9 @$ s& U
在现代便携式设备的应用过程中,常常需要在系统中显示一些图片,而在各种图片格式中,BMP又是最具代表性的一种图片格式。  3 P8 s$ o7 _. N7 Y/ i; J* m" f/ m
$ j7 x8 l! n  H0 V9 Z  _+ H" k
BMP是一种与硬件设备无关的图像文件格式,使用非常广泛。它采用位映射存储格式,除了图像深度可选以外,BMP文件的图像深度可选1、4、8及24 bit.BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。  7 o, @$ O, o2 |# s+ I0 i

: p  i; c& @, A) ~' N: z* }典型的BMP图像文件由3部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。
# w/ I: z7 f# S5 W2 ?  W* V" L1 o( u' i6 a* a2 r
ARM公司作为全球32位低功耗处理器设计领域的领导者,曾经设计过很多高性能低功耗的处理器,广泛应用于各种便携式手持系统中,意法半导体公司的STM32处理器采用ARM公司最新的V7体系架构的内核Cortex-M3,它的速度比ARM7快三分之一,功耗低四分之三,同时集成了分支预测,单周期乘法,硬件除法等功能,大大提高了处理器的数据处理能力,同时采用最新的Thumb-2指令集,有效地降低了代码的密度,提高了程序的执行救率,通过对功耗和性能的分析,本文中采用的处理器为STM32F103RBT6,它可以实现最新的在应用中编程,使得系统的软件更新更加容易实现,达到了性能和功耗的平衡,可以应用于很多领域,如工业控制,温度测量等。) i0 n5 G" d; D

  R1 Z! X0 S: U, |1 系统的工作原理
) E8 i3 `1 p+ `5 i$ U, s3 o3 s9 h
本系统以STM32F103RBT6为核心,采用晶彩光电的AM240320TFT液晶模块作为显示器,完成对解码后图片的显示,需要显示的图片存储在SD卡中,处理器通过SPI方式读取SD卡里面的图片信息,由于STM32内部RAM很小,不能作为整幅图片的缓冲区,所以本系统的设计过程中采用了用时间换空间的方式,即采用了边解码边显示的方法,省去了外部数据RAM,随之而来的就是显示的速度比直接调到内存中要慢一些。  N' P/ j% @' t2 N
% Y6 H, {, Q8 Q) ]( P7 h  s
1.1 STM32F系列ARM微控制器简介
* i7 X3 g* k# k- Q2 L) ?7 C. x! {9 g. X( d' E5 N/ _  D, |, a9 J
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,一系列的省电模式保证低功耗应用的要求。
! I. G( v8 M$ a1 i9 R/ ^9 v& g5 F3 Y+ z4 T- ~1 K1 z9 A. I
1.2 TFT液量显示模块简介# Y1 g/ M9 C  l7 ~- Y# J1 y
5 T- x* ^) X! }3 s" u$ g" m& [
TFT液晶显示屏是薄膜晶体管型液晶显示屏。TFT液晶为每个像素都设有一个半导体开关,每个像素都可以通过点脉冲直接控制,因而每个节点都相对独立,并可以连续控制,不仅提高了显示屏的反应速度,同时可以精确控制显示色阶,所以,TFT液晶的笆彩更真。本文中采用的TFT液晶屏分辨率位320x240,采用的控制芯片为ILI9320,自带总大小为172 820(240x320x1818)的显存,模块的16位数据线与显寸的对应关系为565方式,它支持多种控制输入信号。本文中采用的是8080接口,通过IO模拟8080总线协议。: s. G, [" r, H

1 C& f. U  _0 n" i1.3 SD卡的特点
4 y# J: V7 Q/ o
- q- [0 q5 @" r6 S) \" ZSD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛应用于便携式装置,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡一般支持2种操作模式:SD卡模式和SPI模式,本系统的设计过程中采用SPI模式完成SD卡的读写操作。* ^  k' i8 M. K- ]' D' M
; r3 R1 I) @4 R7 `/ n* t
1.4 FAT文件系统简介
1 l* H) Y1 k( ]6 V: H7 T3 a; B3 P6 b2 b
常用的文件系统有FAT12/16/32等,FAT12是最古老的文件系统,只能管理8 M左右的空间。现在基本淘汰了。FAT16则可以管理2 G的空间(通过特殊处理也能管理2 G以上的空间),而FAT32则能管理到2 TB(2 048 GB)的空间。FAT32较FAT16的优势还在于FAT32采用了更小的簇,可以更有效的保存信息,而不会造成多的浪费。
! W3 {- k/ d$ b, Y9 ], ]8 a
. Y" Y9 ?4 `( {+ f本系统设计过程中采用了FAT32文件系统,它的主要组成部分如下:# V0 O4 }; k1 k: z
$ l2 s9 T' B/ [: C1 r, M& @
MBR称为主引导记录区,该区存储了分区表等信息,位于SD卡的扇区0(物理扇区),在其分区信息里面记录了DBR所在的位置,SD卡一般只会有一个分区,所以也就只要找到分区1的DBR所在位置就可以了。% F6 {2 e: q* ?4 p5 L9 H

/ i/ A* G" j1 K( T" _/ e0 r# hDBR称为操作系统引导记录区,如果没有MBR,那么DBR就位于0扇区;如果有,则必须通过MBR区得到DBR所在的地址,然后读出DBR信息。在DBR区,可以知道每个扇区所占用的字节数、每个簇的扇区数、FAT表的份数、每个FAT表的扇区敷、跟目录簇号、FAT表1所在的扇区等一系列非常重要的信息。* s- v  H! I8 E5 F: q3 F0 s
( ]/ t) a9 P# z# y; v
FAT称为文件分配表(FAT表),一个卡上会存在2个FAT表,一个用作备份,一个使用。FAT表一般紧随DBR,另一个FAT表则紧随第一个FAT表,这样只要知道了第一个FAT表的位置及大小,那么第二个FAT表的位置也就确定了。FAT表记录了每个文件的位置和区域,是一种链式结构。. B" `; u2 p5 p+ \( d5 s  E4 O

. m% C3 `" `& P& L( {$ T8 iFDT称为文件根目录表,这个区域固定为32个扇区,假设每个扇区为512个字节。那么根目录下最多存放512个文件(假设都用短文件名存储,每个短文件名占32个字节)。文件目录表是另一个重要的部分,FAT文件系统中(仅以短文件名介绍),文件目录项在目录表下以32个字节的方式记录。
- E8 A' I' q' X1 k, s8 Z" F1 G& D8 c8 @$ r5 m0 U0 v
2 系统硬件设计0 F* x. i; n3 K$ t
, `3 Y) o7 s3 Q& P8 ?9 }7 M
2.1 供电部分电路设计$ Y* M2 M% I* c9 M) p, C/ h

, k6 _- O% Q+ w: d' K. ^2 o3 g: ^7 q整个系统中的元件均为3.3 V器件。由于系统供电采用电池或者直流电源供电,通过三端稳压芯片LM1117-3.3,为主控芯片STM32F103 RBT6供电,用二极管IN4007串接在电源正极,为系统提供电源反接保护。供电部分原理如图1所示。
* }5 W/ c' d5 G, s) h- E, ?, U - b  ^# c7 ]9 [. e: a9 p8 g
图1 系统供电部分原理图
. Q3 o" b( ^! g$ U
5 y" S7 J% F; u2.2 液晶显示部分电路设计
4 a; f- a1 z% k" X+ S3 Q# `5 n7 N1 X1 |4 R( [
液晶显示部分主要由微控制器STM32F103RBT6驱动AM240320LSTNQW-00H完成人机界面状态的显示,通过发送命令字,完成液晶模块的初始化,完成对内容的显示,显示部分的硬件电路接口图如图2所示。
& f( M0 M) ~, [, Y! Z, U1 q, V 7 H% ?" W# F. p( _. L6 ~
图2 系统液晶接口原理图/ P9 A* z+ Z7 \8 U
" w0 g" x, }3 ^& u: b; H4 H$ _$ ~' O( d
2.3 SD卡读写部分的硬件设计0 }7 ^4 M0 P; E

* z& W8 t" g; `5 A! \: o' Y处理器主机可以选择SD卡模式和SPI模式中任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。SPI模式允许简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。通过读取SD卡中的文件,识别出各个目录下的图片数据,然后对数据进行解码。驱动液晶完成图片的显示,SD卡接口部分电路如图3所示。
5 e/ S" P; x3 u, b% i: n; ~   S1 {; r9 k2 O- z# p+ y7 F! D. ?* i
图3 SD卡接口原理图
3 {2 r9 [' J( z
0 g  N9 m8 G# L" ?8 T: t: k3 BMP图片的解码算法0 r( [7 {; t$ B6 L) ]

) J; {5 }9 p% P& {! b! z$ f3.1 BMP文件组成. w  p  o. L4 k% Q" Z4 \4 z1 A2 \  w

$ y5 O6 W2 ^6 z( h+ yBMP文件由文件头、位图信息头、颜色信息和图形数据4部分组成。BMP文件头数据结构舍有BMP文件的类型、文件大小和位图起始位置等信息,它占14个字节。BMP位图信息头数据用予说明位图的尺寸等信息,它占40个字节。BMP颜色表用于说明位图中的颜色,它有若干个表项,每一个表项定义一种颜色。位图信息头和颜色表组成位图信息,位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上,Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。3 R% O- \. z, i+ J) n! M

0 U4 e/ m2 `& r% ]3 O3.2 BMP图片的读取显示算法* Q( q: W( b0 U7 c+ C- \& L7 o

- Y, t8 N5 @4 s; P8 q首先根据读取到的BMP图片数据得到BMP的头部信息,得到文件类型,大小和文件的起始位置,然后读取BMP位图信息头,这里面记录了图片的格式的信息,如BMP图片的宽度和高度,以及每个像素所占的位数,下面举例来说明BMP图片的解码过程。+ b1 l  Y4 s: J7 o0 X( m! b% Q7 Z$ H
( n+ b+ M+ d/ b! r% X5 T% O2 B6 Z$ U
常用的BMP图片格式有24位真彩图,16位图,和32位图,解码过程略有不同,下面分别介绍,首先是24位图,当根据BMP的头文件信息得到数据的起始地址之后,从起始地址开始读数据,假设每次读入512字节,由于AM240320TFT采用16位的565方式显示,即就是说需要把每个像素所占的24位致据,也就是3个字节,转换为16位的数据,即2个字节,这里以前3个字节为例来说明解码算法:6 r4 t6 t* Q" R8 W( X
  K/ \' U: w: o: R- x
其中codor为需要提供给液晶显示器每个像素点的颜色值,tmp_color为解码过程中的临时变量,数组temp存储24位格式的像素值。同样也可以解码16位颜色图和32位颜色图,解码16位颜色图的算法比较简单,只需要解出连续的两个值然后组合成16位的565格式的颜色值送到液晶显示,其解码算法如下:
: d' b0 G+ W7 m6 W3 E
- ~" }) \' F9 Z3 w' I+ _' w# q在32位图的解码过程中需要注意一个问题,就是32位图中实际上只使用了24位存储像素值,也就是32位中的前3位,最后一位没有存储像素值信息,所以在解码的过程中只需要解码前3位,将第4位跳过,具体解码算法如下:( Q& ?3 {1 ~, Y, L. `3 ~
+ l2 ^$ {9 D) X5 R
3.3 STM32解码并显示BMP图片程序' R9 X. D5 N+ E: ?  p) k0 N4 G4 c
: B6 [9 A5 O" p1 V& v  ?  @3 t- M
在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所示。
- w5 C. X0 ?# u5 Q$ X0 ^  p4 P
, s7 |, N* S% l0 B: j图4 BMP解码流程图
4 {* q; s7 ?3 C% i6 j5 C1 k7 ]( z& s6 ?
4 结论
# Z  W. b  h/ F+ ?1 X  s+ W  F+ T& L9 m" y, S& B% g8 h' C; U* X# j2 Z/ N
本文采用了基于ARM的Cortex-M3内核的STM32,它基于最新ARMv7架构,设计了一个BMP图片解码系统,完成了在2.8寸TFT屏上解码并显示BMP图片,通过读取SD卡中的图片数据,边读取边解码显示,实现了在内存有限的处理器中的BMP图片的解码算法。
1 q' `# ]' d1 B& q

该用户从未签到

2#
发表于 2019-1-21 11:24 | 只看该作者
最近正在学习这方面 感谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-26 21:40 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表