基于stm32的數(shù)碼相框設計與實現(xiàn)本科學位論文_第1頁
基于stm32的數(shù)碼相框設計與實現(xiàn)本科學位論文_第2頁
基于stm32的數(shù)碼相框設計與實現(xiàn)本科學位論文_第3頁
基于stm32的數(shù)碼相框設計與實現(xiàn)本科學位論文_第4頁
基于stm32的數(shù)碼相框設計與實現(xiàn)本科學位論文_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

北京郵電大學畢業(yè)設計第一章緒論引言1.11數(shù)碼相框的技術背景嵌入式是以應用為中心,以計算機技術為基礎,軟件硬件可裁剪適合于應用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統(tǒng)。嵌入式系統(tǒng)無疑是當前最熱門最有發(fā)展前途的作為如今最有發(fā)展前途的IT應用領域之一。嵌入式系統(tǒng)一般用在一些專用設備上,通常這些設備的硬件資源(如處理器、存儲器等)非常有限,并且對成本很敏感、對成本很敏感,有時對實時響應要求很高。特別是隨著消費家電的智能化,嵌入式更顯重要。像我們平常常見到的手機、PDA、電子字典、可視電話、VCD/DVD/、MP3播放器、數(shù)碼相機、數(shù)字攝像機、U-Disk、機頂盒、高清電視、游戲機、智能玩具、交換機、路由器、數(shù)控設備、汽車電子、家電控制系統(tǒng)、醫(yī)療儀器、航天航空設備等等都是典型的嵌入式產(chǎn)品。隨著數(shù)字攝影的興起不可避免地引起了數(shù)碼相框產(chǎn)業(yè)得以的發(fā)展,因為僅有不到35%的數(shù)碼照片被打印出來。數(shù)碼相框的基本原理就是采用普通相框的造型是,將把原來相框中間放的照片的部分換成了液晶顯示屏,外加配上電源,存儲介質(zhì)等,使得同一個相框內(nèi)可以循環(huán)播放照片比普通相框的優(yōu)勢是在同一個相框內(nèi)可以循環(huán)播放照片,比普通照片的單一顯示功能更有優(yōu)勢。此外,本設計屬于數(shù)字影音娛樂產(chǎn)品,需要較為強勁的處理器進行圖像解碼的工作,而STM32具有超低的價格、超多的外設、豐富的型號、優(yōu)異的實時性能、杰出的功耗控制和極低的開發(fā)成本等特點。因此,進行基于STM32平臺的數(shù)碼相框系統(tǒng)的設計具有重要的理論意義和實用價值。1.2數(shù)碼相框的市場背景市場方面,自從2007年開始,數(shù)碼相框的市場關注度開始激增。在2008年開始,數(shù)碼相框市場就呈現(xiàn)出了高速發(fā)展的態(tài)勢,并一直持續(xù)至今,因此本課題的研究具有極高的商業(yè)潛在市場價值與意義。1.2.1數(shù)碼相框的發(fā)展現(xiàn)狀數(shù)碼相框產(chǎn)品的首次出現(xiàn)是在是2001年開始出現(xiàn)的,但直至2003年市場都一直低迷,由于當時消費者的接受度及價格過高的因素其原因在于產(chǎn)品的價格過高,使這一市場一直到2003年都很低迷。之后在隨著主要器件價格的下降等因素的促使下,數(shù)碼相框的價格也逐步下降其價格也得以下降,于是市場自在2004年開始有了起色,尤其在2005年,數(shù)碼相框產(chǎn)品開始在歐美熱銷,但出貨量也只有150萬臺左右,到了2006年的出貨量同比上漲133%,為280萬臺,2007年的出貨量同比上漲185%,為800萬臺,預計到2011年出貨量將達到4000萬臺。從屏幕尺寸來看,2006年5-6.9英寸產(chǎn)品占主流,2007年7、8、9英寸產(chǎn)品成為最大市場。預計2011年,7、8、9英寸產(chǎn)品的供貨比例將持續(xù)保持首位,而平均銷售單價將以每年16.5%左右的速度降低。2006年以前,中國生產(chǎn)的數(shù)碼相框絕大多數(shù)出口國外。2005年底Philips率先將數(shù)碼相框在中國推廣,在禮品市場上取得了一些成績,但由于銷售價格較高,約為2050元/臺,這一年中國數(shù)碼相框的銷售量僅有1.7萬臺。2006年下半年,開始有更多的國內(nèi)廠商在中國市場推出數(shù)碼相框,因而也帶動了此產(chǎn)品價格的下降,這一年的平均售價為1150元/臺,仍然較高,市場也以商務禮品為主,但由于2005年銷售量的基數(shù)較低,2006年的銷售量同比增長了470.6%,達到9.7萬臺。直到2007年下半年,業(yè)界才感到這個一直處于培育期的市場,開始了真正的起飛。這得益于對數(shù)碼相框產(chǎn)品認知度的提高、價格的下滑和需求量的提高。從IT廠商來看,僅2007年下半年以來,就有惠普、三星、優(yōu)派、AOC、明基、柯達、長城等眾多新軍加入數(shù)碼相框陣營。其中,巨頭惠普2007年7月底在美國宣布進入數(shù)碼相框市場,2007年數(shù)碼相框出貨量設定為50萬臺。除新軍外,數(shù)碼相框老牌勁旅的出貨量表現(xiàn)也令業(yè)界振奮,如飛利浦2006年數(shù)碼相框出貨量達到50萬臺,而2007年上半年出貨量已達去年總和,2007年全年出貨量達150萬臺。而從上游面板廠商的動作來看,也顯示出樂觀的發(fā)展態(tài)勢。中華映管、群創(chuàng)等廠商均顯著調(diào)高了配套數(shù)碼相框產(chǎn)品的中尺寸面板的出貨量目標,2007年出貨量達1000萬臺,預計2008年更將倍增至2000萬臺。其中,中華映管目前已調(diào)配一座4.5代面板廠來支持生產(chǎn)中尺寸面板,主要生產(chǎn)可攜式DVD播放機面板與數(shù)碼相框面板,其數(shù)碼相框面板以7英寸、8英寸、10.2英寸為主要尺寸,數(shù)碼相框面板占其中尺寸面板的比重提高到40%。1.2.2數(shù)碼相框的發(fā)展趨勢從長遠來看,2008年及今后幾年將為處在數(shù)碼相框產(chǎn)品供應鏈的各企業(yè)帶來巨大的商機。未來幾年,數(shù)碼相框的市場將處在逐漸步入走向成熟期的階段,其產(chǎn)銷量和市場需求依然將仍會保持大幅度的增長,在未來的三年內(nèi),市場尚無萎縮的可能。從技術上來說,未來數(shù)碼相框的發(fā)展將向兩極分化。一部分產(chǎn)品著重強調(diào)基本功能和低成本,整合家庭中的鬧鐘、日歷和裝飾功能,這些產(chǎn)品走的是低成本路線,以展示照片為主,追求圖像的品質(zhì)及幻燈片播放特效,已成為DC/DV的附屬物;另一部分產(chǎn)品將會添加一些新的功能,如WiFi,還可即時報告天氣、股票等信息,從而有望成為“桌面信息中心”。此外,觸摸面板會成為一個應用的新亮點。從產(chǎn)品形態(tài)上來說,數(shù)碼相框的市場將會有非常明確的細分。1數(shù)碼相框:這將是以數(shù)字照片的重顯為主要功能的產(chǎn)品,其功能更接近于傳統(tǒng)意義上的相框。由于人機界面的限制,為了更方便的重顯和瀏覽以及確定重顯的規(guī)則,這類產(chǎn)品并不強調(diào)有大容量的內(nèi)存以及豐富的存儲卡接口,這類產(chǎn)品的主要特征是:1)支持USBDevice&Host以便于更新和同步數(shù)據(jù)。2)在某些情況下(如從PC端通過相框的USBDevice同步數(shù)據(jù)),允許修改數(shù)字照片的格式使得有最佳的重顯效果。3)僅依靠內(nèi)置的半導體存儲器存放需要重顯的數(shù)字照片。4)文件(照片)查詢和播放規(guī)則設定非常簡潔易用。5)產(chǎn)品大致分為桌面和壁掛兩種。2數(shù)碼相冊:這是以數(shù)字照片的存儲和瀏覽為主要功能的產(chǎn)品,由于需要滿足跟PC相類似功能,所以這類產(chǎn)品的主要特征是:1)有大容量的內(nèi)置數(shù)據(jù)存儲器。2)支持USBDevice&Host及各種存儲卡接口,并支持內(nèi)部存儲器與各種數(shù)據(jù)存儲器之間的同步以及相互拷貝。3)強大的文件管理功能:瀏覽,搜尋,命名(重命名),復制,刪除,備份等。4)帶或不帶內(nèi)建顯示單元,有能支持其它高分辨率顯示設備的接口(如色差,VGA甚至是HDMI)。1.3本課題設計主要研究內(nèi)容與特點1.3.1本課題的主要研究內(nèi)容本課題是基于ARM單片機STM32F103RBT6的存儲程序控制,從SD卡讀取圖片,解碼之后輸出到TFT-LCD(薄膜晶體管液晶顯示器)TFT-LCD上顯示,同時通過按鍵可以切換到時間模式。實現(xiàn)了對SD卡里多幅圖片以幻燈片形式在TFT屏上動態(tài)顯示的效果。1)硬件資料的研究;2)軟件方案的選擇與論證;3)軟件運行與調(diào)試;1.3.2本設計的主要特點從以往的市場發(fā)展來看,但數(shù)碼相框產(chǎn)品市場化的兩大阻礙因素為:一是價格;二是應用功能。低廉的價格將贏得更多顧客的青睞,拓展應用空間指的是而根據(jù)中國消費者的需求和特點,開發(fā)出相應的應用產(chǎn)品。STM32具有超低的價格、超多的外設、豐富的型號、優(yōu)異的實時性能、杰出的功耗控制和極低的開發(fā)成本等超低的價格:以8位機的價格,得到32位機,是STM32最大的優(yōu)勢。極低的開發(fā)成本:STM32的開發(fā)不需要昂貴的仿真器,只需要一個串口即可下載代碼,并且支持SWD和JTAG兩種調(diào)試口。SWD調(diào)試可以為您的設計帶來跟多的方便,只需要2個IO口,即可實現(xiàn)仿真調(diào)試。超多的外設:STM32擁有包括:FSMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、ADC、DAC、RTC、DMA等眾多外設及功能,具有極高的集成度。豐富的型號:STM32擁有F101、F102、F103、F105、F107等5個系列數(shù)十種型號,具有QFN、LQFP、BGA等封裝可供選擇。優(yōu)異的實時性能:84個中斷,16級可編程優(yōu)先級,并且所有的引腳都可以作為中斷輸入。杰出的功耗控制:STM32各個外設都有自己的獨立時鐘開關,可以通過關閉相應外設的時鐘來降低功耗。第二章硬件介紹2.1嵌入式系統(tǒng)概況2.1.1嵌入式系統(tǒng)的定義雖然嵌入式系統(tǒng)是近幾年才風靡起來的,但其歷史可追溯到20世紀70年代。經(jīng)過30多年的發(fā)展,在硬件和軟件交替發(fā)展的支撐下,嵌入式技術逐漸趨于穩(wěn)定和成熟,已被廣泛應用于工業(yè)控制、交通管理、信息家電、家庭智能管理系統(tǒng)、POS網(wǎng)絡及電子商務、環(huán)境檢測、機器人等各個領域。毫不夸張的說,嵌入式系統(tǒng)已經(jīng)無所不在,所以研究和開發(fā)嵌入式系統(tǒng)有著十分重要的意義。根據(jù)IEEE(國際電氣和電子工程師協(xié)會)的定義,嵌入式系統(tǒng)是“控制、監(jiān)視或輔助設備、機器和車間運行的裝置”,這主要是從應用上加以定義的。不過,上述定義并不能充分體現(xiàn)出嵌入式系統(tǒng)的精髓。目前,國內(nèi)一個普遍被認同的定義是:以應用為中心、以計算機為基礎,軟、硬件可裁減,適應應用系統(tǒng)對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統(tǒng)。廣義地講,凡是不用于通用目的的可編程計算機設備,就可以算是嵌入式計算機系統(tǒng)。狹義上而言,嵌入式系統(tǒng)是指以應用為核心,以計算機技術為基礎,軟硬件可裁剪,適于應用系統(tǒng)對功能、可靠性、成本、體積和功耗嚴格要求的專用計算機系統(tǒng)??偟膩碚f,嵌入式系統(tǒng)是一個外延極廣的概念,凡是與產(chǎn)品結合在一起的、具有嵌入式系統(tǒng)特點的系統(tǒng)都可以稱為嵌入式系統(tǒng)??梢詮囊韵聨讉€方面來理解嵌入式系統(tǒng)的含義:嵌入式系統(tǒng)是面向用戶、面向產(chǎn)品、面向應用的,必須與具體應用相結合才會具有生命力。正因為與具體應用的緊密結合,嵌入式系統(tǒng)才具有很強的專用性。嵌入式系統(tǒng)將先進的半導體技術、計算機技術和電子技術,以及各個行業(yè)的具體應用相結合,是一個技術密集、資金密集、學科交叉和不斷創(chuàng)新的知識集成系統(tǒng)。嵌入式系統(tǒng)必須根據(jù)應用需要對硬件和軟件進行裁剪,以滿足應用系統(tǒng)對功能、可靠性、成本、體積和功耗的要求。2.1.2嵌入式系統(tǒng)的組成通常來說,嵌入式系統(tǒng)可以劃分成硬件和軟件兩部分。嵌入式硬件由嵌入式微處理器、片內(nèi)周邊電路和外部設備三部分組成。嵌入式微處理器是嵌入式硬件系統(tǒng)的核心,直接影響嵌入式產(chǎn)品的應用范圍和開發(fā)復雜度。典型的嵌入式微處理器有Motorola公司的PowerPC系列、Intel公司的StrongArm系列、AMD公司的X86系列以及EPSON公司的SIC33系列等。嵌入式軟件一般由連接硬件和應用程序的嵌入式實時操作系統(tǒng)(Real-timeoperatingSystem,簡稱RTOS)和在其上運行的應用軟件構成。①嵌入式處理器嵌入式處理器是嵌入式系統(tǒng)的核心部件,是控制、輔助系統(tǒng)運行的硬件單元,其功能和性能影響著整個系統(tǒng)的功能、性能和設計。嵌入式處理器的選擇也制約著其配套的外圍器件及操作系統(tǒng)的選擇。嵌入式處理器的種類繁多、數(shù)量龐大。目前世界上嵌入式處理器的種類數(shù)量已經(jīng)超過1000種,流行的體系結構有30多個系列。嵌入式微處理器具有體積小、重量輕、成本低、可靠性高等優(yōu)點,因此得到了廣泛應用。目前這樣的嵌入式處理器類型有ARM、MIPS、MC6800、386EX、PowerPC等系列,其中以ARM的應用最為廣泛。嵌入式處理器可以分為四類,即嵌入式微處理器(EmbeddedMicroprocessorUnit,EMPU),如ARM嵌入式微控制器(MicrocontrollerUnit,MCU)嵌入式DSP處理器(EmbeddedDigitalSignalProcessor,EDSP)嵌入式片上系統(tǒng)(SystemOnChip)②嵌入式外圍設備這里所說的嵌入式外圍設備,指在一個嵌入式硬件系統(tǒng)中,.除了中心控制部件(MCU,DSP,EMPU,SOC)以外的完成存儲、通信、保護、調(diào)試、顯示等輔助功能的其他部件。根據(jù)外圍設備的功能可分為以下三類,即:存儲器類型:靜態(tài)易失型存儲器(RAM,SRAM)、動態(tài)存儲器(DRAM)、非易失型存儲器(ROM,EPROM,EEPROM,F(xiàn)LASH)。其中,因為FLASH可以擦寫多次,存儲速度快,容量大,價格便宜在嵌入式領域應用廣泛。接口類型:目前存在的所有接口在嵌入式領域都應用廣泛,如RS-232(串口)、IRDA(紅外線接口)、SPI(串行外圍設備接口)、I2C(現(xiàn)場總線接口)、USB(通用串行接口)、Ethernet(以太接口)和普通并口。顯示類型:CRT,LCD和觸摸屏等外圍設備。2.1.3嵌入式系統(tǒng)的特點嵌入式系統(tǒng)具有以下幾個重要特征:①系統(tǒng)內(nèi)核小,由于嵌入式系統(tǒng)一般應用于小型電子裝置,系統(tǒng)資源相對有限,所以內(nèi)核較之傳統(tǒng)的操作系統(tǒng)要小得多。比如,ENEA公司的OSE分布式系統(tǒng),內(nèi)核只有5KB,而Windows的內(nèi)核則要大得多。②專用性強,嵌入式系統(tǒng)的個性化很強,其中的軟件系統(tǒng)和硬件結合非常緊密,一般要針對硬件進行系統(tǒng)的移植,同時針對不同的任務,往往需要對系統(tǒng)進行較大的更改。另外,程序的編譯下載要和系統(tǒng)相結合。③嵌入式系統(tǒng)一般沒有系統(tǒng)軟件和應用軟件的明顯區(qū)分,不要求其功能的設計及實現(xiàn)過于復雜,這樣既利于控制系統(tǒng)成本,也利于實現(xiàn)系統(tǒng)安全。④高實時性的操作系統(tǒng)軟件是嵌入式軟件的基本要求,而且軟件要求固化存儲,以提高速度,軟件代碼要求高質(zhì)量和高可靠性。⑤嵌入式軟件開發(fā)要想走向標準化,就必須使用多任務操作系統(tǒng)。嵌入式系統(tǒng)的應用程序可以沒有操作系統(tǒng)而直接在芯片上運行,但為了更合理的調(diào)度多任務,利用系統(tǒng)資源、系統(tǒng)函數(shù),用戶必須自行選配RTOS開發(fā)平臺。⑥執(zhí)行的實時性、可靠性,并減少開發(fā)時間,保障軟件質(zhì)量。嵌入式系統(tǒng)開發(fā)需要專門的開發(fā)工具和環(huán)境。由于嵌入式系統(tǒng)本身不具備自主開發(fā)能力,即使完成設計后,用戶通常也不能對其中的程序功能進行修改,因此必須有一套基于通用計算機的開發(fā)工具和環(huán)境才能進行開發(fā)。2.2數(shù)碼相框模塊2.2.1MCU主控模塊STM32系列閃存微控制器是意法半導體公司(ST)基于ARM公司具有突破性的Cortex-M3內(nèi)核的處理器,該處理器是專門設計于滿足集高性能、低功耗、實時應用、具有競爭性價格于一體的嵌入式領域的要求。此次設計采用的具體型號是STM32F103RBT6,如圖2-1所示。圖2-SEQ圖\*ARABIC1STM32F103RBT6處理器STM32F103RBT6嵌入式處理器具有以下特點:32位RISC性能處理器;32位ARMCortex-M3結構優(yōu)化;72MHZ運行頻率,單周期訪問時速度可達1.25DMIPS/MHz;硬件除法和單周期乘法;快速可嵌套中斷,6~12個時鐘周期;具有MPU保護設定訪問規(guī)則;片內(nèi)具有256KBFLASH,48KBRAM;80個快速I/O端口,16個I/O可映射到外部中斷,幾乎所有的I/O可以忍受5V電壓;片上集成12BitA/D、D/A、PWM、CAN、USB、SDIO、FSMC等資源;ARMCortex-M3是一種基于ARM7v架構的最新ARM嵌入式內(nèi)核,它采用哈佛結構,使用分離的指令和數(shù)據(jù)總線(馮諾伊曼結構下,數(shù)據(jù)和指令共用一條總線)。從本質(zhì)上來說,哈佛結構在物理上更為復雜,但是處理速度明顯加快。根據(jù)摩爾定理,復雜性并不是一件非常重要的事,而吞吐量的增加卻極具價值。除了使用哈佛結構,Cortex-M3還具有其它顯著的優(yōu)點:具有更小的基礎內(nèi)核,價格更低,速度更快。與內(nèi)核集成在一起的是一些系統(tǒng)外設,如中斷控制器、總線矩陣、調(diào)試功能模塊,而這些外設通常都是由芯片制造商增加的。Cortex-M3還集成了睡眠模式和可選的完整的八區(qū)域存儲器保護單元,只支持最新的Thumb-2指令集,最大限度降低了匯編器使用率。Cortex-M3這樣設計的優(yōu)勢在于:免去Thumb和ARM代碼的互相切換,對于早期的處理器來說,這種狀態(tài)切換會降低性能。Thumb-2指令集的設計是專門面向C語言的,且包括If/Then結構(預測接下來的四條語句的條件執(zhí)行)、硬件除法以及本地位域操作。Thumb-2指令集允許用戶在C代碼層面維護和修改應用程序,C代碼部分非常易于重用。Thumb-2指令集也包含了調(diào)用匯編代碼的功能:Luminary公司認為沒有必要使用任何匯編語言。綜合以上這些優(yōu)勢,新產(chǎn)品的開發(fā)將更易于實現(xiàn),上市時間也大為縮短。STM32F103RBT6的資源完全滿足此次的嵌入式數(shù)碼相框設計,通過設計電路開發(fā)一個支持TFT彩色液晶屏的驅(qū)動電路,在設計中搭配2.8寸TFT真彩觸摸屏模塊作為顯示界面,同時支持一個SD卡(SPI方式)可用于存儲圖片、數(shù)據(jù)等。2.2.2LCD模塊ThinFilmTransistor(薄膜場效應晶體管),是指液晶顯示器上的每一液晶象素點都是由集成在其后的薄膜晶體管來驅(qū)動。從而可以做到高速度、高亮度、高對比度顯示屏幕信息,TFT-LCD(薄膜晶體管液晶顯示器)是多數(shù)液晶顯示器的一種。TFT屏幕的優(yōu)點如下:大面積。九十年代初第一代大面積玻璃基板(300mm×400mm)TFT-LCD生產(chǎn)線投產(chǎn),到2000年上半年玻璃基板的面積已經(jīng)擴大到了680mm×880mm),最近950mm×1200mm的玻璃基板也將投入運行。高集成度。用于液晶投影的1.3英寸TFT芯片的分辨率為XGA含有百萬個象素。分辨率為SXGA(1280×1024)的16.1英寸的TFT陣列非晶體硅的膜厚只有50nm,以及TABONGLASS和SYSTEMONGLASS技術,其IC的集成度,對設備和供應技術的要求,技術難度都超過傳統(tǒng)的LSI。功能強大。TFT最早作為矩陣選址電路改善了液晶的光閥特性。對于高分辨率顯示器,通過0-6V范圍的電壓調(diào)節(jié)(其典型值0.2到4V),實現(xiàn)了對象元的精確控制,從而使LCD實現(xiàn)高質(zhì)量的高分辨率顯示成為可能。TFT-LCD是人類歷史上第一種在顯示質(zhì)量上超過CRT的平板顯示器。現(xiàn)在人們開始把驅(qū)動IC集成到玻璃基板上,整個TFT的功能將更強大,這是傳統(tǒng)的大規(guī)模半導體集成電路所無法比擬的。低成本。玻璃基板和塑料基板從根本上解決了大規(guī)模半導體集成電路的成本問題,為大規(guī)模半導體集成電路的應用開拓了廣闊的應用空間。工藝靈活。除了采用濺射、CVD(化學氣相沉積)MCVD(分子化學氣相沉積)等傳統(tǒng)工藝成膜以外,激光退火技術也開始應用,既可以制作非晶膜、多晶膜,也可以制造單晶膜。不僅可以制作硅膜,也可以制作其他的Ⅱ-Ⅵ族和Ⅲ-Ⅴ族半導體薄膜。應用領域廣泛。以TFT技術為基礎的液晶平板顯示器是信息社會的支柱產(chǎn)業(yè),技術可應用到正在迅速成長中的薄膜晶體管有機電致發(fā)光(TFT-OLED)平板顯示器也在迅速的成長中。TFT液晶顯示屏亮度好、對比度高、層次感強、顏色鮮艷,其廣泛應用于手機、MP4等消費品。因此,本系統(tǒng)選用2.8英寸TFT-LCD屏(如圖2-2所示)可顯26萬色,分辨率320*240,控制器為ILI9320,采用16位的80并口,配合觸摸屏專用芯片XPT2046,可對屏幕進行觸摸操作,更顯智能化和個性化。為了方便用戶使用,我們存儲方式采用兼容FAT的文件系統(tǒng),同時該文件系統(tǒng)也兼容FAT32等電腦主流的文件系統(tǒng)方式進行存儲。圖2-22.8英寸TFT-LCD模塊該模塊的80并口有如下一些信號線:CS:TFT-LCD片選信號。WR:向TFT-LCD寫入數(shù)據(jù)。RD:從TFT-LCD讀取數(shù)據(jù)。D[15:0]:16位雙向數(shù)據(jù)線。RST:硬復位TFT-LCD。RS:命令/數(shù)據(jù)標志(0,讀寫命令;1,讀寫數(shù)據(jù))。TFT-LCD模塊的RST信號線是直接接到STM32的復位腳上,并不由軟件控制,這樣可以省下來一個I/O口。另外我們還需要一個背光控制線來控制TFT-LCD的背光。所以我們總共需要的I/O口數(shù)目為21個。模塊的控制器為ILI9320(可能為其他型號,但是他們的設置很相似,除了初始化序列有些區(qū)別,其他大都是一摸一樣的,這里僅以9320為例介紹),該控制器自帶顯存,其顯存總大小為172820(240*320*18/8),即18位模式(26萬色)下的顯存量。模塊的16位數(shù)據(jù)線與顯寸的對應關系為565方式,如下圖所示:圖2-316位數(shù)據(jù)與顯存對應關系圖最低5位代表藍色,中間6位為綠色,最高5位為紅色。數(shù)值越大,表示該顏色越深。接下來介紹一下ILI9320的幾個重要命令,因為ILI9320的命令很多,這里不一一介紹。這里我們要介紹的命令列表如下:表2.1ILI9320常用命令表R0,這個命令,有兩個功能,如果對它寫,則最低位為OSC,用于開啟或關閉振蕩器。而如果對它讀操作,則返回的是控制器的型號。這個命令最大的功能就是通過讀它可以得到控器的型號,而我們代碼在知道了控制器的型號之后,可以針對不同型號的控制器,進行不同的初始化。因為93xx系列的初始化,其實都比較類似,我們完全可以用一個代碼兼容好幾個控制器。R3,入口模式命令。我們重點關注的是I/D0、I/D1、AM這3個位,因為這3個位控制了屏幕的顯示方向。AM:控制GRAM更新方向。當AM=0的時候,地址以行方向更新。當AM=1的時候,地址以列方向更新。I/D[1:0]:當更新了一個數(shù)據(jù)之后,根據(jù)這兩個位的設置來控制地址計數(shù)器自動增加/減少1,其關系如下圖:圖2-4GRAM顯示方向設置圖通過這幾個位的設置,我們就可以控制屏幕的顯示方向了。R7,顯示控制命令。該命令CL位用來控制是8位彩色,還是26萬色。為0時26萬色,為1時八位色。D1、D0、BASEE這三個位用來控制顯示開關與否的。當全部設置為1的時候開啟顯示,全0是關閉。我們一般通過該命令的設置來開啟或關閉顯示器,以降低功耗。R32,R33,設置GRAM的行地址和列地址。R32用于設置列地址(X坐標,0~239),R33用于設置行地址(Y坐標,0~319)。當我們要在某個指定點寫入一個顏色的時候,先通過這兩個命令設置到改點,然后寫入顏色值就可以了。R34,寫數(shù)據(jù)到GRAM命令,當寫入了這個命令之后,地址計數(shù)器才會自動的增加和減少。該命令是我們要介紹的這一組命令里面唯一的單個操作的命令,只需要寫入該值就可以了,其他的都是要先寫入命令編號,然后寫入操作數(shù)。R80~R83,行列GRAM地址位置設置。這幾個命令用于設定顯示區(qū)域的大小,我們整個屏的大小為240*320,但是有時候我們只需要在其中的一部分區(qū)域?qū)懭霐?shù)據(jù),如果用先寫坐標,后寫數(shù)據(jù)這樣的方式來實現(xiàn),則速度大打折扣。此時我們就可以通過這幾個命令,在其中開辟一個區(qū)域,然后不停的丟數(shù)據(jù),地址計數(shù)器就會根據(jù)R3的設置自動增加/減少,這樣就不需要頻繁的寫地址了,大大提高了刷新的速度。通過以上介紹,我們可以得出TFT-LCD顯示需要的相關設置步驟如下:1)設置STM32與TFT-LCD模塊相連接的I/O。這一步,先將我們與TFT-LCD模塊相連的I/O口設置為輸出,具體使用哪些I/O口,這里需要根據(jù)連接電路以及TFT-LCD模塊的設置來確定。2)初始化TFT-LCD模塊。通過向TFT-LCD寫入一系列的設置,來啟動TFT-LCD的顯示。為后續(xù)顯示字符和數(shù)字做準備。3)通過函數(shù)將字符和數(shù)字顯示到TFT-LCD模塊上。這里就是通過我們設計的程序,將要顯示的字符送到TFT-LCD模塊就可以了,這些函數(shù)將在軟件設計部分向大家介紹。通過以上三步,我們就可以使用TFT-LCD模塊來顯示字符和數(shù)字了,并且可以顯示各種顏色的背景。2.3SD存儲卡模塊SD卡(SecureDigitalMemoryCard)中文翻譯為安全數(shù)碼卡,是一種基于半導體快閃記憶器的新一代記憶設備,它被廣泛地應用于便攜式裝置上,例如數(shù)碼相機、個人數(shù)碼助理(PDA)和多媒體播放器等。SD卡由日本松下、東芝及美國SanDisk公司于1999年8月共同開發(fā)研制。大小猶如一張郵票的SD記憶卡,重量只有2克,但卻擁有高記憶容量、快速數(shù)據(jù)傳輸率、極大的移動靈活性以及很好的安全性,此外它可存多種格式數(shù)據(jù)文件,具有很強的可擴展性;用戶可方便使用SD卡讀卡器對其進行用戶信息修改。2G金士頓SD卡實物如下圖2-5所示。SD卡一般支持兩種操作模式:SD卡模式與SPI模式。主機可以選擇以上任意一種模式同SD卡通信,SD卡模式允許4線的高速數(shù)據(jù)傳輸。SPI模式允許簡單的通過SPI接口來和SD卡通信,這種模式同SD卡模式相比就是喪失了速度。SD卡的引腳排序如下圖2-6所示:圖2--5KingstonSD卡圖2-6SD卡引腳排序圖SD卡引腳功能描述如下表所示:表2.2SD卡引腳功能表SD卡只能使用3.3V的I/O電平,所以,MCU一定要能夠支持3.3V的I/O端口輸出。在SPI模式下,CS/MOSI/MISO/CLK都需要加10~100K左右的上拉電阻。SD卡要進入SPI模式很簡單,就是在SD卡收到復位命令(CMD0)時,CS為有效電平(低電平)則SPI模式被啟用。不過在發(fā)送CMD0之前,要發(fā)送>74個時鐘,這是因為SD卡內(nèi)部有個供電電壓上升時間,大概為64個CLK,剩下的10個CLK用于SD卡同步,之后才能開始CMD0的操作,在卡初始化的時候,CLK時鐘最大不能超過400KHZ。本次硬件電路板使用的是SPI模式來讀寫SD卡,下面我們就重點介紹一下SD卡在SPI模式下的相關操作。SPI模式下幾個重要的操作命令,如下表所示:表2.3SPI模式下SD卡部分操作指令其中R1的回應格式如下表所示:表2.4SD卡R1回應格式SD卡的典型初始化過程如下:1)初始化與SD卡連接的硬件條件(MCU的SPI配置,I/O口配置);2)上電延時(>74個CLK);3)復位卡(CMD0);4)激活卡,內(nèi)部初始化并獲取卡類型(CMD1(用于MMC卡)、CMD55、CMD41);5)查詢OCR,獲取供電狀況(CMD58);6)是否使用CRC(CMD59);7)設置讀寫塊數(shù)據(jù)長度(CMD16);8)讀取CSD,獲取存儲卡的其他信息(CMD9);9)發(fā)送8CLK后,禁止片選;這樣我們就完成了對SD卡的初始化,這里面我們一般設置讀寫塊數(shù)據(jù)長度為512個字節(jié),并禁止使用CRC。在完成了初始化之后,就可以開始讀寫數(shù)據(jù)了。SD卡讀取數(shù)據(jù),這里通過CMD17來實現(xiàn),具體過程如下:1)發(fā)送CMD17;2)接收卡響應R1;3)接收數(shù)據(jù)起始令牌0XFE;4)接收數(shù)據(jù);5)接收2個字節(jié)的CRC,如果沒有開啟CRC,這兩個字節(jié)在讀取后可以丟掉;6)8CLK之后禁止片選;以上就是一個典型的讀取SD卡數(shù)據(jù)過程,SD卡的寫與讀數(shù)據(jù)差不多,寫數(shù)據(jù)通過CMD24來實現(xiàn),具體過程如下:1)發(fā)送CMD24;2)接收卡響應R1;3)發(fā)送寫數(shù)據(jù)起始令牌0XFE;4)發(fā)送數(shù)據(jù);5)發(fā)送2字節(jié)的偽CRC;6)8CLK之后禁止片選;第三章軟件介紹3.1安裝MDK3.8a(Keil):找到MDK的安裝文件并點擊安裝,點擊之后出現(xiàn)界面,選擇Next:選擇”IAgree…Licenceagreement”同意協(xié)議,選擇安裝目錄,這里選擇安裝的目錄后,點擊Next即可,隨便輸入郵箱之類的信息即可,點擊Next開始安裝,按圖配置,然后點擊Finish,左面會出現(xiàn)keil快捷圖標。圖3-1完成安裝3.2注冊License在MDK針對每臺機會有一個CID,copy這個CID到注冊機處生成LicenseKey,然后再將這個LicenseKey添加到MDK里面去注冊。右鍵點擊左面的MDK快捷方式,選擇“以管理員身份運行”,因為注冊license需要管理員權限。然后會打開MDK,然后默認會有一個名字叫“LPC2129simulator”的Project,暫時我們可以不用理會。點擊:File->LicenseManagement,彈出一個LicenseManagement界面,copy界面中的(CID):圖3-2CID打開光盤下面的注冊機,目錄為:ALIENTEK開發(fā)板資料\軟件\MDK3.80A\注冊下的注冊機。出現(xiàn)注冊界面,黏貼剛才粘貼剛才copy的cid到CID一欄,然后Target選擇ARM圖3-3注冊機選擇好之后點擊“Generate”,下面的空白欄會生成一個LicenseKey,類似:D0DY8-30KAK-0N8AM-X9Z14-A2NWP-J3LZZ,copy這個license.將這個LicenseKey黏貼到粘貼到Keil的LicenseManagement界面的NewLicenseIdCode一欄,然后點擊“AddLIC”,添加成功后會出現(xiàn)成功提示。然后點擊Close關閉這個界面即可。圖3-4粘貼LicenseKey3.3新建工程回到MDK主界面,可以看到工程中有一個默認的工程,點擊這個工程名字,然后選擇菜單Project->CloseProject,就關閉掉這個工程了,!這樣整個MDK就是一個空的了,接下來我們將建立我們的工程模版。在建立工程之前,我們建議用戶在電腦的某個目錄下面建立一個文件夾,后面所建立的工程都可以放在這個文件夾下面,這里我們建立一個文件夾為:STM32-Projects.點擊Keil的菜單:Project–>NewUvisionProject,然后將目錄定位到剛才建立的文件夾STM32-Projecst之下,在這個目錄下面建立子文件夾Tempalte,然后定位到Template目錄下面,我們的工程文件就都保存到Template文件夾下面。工程命名為Template,點擊保存。保存工程界面接下來會出現(xiàn)一個選擇Device的界面,就是選擇我們的芯片型號,這里我們定位到STMicroelectronics下面的STM32F103RB(針對我們的mini板子是這個型號,如果是其他芯片,請選擇對應的型號即可)。?!畧D3-5選擇芯片型號器件選擇界面彈出對話框“CopySTM32StartupCodetoproject….”,詢問是否添加啟動代碼到我們的工程中,這里我們選擇“否”,因為我們使用的ST固件庫文件已經(jīng)包含了啟動文件。可以看到工程建立了,我們回到Template目錄下面,可以看到只有三個文件:圖3-6Template目錄下的文件接下來,我們在Template工程目錄下面,新建3個文件夾CORE,USER,STM32F10x_FWLib。USER用來放我們主函數(shù)文件main.c,以及其他包括system_stm32f10x.c等等,CORE用來存放啟動文件等,STM32F10x_FWLib文件夾顧名思義用來存放ST官方提供的庫函數(shù)源碼文件。圖3-7Template工程目錄下新建的文件下面我們要將官方的固件庫包里的源碼文件復制到我們的工程目錄文件夾下面。打開官方固件庫包,定位到我們之前準備好的固件庫包的目錄STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下面,將目錄下面的src,inc文件夾copy到我們剛才建立的STM32F10x_FWLib文件夾下面。src存放的是固件庫的.c文件,inc存放的是對應的.h文件,您不妨打開這兩個文件目錄過目一下里面的文件,每個外設對應一個.c文件和一個.h頭文件。圖3-8STM32F10x_StdPeriph_Driver文件下面我們要將固件庫包里面相關的啟動文件復制到我們的工程目錄CORE之下。打開官方固件庫包,定位到目錄STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下面,將文件core_cm3.c和文件core_cm3.h復制到CORE下面去。然后定位到目錄STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下面,將里面所有的文件同樣復制到CORE下面。這里我們解釋一下,其實我們只用到arm目錄下面的startup_stm32f10x_md.s文件,這個文件是針對中等容量芯片的啟動文件。其他兩個主要的為startup_stm32f10x_ld.s為小容量,startup_stm32f10x_hs.c為大容量芯片的啟動文件。這里copy進來是方便其他開發(fā)者使用小容量或者大容量芯片的用戶。現(xiàn)在看看我們的CORE文件夾下面的文件:圖3-9CORE文件夾內(nèi)定位到目錄:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x將里面的三個文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,復制到我們的USER目錄之下。然后將STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下面的4個文件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h復制到USER目錄下面。圖3-10USER文件夾內(nèi)前面10個步驟,我們將需要的固件庫相關文件復制到了我們的工程目錄下面,下面我們將這些文件加入我們的工程中去。右鍵點擊Target1,選擇ManageComponentsProjectTargets一欄,我們將Target名字修改為Template,然后在Groups一欄刪掉一個,建立三個Groups:USER,CORE,FWLIB.點擊OK.可以看到我們的Target名字以及Groups情況。圖3-11Target名字以及Groups情況下面我們往Group里面添加我們需要的文件。我們按照步驟12的方法,右鍵點擊點擊Tempate,選擇選擇ManageComponents.然后選擇需要添加文件的Group,這里第一步我們選擇FWLIB,然后點擊右邊的AddFiles,定位到我們剛才建立的目錄STM32F10x_FWLib/src下面,將里面所有的文件選中(Ctrl+A),然后點擊Add,然后Close.可以看到Files列表下面包含我們添加的文件。這里需要說明一下,對于我們寫代碼,如果我們只用到了其中的某個外設,我們就可以不用添加沒有用到的外設的庫文件。例如我只用GPIO,我可以只用添加stm32f10x_gpio.c而其他的可以不用添加。這里我們?nèi)刻砑舆M來是為了后面方便,不用每次添加,當然這樣的壞處是工程太大,編譯起來速度慢,用戶可以自行選擇。圖3-12往Group里面添加文件用同樣的方法,將Groups定位到CORE和USER下面,添加需要的文件。這里我們的CORE下面需要添加的文件為core_cm3.c,startup_stm32f10x_md.s,USER目錄下面需要添加的文件為main.c,stm32f10x_it.c,system_stm32f10x.c.這樣我們需要添加的文件已經(jīng)添加到我們的工程中去了,最后點擊OK,回到工程主界面。圖3-13Groups定位到CORE和USER下下面我們要告訴MDK,在哪些路徑之下搜索相應的文件?;氐焦こ讨鞑藛?,點擊魔術棒,出來一個菜單,然后點擊c/c++選項.然后點擊IncludePaths右邊的按鈕。彈出一個添加path的對話框,然后我們將圖上面的3個目錄添加進去。記住,keil只會在一級目錄查找,所以如果你的目錄下面還有子目錄,記得path一定要定位到最后一級子目錄。然后點擊OK.接下來,我們再來編譯工程,可以看到又報了很多同樣的錯誤。為什么呢??我們可以雙擊錯誤,然后會自動定位到文件stm32f10x.h中出錯的地方,可以看到代碼:#if!defined(STM32F10X_LD)&&!defined(STM32F10X_LD_VL)&&!defined(STM32F10X_MD)&&!defined(STM32F10X_MD_VL)&&!defined(STM32F10X_HD)&&!defined(STM32F10X_HD_VL)&&!defined(STM32F10X_XL)&&!defined(STM32F10X_CL)#error"PleaseselectfirstthetargetSTM32F10xdeviceusedinyourapplication(instm32f10x.hfile)"#endif這是因為3.5版本的庫函數(shù)在配置和選擇外設的時候通過宏定義來選擇的,所以我們需要配置一個全局的宏定義變量。按照步驟16,定位到c/c++界面,然后copy“STM32F10X_MD,USE_STDPERIPH_DRIVER”到Define里面。這里解釋一下,如果你用的是大容量那么STM32F10X_MD修改為STM32F10X_HD,小容量修改為STM32F10X_LD.然后點擊OK。圖3-14配置一個全局的宏定義變量這次在編譯之前,我們記得打開工程USUR下面的main.c,復制下面代碼到main.c覆蓋已有代碼,然后進行編譯。(記得在代碼的最后面加上一個回車,否則會有警告)#include"stm32f10x.h"GPIO_InitTypeDefGPIO_InitStructure;intmain(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOD,&GPIO_InitStructure);while(1){/*SetPD0andPD2*/GPIOD->BSRR=0x00000005;/*ResetPD0andPD2*/GPIOD->BRR=0x00000005;}}#ifdefUSE_FULL_ASSERTvoidassert_failed(uint8_t*file,uint32_tline){while(1){}}#endif這次編譯可以看出,已經(jīng)成功了。這樣一個工程模版建立完畢。下面還需要配置,讓編譯之后能夠生成hex文件。同樣點擊魔術棒,進入配置菜單,選擇Output。然后勾上下三個選項。其中CreateHEXfile是編譯生成hex文件,BrowserInformation是可以查看變量和函數(shù)定義,這里我們不做過多解釋,在我們的不完全手冊里面有講解。重新編譯代碼,可以看到生成了hex文件,這個文件我們用mcuisp下載到mcu即可。選中之后點擊OK,重新編譯,編譯結果如下圖所示:圖3-15重新編譯結果從上圖中可以看到,編譯器已經(jīng)產(chǎn)生了hex文件了,然后我們打開USER文件夾,看看里面發(fā)生了什么變化?重新編譯產(chǎn)生了很多文件,其中就有我們所需要的hex文件(圖中紅圈圈中),至此,我們就可以開始下載了。3.4mcuisp與sscom軟件用mcuisp軟件打開USER文件夾,找到TEST.hex,打開并進行相應設置后。編程前重裝文件,該選項也比較有用,當選中該選項之后,mcuisp會在每次編程之前,將hex文件重新裝載一遍,這對于代碼調(diào)試的時候是比較有用的。最后,我們選擇的DTR的低電平復位,RTS高電平進BootLoader,這個選擇項選中,mcuisp就會通過DTR和RTS信號來控制板載的一鍵下載功能電路,以實現(xiàn)一鍵下載功能。如果不選擇,則無法實現(xiàn)一鍵下載功能。這個是必要的選項(在BOOT0接GND的條件下)。在裝載了hex文件之后,我們要下載代碼還需要選擇串口,這里mcuisp有智能串口搜索功能。每次打開mcuisp軟件,軟件會自動去搜索當前電腦上可用的串口,然后選中一個作為默認的串口(一般是您最后一次關閉時所選則的串口)。也可以通過點擊菜單欄的搜索串口,來實現(xiàn)自動搜索當前可用串口。串口波特率則可以通過bps那里設置,對于STM32,該波特率最大為230400bps,這里我們一般選擇最高的波特率:460800,讓mcuisp自動去同步。從之前USB串口的安裝可知,開發(fā)板的串口被識別為COM5了,所以我選擇COM5。選擇了相應串口之后就可以通過按”開始編程(P)”這個按鈕,一鍵下載代碼到STM32上,下載成功后如下圖所示:圖3-16下載完成下載完成上圖中,我用圈圈圈出了mcuisp對一鍵下載電路的控制過程,其實就是控制DTR和RTS電平的變化,控制BOOT0和RESET,從而實現(xiàn)自動下載。另外界面提示已經(jīng)下載完成(如果老提示:開始連接…,需要檢查一下,開發(fā)板的設置是否正確,是否有其他因素干擾等),并且從0X80000000處開始運行了,我打開串口調(diào)試助手選擇COM5,會發(fā)現(xiàn)從硬件板發(fā)回來的信息,如下圖所示:圖3-17串口調(diào)試助手sscom圖3-40程序開始運行了接收到的數(shù)據(jù)和我仿真的是一樣的,證明程序沒有問題。至此,說明下載代碼成功了,并且也從硬件上驗證了代碼的正確性。第四章程序設計與調(diào)試4.1整體系統(tǒng)描述本設計實現(xiàn)了對SD卡里多幅圖片以幻燈片形式在TFT屏上動態(tài)顯示的效果。主要的三大部分為:SD卡圖片文件讀取、圖像解碼與顯示、系統(tǒng)主程序。本系統(tǒng)采用基于ARMCortex-M3內(nèi)核的STM32作為主控制器,外擴SD卡以及TFT彩屏。系統(tǒng)通過文件系統(tǒng)讀取SD卡內(nèi)存儲的BMP、JPEG、JPG格式圖片,把多幅圖片以幻燈片的形式從TFT屏上顯示出來。同時,通過STM32內(nèi)部的RTC模塊使系統(tǒng)具有掉電不遺失日期及時鐘的功能。系統(tǒng)框圖如圖4-1所示。圖4-1系統(tǒng)框圖4.2各模塊描述4.2.1SD卡圖片文件讀取軟件設計4.2.1文件讀取 本次試驗讀取SD卡上的字庫以及UNICODE到GBK的轉換碼表到W25X16部分需要用到FAT文件系統(tǒng)。常用的文件系統(tǒng)有FAT12/16/32等,F(xiàn)AT12,現(xiàn)在基本淘汰了。FAT16則可以管理2G的空間(通過特殊處理也能管理2G以上的空間),而FAT32則能管理到2TB(2048GB)的空間。FAT32較FAT16的優(yōu)勢還在于FAT32采用了更小的簇,可以更有效的保存信息,而不會造成較多的浪費。Win7在格式化SD卡的時候建立的,通常SD卡上的數(shù)據(jù)信息由MBR、DBR、FAT、FDT和數(shù)據(jù)區(qū)5個部分組成(有的也沒有MBR)。我們以FAT32為例做介紹。MBR稱為主引導記錄區(qū),該區(qū)存儲了分區(qū)表等信息,位于SD卡的扇區(qū)0(物理扇區(qū)),在其分區(qū)信息里面記錄了DBR所在的位置,SD卡一般只會有一個分區(qū),所以也就只要找到分區(qū)1的DBR所在位置就可以了。DBR稱為操作系統(tǒng)引導記錄區(qū),如果沒有MBR,那么DBR就位于0扇區(qū),如果有則必須通過MBR區(qū)得到DBR所在的地址,然后讀出DBR信息。在DBR區(qū),我們可以知道每個扇區(qū)所占用的字節(jié)數(shù)包含了每個扇區(qū)所占用的字節(jié)數(shù)、每個簇的扇區(qū)數(shù)、FAT表的份數(shù)、每個FAT表的扇區(qū)數(shù)、跟目錄簇號、FAT表1所在的扇區(qū)等一系列非常重要的信息。FAT稱為文件分配表(FAT表),一般一個卡上會存在2個FAT表,一個用作備份,一個用作使用。FAT表一般緊隨DBR,另一個FAT表則緊隨第一個FAT表,這樣只要知道了第一個FAT表的位置及大小,那么第二個FAT表的位置也就確定了。FAT表記錄了每個文件的位置和區(qū)域,是一種鏈式結構,F(xiàn)AT以“F8FFFF0FFFFFFFFF”這樣的8個字節(jié)為表頭,用以表示FAT表的開始,后面的數(shù)據(jù)每四個字節(jié)為一個簇項(從第2簇開始),用來標記下一個簇所在的位置,這樣每個位置都存儲了下一個簇,只要按著這個表走,就可以找到文件的所有內(nèi)容。如果找到下一個簇位置,里面記錄的是最后一個簇的標記是“FFFFFF0F”,代表這個文件到此就結束了,沒有后續(xù)簇了,這樣一個文件的讀取就結束了。FDT稱為文件根目錄表,這個區(qū)域固定為32個扇區(qū),假設每個扇區(qū)為512個字節(jié),那么更目錄下最多存放512個文件(假設都用短文件名存儲,每個短文件名占32個字節(jié))。文件目錄表是另一個重要的部分,F(xiàn)AT文件系統(tǒng)中(僅以短文件名介紹),文件目錄項在目錄表下以32個字節(jié)的方式記錄,各字段定義如下:表4.1文件目錄項各字節(jié)定義從上表可知,我們在文件的目錄項就可以找到該文件的其實簇,然后在FAT表里面找到該簇開始的下一個簇,依次讀取這些簇就可以把整個文件讀出來了。圖像解碼與顯示BMP是一種與硬件設備無關的圖像文件格式,使用非常廣。它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,BMP文件所占用的空間很大。BMP文件的圖像深度可選lbit、4bit、8bit及24bit。BMP文件存儲數(shù)據(jù)時,圖像的掃描方式是按從左到右、從下到上的順序。典型的BMP圖像文件由三部分組成:位圖文件頭數(shù)據(jù)結構,它包含BMP圖像文件的類型、顯示內(nèi)容等信息;位圖信息數(shù)據(jù)結構,它包含有BMP圖像的寬、高、壓縮方法,以及定義顏色等信息。JPEG是JointPhotographicExpertsGrou的縮寫,是最常用的圖像文件格式。其特點是用有損壓縮方式去除冗余的圖像數(shù)據(jù),在獲得極高的壓縮率的同時能展現(xiàn)十分豐富生動的圖像。JPEG具有調(diào)節(jié)圖像質(zhì)量的功能,允許用不同的壓縮比例對文件進行壓縮,支持多種壓縮級別,壓縮比率通常在10:1到40:1之間,壓縮與圖像品質(zhì)成反比。JPEG格式壓縮的主要是高頻信息,對色彩的信息保留較好,適合應用于互聯(lián)網(wǎng),可減少圖像的傳輸時間,可以支持24bit真彩色,也普遍應用于需要連續(xù)色調(diào)的圖像。JPEG/JPG的解碼過程可以簡單的概述為如下幾個部分:1)從文件頭讀出文件的相關信息。JPEG文件數(shù)據(jù)分為文件頭和圖像數(shù)據(jù)兩大部分,其中文件頭記錄了圖像的版本、長寬、采樣因子、量化表、哈夫曼表等重要信息。2)從圖像數(shù)據(jù)流讀取一個最小編碼單元(MCU),并提取出里邊的各個顏色分量單元。3)將顏色分量單元從數(shù)據(jù)流恢復成矩陣數(shù)據(jù)。利用文件頭給出的哈夫曼表,對分割出來的顏色分量單元進行解碼,把其恢復成8×8的數(shù)據(jù)矩陣。4)8×8的數(shù)據(jù)矩陣進一步解碼。此部分解碼工作以8×8的數(shù)據(jù)矩陣為單位,其中包括相鄰矩陣的直流系數(shù)差分解碼、利用文件頭給出的量化表反量化數(shù)據(jù)、反Zig-zag編碼、隔行正負糾正、反向離散余弦變換等5個步驟,最終輸出仍然是一個8×8的數(shù)據(jù)矩陣。5)顏色系統(tǒng)YCrCb向RGB轉換。將一個MCU的各個顏色分量單元解碼結果整合起來,將圖像顏色系統(tǒng)從YCrCb向RGB轉換。6)排列整合各個MCU的解碼數(shù)據(jù)。不斷讀取數(shù)據(jù)流中的MCU并對其解碼,將解碼后的數(shù)據(jù)正確排列成完整的圖像直至讀完所有MCU為止。主要代碼:#include"jpegbmp.h"http:///////////////////////////////////////////////////全局變量聲明,BMP和JPEG共用 FileInfoStruct*CurFile;//當前解碼/操作的文件 //圖像信息typedefstruct{ u32ImgWidth;//圖像的實際寬度和高度 u32ImgHeight; u32Div_Fac;//縮放系數(shù)(擴大了10000倍的) u32S_Height;//設定的高度和寬度 u32S_Width; u32 S_XOFF; //x軸和y軸的偏移量 u32S_YOFF; u32staticx;//當前顯示到的xy坐標 u32staticy;}PIC_POS; PIC_POSPICINFO;//圖像位置信息////////////////////////////////////////////////////voidAI_Drow_Init(void);//智能畫圖,初始化.得到比例因子PICINFO.Div_Fac ///////////////////////////////////////////////////////在JPEG函數(shù)里面用到的變量short SampRate_Y_H,SampRate_Y_V;short SampRate_U_H,SampRate_U_V;short SampRate_V_H,SampRate_V_V;short H_YtoU,V_YtoU,H_YtoV,V_YtoV;short Y_in_MCU,U_in_MCU,V_in_MCU; unsignedchar*lp;//取代lpJpegBufshort qt_table[3][64];short comp_num;u8 comp_index[3];u8 YDcIndex,YAcIndex,UVDcIndex,UVAcIndex;u8 HufTabIndex;short *YQtTable,*UQtTable,*VQtTable;short code_pos_table[4][16],code_len_table[4][16];unsignedshort code_value_table[4][256];unsignedshort huf_max_value[4][16],huf_min_value[4][16];short BitPos,CurByte;//byte的第幾位,當前byteshort rrun,vvalue;short MCUBuffer[10*64];short QtZzMCUBuffer[10*64];short BlockBuffer[64];short ycoef,ucoef,vcoef;BOOL IntervalFlag;short interval=0;short Y[4*64],U[4*64],V[4*64];//DWORD sizei,sizej;short restart;longiclip[1024];//4kBYTESlong*iclp; //反Z字形編碼表constintZig_Zag[8][8]={{0,1,5,6,14,15,27,28}, {2,4,7,13,16,26,29,42}, {3,8,12,17,25,30,41,43}, {9,11,18,24,31,40,44,53}, {10,19,23,32,39,45,52,54}, {20,22,33,38,46,51,55,60}, {21,34,37,47,50,56,59,61}, {35,36,48,49,57,58,62,63} };constBYTEAnd[9]={0,1,3,7,0xf,0x1f,0x3f,0x7f,0xff};//數(shù)據(jù)緩沖區(qū) u8jpg_buffer[1024];//數(shù)據(jù)緩存區(qū) ///////////////////////////////////////////////////////初始化智能畫點voidAI_Drow_Init(void){ floattemp,temp1; temp=(float)PICINFO.S_Width/PICINFO.ImgWidth; temp1=(float)PICINFO.S_Height/PICINFO.ImgHeight; if(temp<temp1)temp1=temp;//取較小的那個 if(temp1>1)temp1=1; //使圖片處于所給區(qū)域的中間 PICINFO.S_XOFF+=(PICINFO.S_Width-temp1*PICINFO.ImgWidth)/2; PICINFO.S_YOFF+=(PICINFO.S_Height-temp1*PICINFO.ImgHeight)/2; temp1*=10000;//擴大10000倍 PICINFO.Div_Fac=temp1; PICINFO.staticx=500; PICINFO.staticy=500;//放到一個不可能的值上面 }//判斷這個像素是否可以顯示//(x,y):像素原始坐標//chg:功能變量.//返回值:0,不需要顯示.1,需要顯示__inlineu8IsElementOk(u16x,u16y,u8chg){ if(x!=PICINFO.staticx||y!=PICINFO.staticy) { if(chg==1) { PICINFO.staticx=x; PICINFO.staticy=y; } return1; } elsereturn0;}//智能畫圖//FileName:要顯示的圖片文件BMP/JPG/JPEG//(sx,sy):開始顯示的坐標點//(ex,ey):結束顯示的坐標點//圖片在開始和結束的坐標點范圍內(nèi)顯示BOOLAI_LoadPicFile(FileInfoStruct*FileName,u16sx,u16sy,u16ex,u16ey){ int funcret;//返回值 //得到顯示方框大小 if(ey>sy)PICINFO.S_Height=ey-sy; elsePICINFO.S_Height=sy-ey; if(ex>sx)PICINFO.S_Width=ex-sx; elsePICINFO.S_Width=sx-ex; //顯示區(qū)域無效 if(PICINFO.S_Height==0||PICINFO.S_Width==0) { PICINFO.S_Height=LCD_H; PICINFO.S_Width=LCD_W; returnFALSE; } //影響速度 //SD_Init();//初始化SD卡,在意外拔出之后可以正常使用 //顯示的開始坐標點 PICINFO.S_YOFF=sy; PICINFO.S_XOFF=sx; //文件名傳遞 CurFile=FileName; if(CurFile->F_Type==T_BMP)//得到一個BMP圖像 { funcret=BmpDecode(CurFile);//得到一個BMP圖像 returnfuncret; } elseif(CurFile->F_Type==T_JPG||CurFile->F_Type==T_JPEG)//得到JPG/JPEG圖片 { //得到JPEG/JPG圖片的開始信息 F_Open(CurFile); //開始時讀入1024個字節(jié)到緩存里面.方便后面提取JPEG解碼的信息 F_Read(CurFile,jpg_buffer); //讀第一次 F_Read(CurFile,jpg_buffer+512);//讀第二次 InitTable();//初始化各個數(shù)據(jù)表 if((funcret=InitTag())!=FUNC_OK)returnFALSE;//初始化表頭不成功 if((SampRate_Y_H==0)||(SampRate_Y_V==0))returnFALSE;//采樣率錯誤 AI_Drow_Init();//初始化PICINFO.Div_Fac,啟動智能畫圖 funcret=Decode();//解碼JPEG開始 }elsereturnFALSE;//非圖片格式!!! if(funcret==FUNC_OK)returnTRUE;//解碼成功 elsereturnFALSE;//解碼失敗 }//解碼這個BMP文件 BOOLBmpDecode(FileInfoStruct*BmpFileName){u16count; u8rgb,color_byte; u16x,y,color,tmp_color; u16uiTemp; //x軸方向像素計數(shù)器 u16countpix=0;//記錄像素 //x,y的實際坐標 u8realx=0; u16realy=0; u8yok=1; BITMAPINFO*pbmp;//臨時指針 CurFile=BmpFileName; F_Open(CurFile);//打開文件 F_Read(CurFile,jpg_buffer);//讀出512個字節(jié) pbmp=(BITMAPINFO*)jpg_buffer;//得到BMP的頭部信息 count=pbmp->bmfHeader.bfOffBits;//數(shù)據(jù)偏移,得到數(shù)據(jù)段的開始地址 color_byte=pbmp->bmiHeader.biBitCount/8;//彩色位16/24/32 PICINFO.ImgHeight=pbmp->bmiHeader.biHeight;//得到圖片高度 PICINFO.ImgWidth=pbmp->bmiHeader.biWidth;//得到圖片寬度 //水平像素必須是4的倍數(shù)!! if((PICINFO.ImgWidth*color_byte)%4) uiTemp=((PICINFO.ImgWidth*color_byte)/4+1)*4; else uiTemp=PICINFO.ImgWidth*color_byte; AI_Drow_Init();//初始化智能畫圖 //開始解碼BMP x=0; y=PICINFO.ImgHeight; rgb=0; realy=y*PICINFO.Div_Fac/10000; while(1) { while(count<512)//讀取一簇512扇區(qū)(SectorsPerClust每簇扇區(qū)數(shù)) { if(color_byte==3)//24位顏色圖 { switch(rgb) { case0: tmp_color=jpg_buffer[count]>>3; color|=tmp_color; break; case1: tmp_color=jpg_buffer[count]>>2; tmp_color<<=5; color|=tmp_color; break; case2: tmp_color=jpg_buffer[count]>>3; tmp_color<<=11; color|=tmp_color; break; } } else { if(color_byte==2)//16位顏色圖 { switch(rgb) { case0: color=jpg_buffer[count]&0x1f; tmp_color=jpg_buffer[count]>>5; tmp_color<<=6; color|=tmp_color; break; case1: tmp_color=jpg_buffer[count]; tmp_color<<=9; color|=tmp_color; break; } } else { if(color_byte==4)//32位顏色圖 { switch(rgb) { case0: tmp_color=jpg_buffer[count]; color|=tmp_color>>3; break; case1: tmp_color=jpg_buffer[count]; tmp_color>>=2; color|=tmp_color<<5; break; case2: tmp_color=jpg_buffer[count]; tmp_color>>=3; color|=tmp_color<<11; break; case3:break; } } } }//位圖顏色得到 rgb++; count++; if(rgb==color_byte)//水平方向讀取到1像素數(shù)數(shù)據(jù)后顯示 { if(x<PICINFO.ImgWidth) { realx=x*PICINFO.Div_Fac/10000;//x軸實際值 if(IsElementOk(realx,realy,1)&&yok)//符合條件 { POINT_COLOR=color; LCD_DrawPoint(realx+PICINFO.S_XOFF,realy+PICINFO.S_YOFF-1); } } x++;//x軸增加一個像素 color=0x00; rgb=0; } countpix++;//像素累加 if(countpix>=uiTemp)//水平方向像素值到了.換行 { y--; if(y<=0)returnTRUE; realy=y*PICINFO.Div_Fac/10000;//實際y值改變 if(IsElementOk(realx,realy,0))yok=1;//此處不改變PICINFO.staticx,y的值 elseyok=0; x=0; countpix=0; color=0x00; rgb=0; } } if(!F_Read(CurFile,jpg_buffer))break;//讀出512個字節(jié),讀數(shù)失敗時自動退出 count=0; } returnTRUE;//BMP顯示結束. }BMP文件格式BMP是一種與硬件設備無關的圖像文件格式,使用非常廣。它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,BMP文件所占用的空間很大。BMP文件的圖像深度可選lbit、4bit、8bit及24bit。BMP文件存儲數(shù)據(jù)時,圖像的掃描方式是按從左到右、從下到上的順序。典型的BMP圖像文件由三部分組成:位圖文件頭數(shù)據(jù)結構,它包含BMP圖像文件的類型、顯示內(nèi)容等信息;位圖信息數(shù)據(jù)結構,它包含有BMP圖像的寬、高、壓縮方法,以及定義顏色等信息。部分代碼://BMP信息頭typedef__packedstruct{DWORDbiSize; //說明BITMAPINFOHEADER結構所需要的字數(shù)。LONGbiWidth; //說明圖象的寬度,以象素為單位LONGbiHeight; //說明圖象的高度,以象素為單位WORDbiPlanes

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論