基于RT-Thread和STM32的数码相框的设计方案

发布者:theta18最新更新时间:2013-12-28 来源: dzsc关键字:RT-Thread  STM32  数码相框 手机看文章 扫描二维码
随时随地手机看文章

  1.引言

  近年来,随着数码相机的普及,一种以数码照片的保存、回放和浏览为核心功能的产品,数码相框应运而生,它以其独特的设计理念和美妙的欣赏效果倍受市场青睐。数码相框采用传统普通相框的外观造型,把传统普通相框的中间照片部分换成液晶显示屏,配上电源,控制器,存储介质等部件,可以直接展示数码照片。同时,数码相框也可以在同一个相框内循环展示不同照片,解决了需要使用电脑才能查看数码相片的缺陷,给日益增多的数码照片和喜好照片的人们提供一个更好的展示照片的平台和空间。基于此,本系统设计了基于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驱动模块、触摸LCD驱动电路等部分组成。

  

  3.1 电源模块

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

  对于产生3.3V电压,采用国家半导体公司的LM1117稳压芯片输出3.3V,LM1117提供电流限制和热保护。电路包含1个齐纳调节的带隙参考电压以确保输出电压的精度在±1%以内。

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

  

  3.2 USB驱动电路

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

  3.2.1 USB接口电路

  在USB接口电路中将USB上拉电压接到D+上,实现USB全速通讯,三极管为开关作用,当开关开启时,PC开始枚举USB存储设备。USB的VCC引脚没有接板上电源,通过PC机给USB设备供电。

  3.2.2 ESD保护电路

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

  

  3.3 SPI FLASH驱动电路

  系统采用SPI串行闪存芯片W25Q64,该芯片具有电路设计简单、数据读取速度快等优点,能够减少系统电路切换噪声,降低系统功耗及开发成本。其应用电路如图5所示。[page]

  

  3.4 LCD触摸驱动电路

  本系统的触摸控制器选用TSC2046,TSC2046是四线电阻式触摸屏控制器,其核心是一个具有采样和保持功能的12位逐次逼近式A/D转换器。本系统通过STM32的SPI接口驱动TSC2046控制器,典型的驱动电路如图6所示。

  

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像素块。[page]

  在程序运行过程中,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格式图像的解码,解码速度较快,恢复图像的质量良好。实际测试表明,本方案具有很强的实用性。

关键字:RT-Thread  STM32  数码相框 引用地址:基于RT-Thread和STM32的数码相框的设计方案

上一篇:基于ARM的无线视频监控系统的解决方案
下一篇:基于Linux 下ARM 和单片机的串口通信设计

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

基于STM32定时器捕获测量脉宽的应用示例
我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程。 一般来讲,使用STM32定时器的捕获功能来实现脉宽测量,我们可以选用一个通道、也可以使用两个通道。使用1个通道时,只需使用定时器基本的输入捕获功能结合中断或DMA即可实现;若使用两个通道时可以将捕获功能与定时器的从模式来相结合完成。这里就两种方案的实现示例都做个简单介绍。 不妨先介绍基于单个通道的输入捕获功能来实现对1路信号脉冲宽度及占空比的测量,并在测量过程中统计用于测量的定时器自身的溢出事件,以保障即使被测信号脉宽长于测量定时器自身的溢出周期时也能有效测量。 这
[单片机]
基于<font color='red'>STM32</font>定时器捕获测量脉宽的应用示例
一文解析STM32产生SPWM原理及程序
SPWM(Sinusoidal PWM)法是一种比较成熟的,目前使用较广泛的PWM法。SPWM法就是以该结论为理论基础,用脉冲宽度按正弦规律变化而和正弦波等效的PWM波形即SPWM波形控制逆变电路中开关器件的通断,使其输出的脉冲电压的面积与所希望输出的正弦波在相应区间内的面积相等。通过改变调制波的频率和幅值,可以调节逆变电路输出电压的频率和幅值。 本文主要详解了STM32产生SPWM原理及程序。首先,我们来了解一下生成SPWM波的基理是什么。 一、生成SPWM波的基理 由于正弦交流量是典型的模拟量,传统发电机难以完成高频交流电流输出,而功率半导体器件于模拟状态工作时产生的动态损耗剧增。于是,用开关量取代模拟量成为必由之路,
[单片机]
STM32学习笔记--------时钟体系
stm32的时钟体系参考(转自正点原子,仅用于学习交流): 一、时钟是什么? 时钟:给单片机提供一个时钟信号(某个频率),协调单片机内部组件同步工作,实现与外部设备通信的同步。(串口的波特率同步)相当于我们的心脏,是核心的部分。 二、时钟源 STM32103的5个时钟源 HSE 高速外部时钟 RC振荡器 频率为8MHz HSI 高速内部时钟 外接时钟4MHz~16MHz LSI 低速内部时钟 RC振荡器频率为40KHz 供WDG看门狗 LSE 低速外部时钟 32.768MHz 供给RTC PLL 锁相环倍频输出(范围2~16倍)最大不超过72MHz 系统时钟来源SYSCLK HSI HSE PLL 时钟
[单片机]
<font color='red'>STM32</font>学习笔记--------时钟体系
STM32串口DMA容易忽视的问题
昨天晚上在STM32串口DMA的问题上纠结了好长时间,所以今天上午写篇博客来谈谈我对串口DMA发送的理解 讨论三个问题:1、什么叫串口DMA 请求;2、串口简要复习;3、串口DMA发送流程。 1、什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性。先导出原子哥的PPT内容: DMA 全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个
[单片机]
<font color='red'>STM32</font>串口DMA容易忽视的问题
意法半导体推出新系列STM32微控制器
STM32 H7新系列产品成为ARM Cortex -M内核微控制器性能新标杆 大容量片上存储器,丰富的通信外设,为物联网设备提供先进安全服务 中国,2016年10月21日 横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)推出新的运算性能创记录的STM32H7系列微控制器。新系列内置STM32平台中存储容量最高的SRAM(1MB)、高达2MB闪存和种类最丰富的通信外设,为实现让智慧更高的智能硬件无处不在的目标铺平道路。 意法半导体自主研发的非常先进的40nm芯片制造工艺,结合产品架构创新,使新系列产品运算性能大幅提升,将处理
[物联网]
意法半导体推出新系列<font color='red'>STM32</font>微控制器
STM32 延时函数封装程序
/*--------------------------------- 延时模块函数 说明:只需在工程中加入delay.c和delay.h 文件,即可用 Delayms(__IO uint32_t nTime); Delayus(__IO uint32_t nTime) -----------------------------------*/ #ifndef __DELAY_H #define __DELAY_H #include stm32f10x.h /*--------------------------------- 描 述:参数1即为1ms,1000即为1s;只有几
[单片机]
基于STM32的家庭服务机器人系统工作原理及设计
为解决当前大部分家庭服务机器人不具备行走功能或只具有简单的避障能力等问题,本文设计一种基于STM32的家庭服务机器人系统。整个系统由轮式机器人、XBee协调器、RFID智慧地板和上位机组成。轮式机器人由主板、传感器模块、射频模块、舵机模块、电源模块和机器人金属主体组成,传感器模块包括电子罗盘、红外传感器和RFID读卡器。主板以ARMCortex-M3内核微处理器STM32F103VCT6为核心进行开发,采集传感器模块数据信息,实现机器人与XBee协调器之间的通信连接。该系统在模拟智能家居的环境下通过自主决策稳定和高效地完成设定任务,能够满足家庭服务机器人的应用要求。 随着人工智能和传感器技术的发展,机器人已从工厂的结构化环境进入人
[单片机]
基于<font color='red'>STM32</font>的家庭服务机器人系统工作原理及设计
详解STM32单片机堆栈
学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区: 栈区(stack) 堆区(Heap) 全局区(static) 文字常亮区程序代码区 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 普通单片机与STM32单片机中堆栈的区别 普通单片机启动时,不需要用b
[单片机]
详解<font color='red'>STM32</font>单片机堆栈
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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