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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論