介绍

近年来,随着数码相机的普及,一种以数码照片保存、回放和浏览为核心功能的产品——数码相框应运而生,以其独特的设计理念和精彩的欣赏效果受到市场的青睐。数码相框采用传统普通相框的外观,将传统普通相框的中间照片部分替换为液晶显示屏,配有电源、控制器、存储介质等部件,可以直接显示数码照片。同时,数码相框还可以在同一个相框中展示不同的照片,解决了你需要使用电脑才能查看数码照片的缺陷,为越来越多的数码照片和喜欢照片的人提供了更好的平台和空间。基于此,本系统设计了一款基于RT-Thread和STM32的数码相框。

该系统以STM32为主控芯片,利用开源的嵌入式RT-Thread操作系统和人机交互界面C/GUI设计了数码相框系统。该系统主要实现了JPEG格式图片在触摸液晶屏上的浏览和显示、USB主机读取功能、SPIFLASH存储等功能。

2.总体系统设计

该系统由嵌入式处理器、外围设备、嵌入式操作系统和应用软件组成。该系统以嵌入式RT- Thread和嵌入式微控制器STM32为核心平台,通过C/GUI建立人机交互界面,利用USB主机读取功能将图片和字体文件写入外部SPI FLASH,利用文件系统读取图片文件,经过图像解码算法处理后显示在触摸液晶屏上,通过触摸完成浏览图片的功能。系统的整体结构框图如图1所示。

3.系统硬件设计

该系统以STM32为主要硬件平台,系统整体硬件结构图如图2所示。系统硬件主要由电源模块、STM32最小系统、JTAG下载调试接口、USB驱动电路、SPI FLASH驱动模块、触摸屏驱动电路等组成。

3.1电源模块

本系统中,微控制器及其外围电路驱动模块需要3.3V电源,系统使用的动力电池为3.7V,需要稳压芯片供电。

为了产生3.3V电压,使用美国国家半导体公司的LM1117稳压芯片输出3.3V,LM1117提供电流限制和热保护。该电路内置齐纳稳压带隙基准电压,确保输出电压的精度在1%以内。

输出需要一个至少10uF的钽电容来改善瞬态响应和稳定性。LM1117稳压芯片的输出3.3V电路如图3所示。

3.2 USB驱动电路

STM32芯片集成了USB外设,减轻了USB电路的设计负担。系统设计了USB接口电路和ESD保护电路。

USB接口电路

将USB上拉电压连接到USB接口电路中的D,实现USB全速通信。三极管起开关的作用。当开关打开时,PC开始枚举USB存储设备。USB的VCC管脚上没有电源,通过PC给USB设备供电。

ESD保护电路

采用意法半导体公司的USBLC6-2P6,芯片使USB的D /D-信号完全平衡,I/O接口与地线的匹配容差仅为0.04pF,完全在USB 2.0的最大容差范围内。如果USB数据线上发生ESD,芯片的ESD保护功能会将电流引向地。为了保证ESD保护的最高效率,数据线采用轨到轨保护拓扑,为了提高输出功率,VCC线采用箝位保护结构。USB驱动保护电路的原理图如图4所示。

3.3 SPI闪存驱动电路

系统采用SPI串行闪存芯片W25Q64,具有电路设计简单、数据读取速度快等优点,并能降低系统电路的开关噪声,降低系统功耗和开发成本。其应用电路如图5所示。

3.4 LCD触摸驱动电路

本系统的触摸控制器是TSC2046,它是一个四线电阻式触摸屏控制器,其核心是一个具有采样和保持功能的12位逐次逼近型A/D转换器。该系统通过SPI int驱动TSC2046控制器

该系统的软件主要包括各模块的初始化、C/GUI人机交互界面的建立、文件系统对图片和字体文件的读取、图片解码算法的实现、触摸浏览功能和幻灯片播放功能。

4.1 C/GUI建立人机交互界面本系统利用C/GUI builder建立一个C/GUI人机交互界面,建立表单、文本框、控件等。在C/GUI生成器中,将编译后的C文件添加到项目目录中。C/GUI builder的应用缩短了界面的开发周期,修改灵活方便。后期修改界面时,只需在C/GUI builder中修改相关组件,然后编译运行即可实现程序修改。

4.2 C/GUI显示汉字

在C/GUI中,可以通过查找字体来显示字体。字体库中的每个字母都有其对应的字体,由结构GUI_FONT和GUI_FONT_PROP管理。但是C/GUI本身只支持英文,不提供中文字体源文件。该系统在修改C /GUI字体显示驱动函数的基础上,实现了汉字的显示。以12*12点阵汉字显示为例,具体修改步骤如下:

第一步:在GUI中声明全局结构对象GUI_Font12_HZ。h;

步骤2:定义一个存储字体数据的数组;

第三步:定义用于解释程序段中每个字母的字体数据的存储方式的结构;

步骤4,根据汉字内码高位定义多个结构,存储字体代码的图像和字体数据的存储地址;

第五步:添加创建好的汉字库文件HZK12。C到C/GUI项目,调用主函数中的显示函数。

通过以上步骤,实现了汉字在C/GUI界面上的显示。经测试,汉字显示流畅稳定。

4.3图像解码算法

JPEG图片的解码显示包括解析JPEG头信息、基于连续DCT编码的JPEG解码算法处理、图像格式转换、液晶显示等部分。整体流程图如图7所示。

4.3.1解析JPEG头信息

JPEG解码的过程被初始化以获得JPEG头文件中的相关信息。该系统的方法是设计一系列与头文件中的信息标签相对应的结构,存储标签中表示的信息,如颜色信息、采样率、图片大小、量化表、霍夫曼解码表等重要信息。

4.3.2基于连续DCT编码的JPEG解码算法

基于连续DCT编码的JPEG解码算法包括熵解码、反量化和反离散余弦变换(IDCT)。JPEG基本系统的解码器结构图如图8所示。

(1)熵解码。熵解码的输入信号是压缩编码比特流,输出是解码DCT变换系数的量化值。通过搜索霍夫曼解码表,压缩图像数据被恢复为由AC系数和DC系数组成的量化数据块。

熵解码霍夫曼解码读取的图像数据的DC系数和AC系数。JPEG算法提供了一个标准的霍夫曼代码表。根据每幅图像的不同特点,采用自适应霍夫曼码表进行系统熵解码。采用自适应霍夫曼码表。首先统计输入图像数据的特征生成码树,然后通过逆向计算得到各级霍夫曼码表。

在JPEG头信息的标签中,定义了一个表来记录霍夫曼树,其代码长度限制为16bit。JPEG头信息一般包含四个霍夫曼码:用于解码DC系数的霍夫曼码表,包括亮度表和色度表;用于解码AC系数的霍夫曼码表,包括一个亮度表和一个色度表。根据霍夫曼码表在文件中的保存形式,设计了霍夫曼解码一个码字的程序,程序流程图如图9所示。

解码时,输入图像的压缩数据流,从数据流中读取由比特数据组成的码字,在霍夫曼树中搜索码字的位置,根据码字的位置确定解码值,解码输出结果为8比特值。在霍夫曼解码过程中,如果产生了0xFF,则用0xFF0x00替换,0xFF0x00被视为0xFF。

(2)逆

JPEG文件包括两个量化表:亮度量化表和色度量化表。将霍夫曼解码得到的系数矩阵与对应的量化矩阵相乘,得到逆量化结果。

因为数据是以88矩阵的“Z”形排列的,所以反量化操作的结果要进行反之字形变换。

(3)逆离散余弦变换(IDCT)。逆离散余弦变换(IDCT)将频域中的DCT分量系数变换成颜色空间域中表示的图像数据。通过对逆量化后获得的DCT变换系数进行逆离散余弦变换(IDCT)来获得图像的像素。IDCT的输入是频域中的88分量系数块,输出是空间域中的88像素块。

IDCT在运行程序的过程中,计算量大,浮点乘加运算多,程序执行速度慢,对画面能否流畅显示影响很大。基于该软件,优化了IDCT算法,采用快速IDCT算法将二维IDCT分解为行和列两个一维IDCT,然后通过数学变换将IDCT算法转化为离散傅里叶逆变换(IDFT),通过矩阵变换简化计算。二维IDCT变换开始时,首先对输入的逆量化数据进行八次一维行变换,并存储运行结果,然后对运行结果进行八次一维列变换,经过两次变换,得到二维IDCT运算变换的结果。程序流程图如图10所示。

4.3.3颜色模式转换

由于液晶支持RGB格式的图像数据,因此需要将解码处理后得到的YCrCb格式的数据转换为RGB模式,将256级YCrCb颜色模型转换为RGB颜色模型的计算公式如公式(1)所示。

因为R,G,B的取值范围是[0,255],所以需要用阈值来保护运算结果。对于超过255的值,限制为255,对于小于0的值,限制为0。经过运算,最终可以得到RGB模式的图像数据,解码过程完成。

4.4图片浏览模式

本系统的图片浏览模式有两种模式可供选择:触摸手动浏览和定时自动浏览。在触摸手动浏览模式下,有“下一页”、“上一页”和“退出”控件。通过操作触摸屏上的上下翻页控件,可以实现浏览图片的功能。浏览完最后一个,系统会自动跳转到第一个。在定时自动浏览模式下,界面只有退出控件,每隔3秒自动浏览下一张图片,循环显示。

5.系统调试

5.1硬件调试

通过硬件电路设计,检查元器件之间的电气连接,下载基本调试程序,检测系统板的运行状态。枚举和测试USB时,通过USB数据线连接电脑,读写闪存设备。

5.2软件调试

5.2.1库的编译

本系统的软件开发环境是MDK。在编写完程序基本模块的底层驱动后,将STM32的底层外设驱动库和C/GUI库函数编译打包成LIB库,大大提高了程序的编译效率,缩短了后期程序开发中的软件开发周期。

5.2.2 Finsh Shell调试组件本系统采用RT-Thread嵌入式操作系统,自带用户命令行组件Finsh Shell用于检查系统运行状态。finsh shell通过超级终端输入相应的命令,在RT-Thread中设计为独立线程,系统解析并执行用户命令,可以用来获取系统运行时信息,读写任意寄存器和内存地址,也可以在shell中直接调用系统函数和访问系统变量。FinshShell组件的使用大大提高了调试程序的效率。

5.2.3画面解码和调试

由于图片解码算法占用大量内存,考虑到STM32内存分配不足可能导致图片解码算法无法正常运行,在验证图片解码功能的正确性时,应该在PC的VC模拟器上运行,为图片解码算法提供一个理想的运行平台。模拟器中用数组存储图片的二进制源代码,用解码算法对图片的数组数据进行解码,验证解码算法的正确性。模拟器运行正常后,将图像解码算法移植到本系统中。实践证明,STM32的内存足以支持图片解码算法的正常执行。实验在VC模拟器中运行的效果图如图11所示。

6.结论

介绍了基于RT-Thread和STM32的数码相框的设计方案。通过设计相关的硬件电路和软件算法,实现了数码相框对JPEG格式图片文件的浏览功能。该系统设计的基于连续IDCT变换的JPEG解码算法能够正确稳定地解码JPEG格式图像,解码速度快,恢复图像质量好。实际测试表明,该方案具有很强的实用性。(作者:吴宇翔、李欣、刘清)