基于stm32的数码相框系统设计与实现(软件)论文_第1页
基于stm32的数码相框系统设计与实现(软件)论文_第2页
基于stm32的数码相框系统设计与实现(软件)论文_第3页
基于stm32的数码相框系统设计与实现(软件)论文_第4页
基于stm32的数码相框系统设计与实现(软件)论文_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计报告论文题目基于STM32的数码相框系统设计与实现(软件)所属系电子工程系专业自动化学号01208443姓名王永佳指导教师汪力纯起讫日期2012220125设计地点东南大学成贤学院东南大学成贤学院毕业设计报告(论文)诚信承诺本人承诺所呈交的毕业设计报告(论文)及取得的成果是在导师指导下完成,引用他人成果的部分均已列出参考文献。如论文涉及任何知识产权纠纷,本人将承担一切责任。学生签名日期基于STM32的数码相框系统设计与实现(软件)摘要本设计是一款基于嵌入式硬件平台的数码相框,主控芯片为基于ARMCORTEXM3内核的STM32系列嵌入式处理器,本设计包含主控制器核心板、LCD液晶显示、SD卡存储器等多个功能模块。实现对SD卡里多幅图片以幻灯片形式在TFT屏上动态显示的效果,且带有实时时钟的功能。关键词嵌入式;数码相框;CORTEXM3THEDESIGNOFDIGITALPHOTOFRAMESBASEDONTHESTM32ABSTRACTTHEDESIGNISADIGITALPHOTOFRAMEBASEDEMBEDDEDHARDWAREPLATFORM,WHOSEMAINCHIPFORTHESTM32FAMILYOFEMBEDDEDPROCESSORSBASEDONARMCORTEXM3CORETHEDESIGNINCLUDESAHOSTCONTROLLERCOREBOARD,LCDDISPLAY,SDCARDMEMORYANDOTHERFUNCTIONALMODULESITCANACHIEVETHEEFFECTOFMULTIPLEIMAGESOFTHESDCARDASASLIDESHOWONTHETFTSCREENDYNAMICDISPLAY,ANDWITHREALTIMECLOCKFUNCTIONKEYWORDSEMBEDDEDDIGITALPHOTOFRAMECORTEXM3目录摘要IABSTRACTII第一章引言111课题研究意义112数码相框的发展情况和趋势1121数码相框的发展现状1122数码相框的发展趋势213本课题设计主要研究内容214主要章节安排3第二章硬件介绍421嵌入式系统概况4211嵌入式系统的定义4212嵌入式系统的组成4213嵌入式系统的特点522数码相框模块5221MCU主控模块5222LCD模块6223SD存储卡模块9第三章编程环境介绍1231RVMDK380A简介1232新建RVMDK工程1233软件仿真1934在线调试24341JLINK简介24342JLINK调试步骤2535程序下载28第四章程序设计与调试3441系统描述3442软件设计34421文件读取34422图像解码与显示35423时钟显示42424主程序设计5243程序调试57第五章结束语59致谢60参考文献(REFERENCES)61附录数码相框原理图62第一章引言11课题研究意义嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些专用设备上,通常这些设备的硬件资源如处理器、存储器等非常有限,并且对成本很敏感,有时对实时响应要求很高。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、PDA、电子字典、可视电话、VCDDVDMP3播放器、数码相机、数字摄像机、UDISK、机顶盒、高清电视、游戏机、智能玩具、交换机、路由器、数控设备、汽车电子、家电控制系统、医疗仪器、航天航空设备等都是典型的嵌入式产品。数字摄影的兴起不可避免地引起了数码相框的发展,因为仅有不到35的数码照片被打印出来。数码相框的基本原理就是采用普通相框的造型,把原来相框中间的照片部分换成液晶显示屏,配上电源,存储介质等,使得同一个相框内可以循环播放照片,比普通照片的单一显示功能更有优势。从2007年开始,数码相框的市场关注度开始激增。在2008年,数码相框市场呈现高速发展的态势,本课题的研究具有极高的潜在市场价值。此外,本设计属于数字影音娱乐产品,需要较为强劲的处理器进行图像解码的工作,而STM32具有超低的价格、超多的外设、丰富的型号、优异的实时性能、杰出的功耗控制和极低的开发成本等特点。因此,进行基于STM32平台的数码相框系统的设计具有重要的理论意义和实用价值。12数码相框的发展情况和趋势121数码相框的发展现状数码相框产品是2001年开始出现的,但由于当时消费者的接受度及价格过高的因素,使这一市场一直到2003年都很低迷。随着主要器件价格的下降,数码相框的价格也逐步下降,市场在2004年开始有了起色,尤其在2005年,数码相框产品开始在欧美热销,但出货量也只有150万台左右,到了2006年的出货量同比上涨133,为280万台,2007年的出货量同比上涨185,为800万台,预计到2011年出货量将达到4000万台。从屏幕尺寸来看,2006年569英寸产品占主流,2007年7、8、9英寸产品成为最大市场。预计2011年,7、8、9英寸产品的供货比例将持续保持首位,而平均销售单价将以每年165左右的速度降低。2006年以前,中国生产的数码相框绝大多数出口国外。2005年底PHILIPS率先将数码相框在中国推广,在礼品市场上取得了一些成绩,但由于销售价格较高,约为2050元/台,这一年中国数码相框的销售量仅有17万台。2006年下半年,开始有更多的国内厂商在中国市场推出数码相框,因而也带动了此产品价格的下降,这一年的平均售价为1150元/台,仍然较高,市场也以商务礼品为主,但由于2005年销售量的基数较低,2006年的销售量同比增长了4706,达到97万台。直到2007年下半年,业界才感到这个一直处于培育期的市场,开始了真正的起飞。这得益于对数码相框产品认知度的提高、价格的下滑和需求量的提高。从IT厂商来看,仅2007年下半年以来,就有惠普、三星、优派、AOC、明基、柯达、长城等众多新军加入数码相框阵营。其中,巨头惠普2007年7月底在美国宣布进入数码相框市场,2007年数码相框出货量设定为50万台。除新军外,数码相框老牌劲旅的出货量表现也令业界振奋,如飞利浦2006年数码相框出货量达到50万台,而2007年上半年出货量已达去年总和,2007年全年出货量达150万台。而从上游面板厂商的动作来看,也显示出乐观的发展态势。中华映管、群创等厂商均显著调高了配套数码相框产品的中尺寸面板的出货量目标,2007年出货量达1000万台,预计2008年更将倍增至2000万台。其中,中华映管目前已调配一座45代面板厂来支持生产中尺寸面板,主要生产可携式DVD播放机面板与数码相框面板,其数码相框面板以7英寸、8英寸、102英寸为主要尺寸,数码相框面板占其中尺寸面板的比重提高到40。122数码相框的发展趋势从长远来看,2008年及今后几年将为处在数码相框产品供应链的各企业带来巨大的商机。未来几年,数码相框的市场将处在逐渐走向成熟期的阶段,其产销量和市场需求依然将保持大幅度的增长,在未来的三年内,市场尚无萎缩的可能。但数码相框拓展中国市场需克服两大难点一是价格;二是拓展应用空间。价格下降是必然趋势,中国消费者接受只是时间的问题,而根据中国消费者的需求和特点,开发出相应的应用产品,则是需要数码相框厂商亟待解决的问题。从技术上来说,未来数码相框的发展将向两极分化。一部分产品着重强调基本功能和低成本,整合家庭中的闹钟、日历和装饰功能,这些产品走的是低成本路线,以展示照片为主,追求图像的品质及幻灯片播放特效,已成为DC/DV的附属物;另一部分产品将会添加一些新的功能,如WIFI,还可即时报告天气、股票等信息,从而有望成为“桌面信息中心”。此外,触摸面板会成为一个应用的新亮点。从产品形态上来说,数码相框的市场将会有非常明确的细分。1数码相框这将是以数字照片的重显为主要功能的产品,其功能更接近于传统意义上的相框。由于人机界面的限制,为了更方便的重显和浏览以及确定重显的规则,这类产品并不强调有大容量的内存以及丰富的存储卡接口,这类产品的主要特征是1)支持USBDEVICESTM32_CLOCK_INIT9/72MDELAY_INIT72/延时初始化UART_INIT72,9600/设置串口1波特率WHILE1PRINTF“TDN“,TDELAY_MS500T点击(部分编译按钮)编译一下,会在OUTPUTWINDOWS信息栏中发现如下报错信息TESTC1ERROR5CANNOTOPENSOURCEINPUTFILE“SYSH“NOSUCHFILEORDIRECTORY。如下图所示(图中红圈内信息)图310编译报错意思是无法打开源输入文件SYSH,没这个文件或目录。双击红圈内的内容,你会发现在TESTC的01行出现了一个浅绿色的小箭头,说明错误是这个地方产生的。双击后浅绿色箭头出现位置如下图311编译报错其实通过下面错误的说明,就是INCLUDE的路径没有加进去的缘故,而导致了这个错误。现在我们点击(OPTIONSFORTARGET按钮),弹出OPTIONSFORTARGETTARGET1对话框,选择C/C选项卡,如下图所示图312加入头文件包含路径在INCLUDEPATHS处,点击2处的按钮。在弹出的对话框中加入SYSTEM文件夹下的3个文件夹名字,把这几个路径都加进去(此操作即设定编译器的头文件包含路径,下面会经常用到)。图313头文件包含路径设置点击OK确认,回到IDE,此时再点击按钮,再编译一次,发现没错误了,得到如下界面图314再次编译结果至此,一个完整的STM32开发工程在MDK下建立了,接下来我们就是进行软件仿真了。33软件仿真MDK的一个强大的功能就是提供软件仿真,通过软件仿真,我们可以发现很多将要出现的问题,避免了下载到STM32里面来查这些错误,这样最大的好处是能很方便的检查程序存在的问题,因为在MDK的仿真下面,你可以查看很多硬件相关的寄存器,通过观察这些寄存器,你可以知道代码是不是真正有效。另外一个优点是不必频繁的刷机,从而延长了STM32的FLASH寿命。当然,软件仿真不是万能的,很多问题还是要到在线调试才能发现。接下来我们开始进行软件仿真。在软件仿真之前,先检查一下配置是不是正确,点击,确定TARGET选项卡内容如下所示(主要检查芯片型号和晶振频率,其他的一般默认就可以)图315TARGET选项卡确认了芯片以及外部晶振频率(80M)之后,基本上就确定了硬件环境了,接下来,我们再看DEBUG选项卡,设置为如下图所示的设置图316DEBUG选项卡主要确认是USESIMULATOR是否选择(因为如果选择右边的USE,那就是用ULINK进行硬件DEBUG了,这个将在下面介绍),其他的采用默认的就可以。确认了这项之后,我们便可以选择OK,退出OPTIONSFORTARGET对话框了。接下来,我们点击(开始/停止仿真按钮),开始仿真,出现如下界面图317开始仿真可以发现,多出了一个工具条,这个工具条对于我们仿真是非常有用的,下面简单介绍一下工具条相关按钮的功能,工具条部分按钮的功能如下图所示图318仿真工具条复位其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。代码重新执行。执行到断点处该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能。挂起此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。执行进去该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。执行过去在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。执行出去该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。执行到光标处该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。汇编窗口通过该按钮,就可以查看汇编代码,这对分析程序很有用。观看变量/堆栈窗口该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量值,也是很常用的一个调试窗口。串口打印窗口该按钮按下,会弹出一个串口调试助手界面的窗口,用来显示从串口打印出来的内容。内存查看窗口该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况,是很常用的一个调试窗口性能分析窗口按下该按钮,会弹出一个观看各个函数执行时间和所占百分比的窗口,用来分析函数的性能是比较有用的。逻辑分析窗口按下该按钮会弹出一个逻辑分析窗口,通过SETUP按钮新建一些I/O口,就可以观察这些I/O口的电平变化情况,以多种形式显示出来,比较直观。其他几个按钮用的比较少,以上是比较常用的,当然也不是每次都用得着这么多,具体看你程序调试的时候有没有必要观看这些东西来决定要不要看。这样,我们在上面的仿真界面里面选内存查看窗口、串口打印窗口。然后调节一下这两个窗口的位置,如下图所示图319调出仿真串口打印窗口我们把光标放到TESTC的09行,然后双击鼠标左键,可以看到在09行的右边出现了一个红框,即表示设置了一个断点(也可以通过鼠标右键弹出菜单来加入,再次双击则取消)。然后我们点击,执行到断点处,如下图所示图320执行到断点处我们不忙着往下执行,现在来点击菜单栏的PERIPHERALSUSARTSUSART1。可以看到,有很多外设可以查看,这里我们查看的是串口1的情况。如下图所示图321查看串口1相关寄存器单击USART1后会在IDE之外出现一个如下界面图322串口1各寄存器初始化前后对比左边这个就是STM32默认时候,串口1的状态,从中可以看到所有与串口相关的寄存器全部在这上面表示出来了,而且有当前串口的波特率等信息的显示。我们接着单击一下,执行完串口初始化函数,得到了如上面右边图片所示的串口信息。你可以对比一下这两个的区别,就知道在UART_INIT72,9600这个函数里面大概执行了哪些操作。这样可以很清楚的告诉你,当前的串口是否可用,你的设置是否正确,同样这样的方法也可以适用于很多其他外设。然后我们继续单击按钮,一步步执行,最后就会看到在USART1中打印出相关的信息,如下图所示图323串口1输出信息这样证明我们的仿真是通过的,代码运行会在串口1不停的输出T的值,每05S执行一次(时间可以通过IDE的最下面观看到),并且T自增。与我们预期的目地是一致的。再次按下结束仿真。至此,我们软件仿真算是结束了,接下来我们下载代码到硬件上来真正验证一下我们的代码是否可行。34在线调试利用串口,我们只能下载程序,并不能实时跟踪,而利用调试工具,比如JLINK、ULINK等就可以实时跟踪程序,使你的开发事半功倍。这里我们以JLINKV8为例,说说如何在线调试。341JLINK简介JLINK是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAREWAR,ADS,KEIL,WINARM,REALVIEW等集成开发环境支持所有ARM7/ARM9/ARM11内核芯片的仿真,通过RDI接口和各集成开发环境无缝连接,操作方便、连接方便、简单易学,是学习开发ARM最好最实用的开发工具。JLINK仿真器V8版,其仿真速度和功能远非简易的并口WIGGLER调试器可比。JLINK支持ARM7、ARM9、ARM11、CORTEXM3核心,支持ADS、IAR、KEIL开发环境。V80版本除拥有上一版本V70的全部功能外,软硬件上都有改进(1)V80版的SWD硬件接口支持1250V的目标板,V70只能支持33V的目标板。(2)V80使用双色LED可以指示更多的工作状态,V70只有1个LED指示灯。(3)V80增强了JTAG驱动能力,提高了目标板的兼容性。(4)优化了固件结构,使应用程序区扩大。JLINKARM主要特点IAREWARM集成开发环境无缝连接的JTAG仿真器。支持所有ARM7/ARM9内核的芯片,以及CORTEXM3,包括THUMB模式。支持ADS,IAR,KEIL,WINARM,REALVIEW等几乎所有的开发环境。下载速度高达ARM7600KB/S,ARM9550KB/S,通过DCC最高可达800KB/S。最高JTAG速度12MHZ。目标板电压范围12V33V,5V兼容。自动速度识别功能。监测所有JTAG信号和目标板电压。完全即插即用。使用USB电源(但不对目标板供电)带USB连接线和20芯扁平电缆。支持多JTAG器件串行连接。标准20芯JTAG仿真插头。选配14芯JTAG仿真插头。选配用于5V目标板的适配器。带JLINKTCP/IPSERVER,允许通过TCP/IP网络使用JLINK。342JLINK调试步骤JLINKV8支持JTAG和SWD,而STM32也支持JTAG和SWD。所以,我们有2种方式可以用来调试,JTAG调试的时候,占用的I/O线比较多,而SWD调试的时候占用的I/O线很少,只需要2跟即可。在安装了JLINKV8之后,我们接上JLINKV8,并把JTAG口插到硬件板上,打开之前新建的工程,点击,打开OPTIONSFORTARGET选项卡,在DEBUG栏选择仿真工具为CORTEXM3JLINK,如下图所示图324DEBUG选项卡设置然后我们点击SETTINGS,设置JLINK的一些参数,如下图所示图325JLINK模式设置上图中,我们使用JLINKV8的SW模式调试,因为我们JTAG需要占用比SW模式多很多的I/O口,而在硬件板上这些I/O口都是非常有用的,并造成部分外设无法使用。所以建议大家在调试的时候,一定要选择SW模式。MAXCLOCK,可以点击AUTOCLK来自动设置,这里设置JLINK的调试速度为10MHZ,如果USB数据线比较差,那么可能会出问题,此时,可以通过降低这里的速率来试试。单击OK,完成此部分设置,接下来我们还需要在UTILITIES选项卡里面设置下载时的目标编程器,如下图所示图326FLASH编程器选择上图中,我们选择JLINK来调试CORTEXM3,然后点击SETTINGS,设置如下图所示图327编程设置这里要根据不同的MCU选择FLASH的大小,因为我们开发板使用的是STM32F103RBT6,其FLASH大小为128K,所以我们在PROGRAMMINGALGORITHM里面选择128K型号的STM32。然后选中RESETANDRUN,以实现在编程后自动启动。其他默认设置即可。在设置完之后,点击OK,然后再点击OK,回到IDE界面,编译一下工程。再点击,开始仿真(如果开发板的代码没被更新过,则会先更新代码,再仿真,你也可以通过按,只下载代码,而不进入仿真,特别注意开发板上的B0要设置到GND,否则代码下载后不会自动运行的),如下图所示图328开始仿真可以看到都是一些汇编码的查看,如果我们要快速运行到MAIN函数,可以在MAIN函数的第一句语句处放入断点,然后点击,来快速执行到该处。如下图所示图329程序运行到断点处接下来,我们就可以和软件仿真一样的开始仿真了,不过这是真正的在硬件上的仿真,其结果更可信。35程序下载STM32的程序下载有多种方法USB、串口、JTAG、SWD等,这几种方式都可以用来给STM32下载代码。不过,我们最常用的,最经济的,就是通过串口给STM32下载代码。STM32的串口下载一般是通过串口1下载的,本设计的硬件板,不是通过RS232串口下载的,而是通过自带的USB串口来下载。看起来像是USB下载(只有一根USB线,并没有串口线)的,实际上,是通过USB转成串口,然后再下载的。下面,我们就一步步实现如何在实验平台上利用USB串口来下载代码。首先要在板子上设置一下,在板子上把RXD和PA9(STM32的TXD),TXD和PA10STM32的RXD通过跳线帽连接起来,这样我们就把PL2303和MCU的串口1连接上了。这里由于硬件板自带了一键下载电路,所以并不需要去关心BOOT0和BOOT1的状态,但是为了让下载完后可以按复位执行程序,要把BOOT1和BOOT0都设置为0。设置完成如下图所示图330开发板串口下载跳线设置接着我们在USB_232处插入USB线,并接上电脑,如果之前没有安装PL2303的驱动(如果已经安装过了驱动,则应该能在设备管理器里面看到USB串口,如果不能则要先卸载之前的驱动,卸载完后重启电脑(必要步骤),再重新安装我们提供的驱动),则电脑会提示找到新硬件,如下图所示图331找到新硬件我们不理会这个提示,直接找到光盘软件文件夹下的PL2303驱动,安装该驱动。在驱动安装完成之后,拔掉USB线,然后重新插入电脑,此时电脑就会自动给其安装驱动了。在安装完成之后,可以在电脑的设备管理器里面找到USB串口(如果找不到,则重启下电脑),如下图所示图332USB串口驱动安装成功上图中我们显示的USB串口为COM5,不同电脑可能不一样,可能是COM4、COM6等,但是PROLIFICUSBTOSERIALCOMMPORT,这个一定是一样的,如果没找到,则有可能是安装有误或者系统不兼容。在安装了USB串口驱动之后,我们就可以开始串口下载程序了,这里我们的串口下载软件选择的是MCUISP,该软件属于第三方软件,由单片机在线编程网提供,大家可以去WWWMCUISPCOM免费下载,目前最新版本为V0993。该软件启动界面如下图333MCUISP启动界面然后我们选择要下载的HEX文件,以前面我们新建的工程为例,因为我们前面的工程没有在KEIL里面设置生成HEX文件,所以在USER文件夹下是找不到HEX文件的。下面我们看看如何设置先在工程里面点击,打开OUTPUT选项卡,勾选CREATEHEXFILE选项,如下图所示图334MDK设置生成HEX文件图中选中第二个红圈内的选项,可以使编译器产生浏览信息,方便快速查看函数和变量等,这点在后面会介绍。选中之后点击OK,重新编译,编译结果如下图所示图335重新编译结果从上图中可以看到,编译器已经产生了HEX文件了,然后我们打开USER文件夹,看看里面发生了什么变化如下图所示图336新编译生成文件从上图可以看到,重新编译产生了很多文件,其中就有我们所需要的HEX文件(图中红圈圈中),至此,我们就可以开始下载了。用MCUISP软件打开USER文件夹,找到TESTHEX,打开并进行相应设置后,如下图所示图337MCUISP设置图337中红圈圈中的设置,是我们建议的设置。编程后执行,这个选项在无一键下载功能的条件下是很有用的,当选中该选项之后,可以在下载完程序之后自动运行代码。否则,下载代码之后,必须先将B0连接GND,再按复位键,才能开始运行刚刚下载的代码。硬件板虽然自带了一键下载功能,但是还是建议选上这个设置。编程前重装文件,该选项也比较有用,当选中该选项之后,MCUISP会在每次编程之前,将HEX文件重新装载一遍,这对于代码调试的时候是比较有用的。最后,我们选择的DTR的低电平复位,RTS高电平进BOOTLOADER,这个选择项选中,MCUISP就会通过DTR和RTS信号来控制板载的一键下载功能电路,以实现一键下载功能。如果不选择,则无法实现一键下载功能。这个是必要的选项(在BOOT0接GND的条件下)。在装载了HEX文件之后,我们要下载代码还需要选择串口,这里MCUISP有智能串口搜索功能。每次打开MCUISP软件,软件会自动去搜索当前电脑上可用的串口,然后选中一个作为默认的串口(一般是您最后一次关闭时所选则的串口)。也可以通过点击菜单栏的搜索串口,来实现自动搜索当前可用串口。串口波特率则可以通过BPS那里设置,对于STM32,该波特率最大为230400BPS,这里我们一般选择最高的波特率460800,让MCUISP自动去同步。搜索完串口之后界面如下图所示图338搜索串口从之前USB串口的安装可知,开发板的串口被识别为COM5了,所以我选择COM5。选择了相应串口之后就可以通过按”开始编程(P)”这个按钮,一键下载代码到STM32上,下载成功后如下图所示图339下载完成上图中,我用圈圈圈出了MCUISP对一键下载电路的控制过程,其实就是控制DTR和RTS电平的变化,控制BOOT0和RESET,从而实现自动下载。另外界面提示已经下载完成(如果老提示开始连接,需要检查一下,开发板的设置是否正确,是否有其他因素干扰等),并且从0X80000000处开始运行了,我打开串口调试助手选择COM5,会发现从硬件板发回来的信息,如下图所示图340程序开始运行了接收到的数据和我仿真的是一样的,证明程序没有问题。至此,说明下载代码成功了,并且也从硬件上验证了代码的正确性。第四章程序设计与调试41系统描述本系统采用基于ARMCORTEXM3内核的STM32作为主控制器,外扩SD卡以及TFT彩屏。系统通过文件系统读取SD卡内存储的BMP、JPEG、JPG格式图片,把多幅图片以幻灯片的形式从TFT屏上显示出来。同时,通过STM32内部的RTC模块使系统具有掉电不遗失日期及时钟的功能。系统框图如图41所示。图41系统框图42软件设计421文件读取本设计需要用到FATFAT16/32文件系统来读取SD卡上的字库和UNICODE到GBK的转换码表到W25X16部分,因此要重点介绍FAT文件系统。FAT文件系统本身比较复杂,所以这里只简单介绍一下。常用的文件系统有FAT12/16/32等,FAT12是最古老的文件系统,只能管理8M左右的空间,现在基本淘汰了。FAT16则可以管理2G的空间通过特殊处理也能管理2G以上的空间,而FAT32则能管理到2TB(2048GB)的空间。FAT32较FAT16的优势还在于FAT32采用了更小的簇,可以更有效的保存信息,而不会造成较多的浪费。XP在SD卡里面建立的文件系统最常用的也就是FAT16和FAT32。这是由XP在格式化SD卡的时候建立的,通常SD卡上的数据信息由MBR、DBR、FAT、FDT和数据区5个部分组成(有的也没有MBR)。我们以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表记录了每个文件的位置和区域,是一种链式结构,FAT以“F8FFFF0FFFFFFFFF”这样的8个字节为表头,用以表示FAT表的开始,后面的数据每四个字节为一个簇项(从第2簇开始),用来标记下一个簇所在的位置,这样每个位置都存储了下一个簇,只要按着这个表走,就可以找到文件的所有内容。如果找到下一个簇位置,里面记录的是“FFFFFF0F”,代表这个文件到此就结束了,没有后续簇了,这样一个文件的读取就结束了。FDT称为文件根目录表,这个区域固定为32个扇区,假设每个扇区为512个字节,那么更目录下最多存放512个文件(假设都用短文件名存储,每个短文件名占32个字节)。文件目录表是另一个重要的部分,FAT文件系统中(仅以短文件名介绍),文件目录项在目录表下以32个字节的方式记录,各字段定义如下表41文件目录项各字节定义从上表可知,我们在文件的目录项就可以找到该文件的其实簇,然后在FAT表里面找到该簇开始的下一个簇,依次读取这些簇就可以把整个文件读出来了。422图像解码与显示4221BMP文件格式BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选LBIT、4BIT、8BIT及24BIT。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。典型的BMP图像文件由三部分组成位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。部分代码/BMP信息头TYPEDEF_PACKEDSTRUCTDWORDBISIZE/说明BITMAPINFOHEADER结构所需要的字数。LONGBIWIDTH/说明图象的宽度,以象素为单位LONGBIHEIGHT/说明图象的高度,以象素为单位WORDBIPLANES/为目标设备说明位面数,其值将总是被设为1WORDBIBITCOUNT/说明比特数/象素,其值为1、4、8、16、24、或32DWORDBICOMPRESSION/说明图象数据压缩的类型。其值可以是下述值之一DWORDBISIZEIMAGE/说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0LONGBIXPELSPERMETER/说明水平分辨率,用象素/米表示LONGBIYPELSPERMETER/说明垂直分辨率,用象素/米表示DWORDBICLRUSED/说明位图实际使用的彩色表中的颜色索引数DWORDBICLRIMPORTANT/说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。BITMAPINFOHEADER/BMP头文件TYPEDEF_PACKEDSTRUCTWORDBFTYPE/文件标志只对BM,用来识别BMP位图类型DWORDBFSIZE/文件大小,占四个字节WORDBFRESERVED1/保留WORDBFRESERVED2/保留DWORDBFOFFBITS/从文件开始到位图数据BITMAPDATA开始之间的的偏移量BITMAPFILEHEADER/彩色表TYPEDEF_PACKEDSTRUCTBYTERGBBLUE/指定蓝色强度BYTERGBGREEN/指定绿色强度BYTERGBRED/指定红色强度BYTERGBRESERVED/保留,设置为0RGBQUAD/位图信息头TYPEDEF_PACKEDSTRUCTBITMAPFILEHEADERBMFHEADERBITMAPINFOHEADERBMIHEADERBITMAPINFO/解码这个BMP文件BOOLBMPDECODEFILEINFOSTRUCTBMPFILENAMEU16COUNTU8RGB,COLOR_BYTEU16X,Y,COLOR,TMP_COLORU16UITEMP/X轴方向像素计数器U16COUNTPIX0/记录像素U8REALX0U16REALY0/X,Y的实际坐标U8YOK1BITMAPINFOPBMP/临时指针CURFILEBMPFILENAMEF_OPENCURFILE/打开文件F_READCURFILE,JPG_BUFFER/读出512个字节PBMPBITMAPINFOJPG_BUFFER/得到BMP的头部信息COUNTPBMPBMFHEADERBFOFFBITS/数据偏移,得到数据段的开始地址COLOR_BYTEPBMPBMIHEADERBIBITCOUNT/8/彩色位16/24/32PICINFOIMGHEIGHTPBMPBMIHEADERBIHEIGHT/得到图片高度PICINFOIMGWIDTHPBMPBMIHEADERBIWIDTH/得到图片宽度/水平像素必须是4的倍数IFPICINFOIMGWIDTHCOLOR_BYTE4UITEMPPICINFOIMGWIDTHCOLOR_BYTE/414ELSEUITEMPPICINFOIMGWIDTHCOLOR_BYTEAI_DROW_INIT/初始化智能画图/开始解码BMPX0YPICINFOIMGHEIGHTRGB0REALYYPICINFODIV_FAC/10000WHILE1WHILECOUNT3COLOR|TMP_COLORBREAKCASE1TMP_COLORJPG_BUFFERCOUNT2TMP_COLOR3TMP_COLOR5TMP_COLOR3BREAKCASE1TMP_COLORJPG_BUFFERCOUNTTMP_COLOR2COLOR|TMP_COLOR3COLOR|TMP_COLORUITEMP/水平方向像素值到了换行YIFYPICINFOIMGWIDTHSIZEJ0SIZEISAMPRATE_Y_V8IFSIZEJ0RETURNFUNCRET/智能画图/FILENAME要显示的图片文件BMP/JPG/JPEG/SX,SY开始显示的坐标点/EX,EY结束显示的坐标点/图片在开始和结束的坐标点范围内显示BOOLAI_LOADPICFILEFILEINFOSTRUCTFILENAME,U16SX,U16SY,U16EX,U16EYINTFUNCRET/返回值/得到显示方框大小IFEYSYPICINFOS_HEIGHTEYSYELSEPICINFOS_HEIGHTSYEYIFEXSXPICINFOS_WIDTHEXSXELSEPICINFOS_WIDTHSXEX/显示区域无效IFPICINFOS_HEIGHT0|PICINFOS_WIDTH0PICINFOS_HEIGHTLCD_HPICINFOS_WIDTHLCD_WRETURNFALSE/显示的开始坐标点PICINFOS_YOFFSYPICINFOS_XOFFSXCURFILEFILENAME/文件名传递IFCURFILEF_TYPET_BMP/得到一个BMP图像FUNCRETBMPDECODECURFILE/得到一个BMP图像RETURNFUNCRETELSEIFCURFILEF_TYPET_JPG|CURFILEF_TYPET_JPEG/得到JPG/JPEG图片F_OPENCURFILE/得到JPEG/JPG图片的开始信息/开始时读入1024个字节到缓存里面方便后面提取JPEG解码的信息F_READCURFILE,JPG_BUFFER/读第一次F_READCURFILE,JPG_BUFFER512/读第二次INITTABLE/初始化各个数据表IFFUNCRETINITTAGFUNC_OKRETURNFALSE/初始化表头不成功IFSAMPRATE_Y_H0|SAMPRATE_Y_V0RETURNFALSE/采样率错误AI_DROW_INIT/初始化PICINFODIV_FAC,启动智能画图FUNCRETDECODE/解码JPEG开始ELSERETURNFALSE/非图片格式IFFUNCRETFUNC_OKRETURNTRUE/解码成功ELSERETURNFALSE/解码失败此部分代码包含了JPEG/JPG以及BMP的解码代码,解码通过AI_LOADPICFILE函数来实现,在该函数里面先判断文件的类型,然后调用不同的解码函数,解码JPEG由DECODE函数实现,而解码BMP则由BMPDECODE函数实现。AI_LOADPICFILE函数会将图片以合适的大小显示在液晶上(总是不会超过你给定的区域),对比输入尺寸大的图片,会自动压缩。解码图片完成后返回解码是否成功的信息。423时钟显示实时时钟(RTC)是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。RTC模块和时钟配置系统RCC_BDCR寄存器是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域BKP的意外写操作,所以在要设置时间之前,先要取消备份区域(BKP)写保护。RTC由两个主要部分组成见下图42。第一部分APB1接口用来和APB1总线相连。此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作。APB1接口由APB1总线时钟驱动,用来与APB1总线连接。另一部分RTC核心由一组可编程计数器组成,分成两个主要模块。第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器RTC预分频器。如果在RTC_CR寄存器中设置了相应的允许位,则在每个TR_CLK周期中RTC产生一个中断秒中断。第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间,一个32位的时钟计数器,按秒钟计算,可以记录4294967296秒,约合136年左右,作为一般应用,这已经是足够了的。RTC还有一个闹钟寄存器RTC_ALR,用于产生闹钟。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。图42RTC简化框图RTC内核完全独立于RTCAPB1接口,而软件是通过APB1接口访问RTC的预分频值、计数器值和闹钟值的。但是相关可读寄存器只在RTCAPB1时钟进行重新同步的RTC时钟的上升沿被更新,RTC标志也是如此。这就意味着,如果APB1接口刚刚被开启之后,在第一次的内部寄存器更新之前,从APB1上的RTC寄存器值可能被破坏了(通常读到0)。因此,若在读取RTC寄存器曾经被禁止的RTCAPB1接口,软件首先必须等待RTC_CRL寄存器的RSF位(寄存器同步标志位,BIT3)被硬件置1。接下来,我们介绍一下RTC相关的几个寄存器。首先要介绍的是RTC的控制寄存器,RTC总共有2个控制寄存器RTC_CRH和RTC_CRL,两个都是16位的。RTC_CRH的各位描如下图43寄存器RTC_CRH各位描述该寄存器用来控制中断的,我们将要用到秒钟中断,所以该寄存器必须设置最低位为1,以允许秒钟中断。我们再看看RTC_CRL寄存器。该寄存器各位描述如下图所示图44寄存器RTC_CRL各位描述本设计我们用到的是该寄存器的0、35这几个位,第0位是秒钟标志位,我们在进入闹钟中断的时候,通过判断这位来决定是不是发生了秒钟中断。然后必须通过软件将该位清零(写0)。第3位为寄存器同步标志位,我们在修改控制寄存器RTC_CRH/CRL之前,必须先判断该位,是否已经同步了,如果没有则等待同步,在没同步的情况下修改RTC_CRH/CRL的值是不行的。第4位为配置标位,在软件修改RTC_CNT/RTC_ALR/RTC_PRL的值的时候,必须先软件置位该位,以允许进入配置模式。第5位为RTC操作位,该位由硬件操作,软件只读。通过该位可以判断上次对RTC寄存器的操作是否完成,如果没有,我们必须等待上一次操作结束才能开始下一次操作。第二个要介绍的寄存器是RTC预分频装载寄存器,也有2个寄存器组成,RTC_PRLH和RTC_PRLL。这两个寄存器用来配置RTC时钟的分频数的,比如我们使用外部32768K的晶振作为时钟的输入频率,那么我们要设置这两个寄存器的值为32767,以得到一秒钟的计数频率。RTC_PRLH的各位描述如下图45寄存器RTC_PRLH各位描述RTC_PRLL的各位描述如下图46寄存器RTC_PRLL各位描述在介绍完这两个寄存器之后,我们介绍RTC预分频器余数寄存器,该寄存器也有2个寄存器组成RTC_DIVH和RTC_DIVL,这两个寄存器的作用就是用来获得比秒钟更为准确的时钟,比如可以得到01秒,或者001秒等。该寄存器的值是自减的,用于保存还需要多少时钟周期获得一个秒信号。在一次秒钟更新后,由硬件重新装载。这两个寄存器和RTC预分频装载寄存器的各位是一样的,这里我们就不列出来了。接着要介绍的是RTC最重要的寄存器,RTC计数器寄存器。该寄存器由2个16位的寄存器组成RTC_CNTH和RTC_CNTL,总共32位,用来记录秒钟值(一般情况下)。此两个计数器也比较简单,我们也不多说了。注意一点,在修改这个寄存器的时候要先进入配置模式。最后我们介绍RTC部分的最后一个寄存器,RTC闹钟寄存器,该寄存器也是由2个16为的寄存器组成RTC_ALRH和RTC_ALRL。总共也是32位,用来标记闹钟产生的时间(以秒为单位),如果RTC_CNT的值与RTC_ALR的值相等,并使能了中断的话,会产生一个闹钟中断。该寄存器的修改也要进入配置模式才能进行。因为我们使用到备份寄存器来存储RTC的相关信息(我们这里主要用来标记时钟是否已经经过了配置),我们这里顺便介绍一下STM32的备份寄存器。备份寄存器是42个16位的寄存器(大容量产品才有,我们使用的是STM32F103RBT6,属于小容量产品,只有10个16为的寄存器),可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下操作可以使能对备份寄存器和RTC的访问1)通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟2)电源控制寄存器PWR_CR的DBP位来使能对后备寄存器和RTC的访问。我们一般用BKP来存储RTC的校验值或者记录一些重要的数据,相当于一个EEPROM,不过这个EEPROM并不是真正的EEPROM,而是需要电池来维持它的数据。关于BKP的详细介绍请看STM32参考手册的第47页的51节。最后,我们还要介绍一下备份区域控制寄存器RCC_BDCR。该寄存器的个位描述如下图47寄存器RCC_BDCR各位描述RTC的时钟源选择及使能设置都是通过这个寄存器来实现的,所以我们在RTC操作之前先要通过这个寄存器选择RTC的时钟源,然后才能开始其他的操作。RTC正常工作的一般配置步骤如下1)使能电源时钟和备份区域时钟。前面已经介绍了,我们要访问RTC和备份区域就必须先使能电源时钟和备份区域时钟。这个通过RCC_APB1ENR寄存器来设置。2)取消备份区写保护。要向备份区域写入数据,就要先取消备份区域写保护(写保护在每次硬复位之后被使能),否则是无法向备份区域写入数据的。我们需要用到向备份区域写入一个字节,来标记时钟已经配置过了,这样避免每次复位之后重新配置时钟。3)复位备份区域,开启外部低速振荡器在取消备份区域写保护之后,我们可以先对这个区域复位,以清除前面的设置,当然这个不要每次都执行,因为备份区域的复位将导致之前存在的数据丢失,所以要不要复位,要看情况而定。然后我们使能外部低速振荡器,注意这里一般要先判断RCC_BDCR的LSERDY位来确定低速振荡器已经就绪了才开始下面的操作。4)选

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论