4.体系软件规划
本体系的软件主要由体系各模块初始化、μC/GUI树立人机交互界面、文件体系读取图片及字库文件、图片解码算法的完结、接触阅读功用及幻灯片播映功用等功用模块组成。
4.1 μC/GUI树立人机交互界面本体系运用μC/GUI builder树立μC/GUI人机交互界面,在μC/GUI builder中树立窗体、文本框、控件等、将编译后发生的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.H中声明大局结构体目标GUI_Font12_HZ;
第二步:界说寄存字模数据的数组;
第三步:界说用于阐明每个字母的字模数据在程序段存储办法的结构体;
第四步:依据汉字内码高位界说多个结构体,用于寄存字库字模编码和字模数据寄存地址的映像;
第五步:将创立的汉字库文件HZK12.C增加至μC/GUI工程,在主函数中调用显现函数。
经过以上进程完结了中文汉字在μC/GUI界面的显现,经测验,汉字显现流通安稳。
4.3 图片解码算法
JPEG图片解码显现包含解析JPEG头文件信息、依据接连DCT编码的JPEG解码算法处理、转化图画格局、液晶显现等部分,整体流程图如图7所示。

4.3.1 解析JPEG头文件信息
对JPEG解码的进程进行初始化,获取JPEG头文件中的相关信息,本体系的办法是规划一系列的结构体对应头文件中的各个信息符号,并存储符号内标明的信息,如颜色信息、采样比、图片尺寸、量化表、Huffman解码表等重要信息。
4.3.2 依据接连DCT编码的JPEG解码算法
依据接连DCT编码的JPEG解码算法包含熵解码、反量化和反向离散余弦改换(IDCT)共三个进程。JPEG根本体系的解码器结构图如图8所示。

(1)熵解码。熵解码的输入信号是被紧缩编码的比特流,输出是被解码得到的DCT改换系数的量化值。经过查找Huffman解码表将紧缩图画数据复原成沟通AC系数和直流DC系数组成的量化数据块。
熵解码对读入的图画数据进行DC直流系数和AC沟通系数的Huffman解码。JPEG算法供给规范的Huffman码表,针对每幅图画都有各自不同的特色,体系熵解码选用自适应的Huffman码表。选用自适应的Huffman码表,首要核算输入图画数据的特性,生成码树,再反推得到各级Huffman码表。
在JPEG头文件信息的符号中,界说了一张表用来记载Huffman树其代码长度约束在16bit以内。JPEG头文件信息一般包含4个Huffman码:用于解码直流DC系数的Huffman码表,其间包含一个亮度表和一个色度表;用于解码沟通AC系数的Huffman码表,其间包含一个亮度表和一个色度表。依据Huffman码表在文件中的保存方式,规划Huffman解码一个码字的程序,程序流程图如图9所示。

解码时,输入图画紧缩后的数据流,从数据流中读取比特数据组成的码字,在Huffman树中查找码字的方位,依据码字的方位确认解码的值,解码输出成果是一个8位值。在Huffman解码进程中,假如发生了一个0xFF,就用0xFF0x00替代,把0xFF0x00作为0xFF进行处理。
(2)反量化。反量化的输入信号是熵解码后的数据,经过查量化表进行核算,将在紧缩进程中经过DCT改换后的频率系数复原出来,反量化成DCT系数。
JPEG文件中包含亮度量化表和色度量化表两张量化表,将Huffman解码得到的系数矩阵与相应的量化矩阵相乘,即得到反量化成果。
由于数据是按8×8矩阵的“Z”字形编列,所以要对反量化运算的成果进行反Zig-Zag改换。
(3)反向离散余弦改换(IDCT)。反向离散余弦改换把频率域DCT重量系数反转成颜色空间域标明的图画数据。对反量化后得到的DCT改换系数经过反向离散余弦改换IDCT得到图画的像素。反离散余弦转化的输入是频率域的一个8×8重量系数块,输出则得到空间域的一个8×8像素块。
在程序运转进程中,IDCT运算量较大,有很多浮点乘法和加法运算,程序履行速度较慢,这对图片能否流通的显现有很大影响。依据此本统软件对IDCT算法了优化,选用一种快速IDCT算法[5],把二维IDCT分化成行和列两个一维IDCT,再将IDCT算法经过数学改换转化为离散傅里叶逆改换(IDFT),运用矩阵改换简化核算。在开端进行二维IDCT转化时,先对输入的反量化后的数据进行8次一维的行改换,并将存储运转成果,再对运转的成果进行8次一维的列改换,经过两次改换,得到的便是二维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数据线衔接至电脑,可以对flash存储设备进行读写操作。
5.2 软件调试
5.2.1 LIB库的编译
本体系的软件开发环境是MDK,在程序根本模块的底层驱动编写完善今后,将STM32的底层外设驱动库和μC/GUI库函数编译封装成LIB库,在后期程序开发时,大大提高了程序的编译功率,缩短了软件开发周期。
5.2.2 Finsh Shell调试组件本体系选用RT-Thread嵌入式操作体系,经过其自带的用户指令行组件Finsh Shell检查体系运转状况。经过超级终端输入相应的指令来运用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格局图画的解码,解码速度较快,康复图画的质量杰出。实践测验标明,本方案具有很强的实用性。
- STM32单片机中文官网
- STM32单片机官方开发工具
- STM32单片机参阅规划