基于STM32的數(shù)碼相框設(shè)計(jì)與實(shí)現(xiàn)本科論文_第1頁(yè)
基于STM32的數(shù)碼相框設(shè)計(jì)與實(shí)現(xiàn)本科論文_第2頁(yè)
基于STM32的數(shù)碼相框設(shè)計(jì)與實(shí)現(xiàn)本科論文_第3頁(yè)
基于STM32的數(shù)碼相框設(shè)計(jì)與實(shí)現(xiàn)本科論文_第4頁(yè)
基于STM32的數(shù)碼相框設(shè)計(jì)與實(shí)現(xiàn)本科論文_第5頁(yè)
已閱讀5頁(yè),還剩47頁(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)介

1、基于基于stm32stm32的數(shù)碼相框設(shè)計(jì)與實(shí)現(xiàn)的數(shù)碼相框設(shè)計(jì)與實(shí)現(xiàn) 摘 要 嵌入式系統(tǒng)是當(dāng)前最有發(fā)展前途的 it 應(yīng)用領(lǐng)域之一,近年來(lái)數(shù)字?jǐn)z影業(yè)的興 起帶動(dòng)了嵌入式產(chǎn)品數(shù)碼相框的發(fā)展。本設(shè)計(jì)是一款基于 arm cortex-m3 內(nèi) 核 stm32 嵌入式硬件平臺(tái)設(shè)計(jì)的數(shù)碼相框,主要優(yōu)勢(shì)是應(yīng)用了 stm32 杰出的功耗 控制和極低的開(kāi)發(fā)成本、超多的外設(shè)等特點(diǎn)。 設(shè)計(jì)主要包括主控制器核心板、lcd 液晶顯示、sd 卡存儲(chǔ)器等多個(gè)功能模塊。 開(kāi)發(fā)過(guò)程大致為:在 pc 機(jī) win7 系統(tǒng)中使用 rvmdk3.80 版本的編譯器撰寫工程代 碼,之后通過(guò) mcuisp 串口下載軟件將編譯器編譯生成.h

2、ex 下載到開(kāi)發(fā)板內(nèi),最終實(shí) 現(xiàn)通過(guò) fat 文件系統(tǒng)讀取 sd 卡內(nèi)存儲(chǔ)的 bmp、jpeg、jpg 格式圖片,把多幅圖 片以幻燈片的形式從 tft 屏上顯示出來(lái)。 關(guān)鍵詞:數(shù)碼相框; stm 32; lcd 液晶顯示; sd 卡 the design of digital photo frames based on the stm32 abstract embedded systems is one of the most promising applications of it in recent years, driven by the rise of digital photogra

3、phy embedded products - digital photo frame development. the design is based on a stm32 arm cortex-m3 core embedded hardware platform design digital photo frame, both of todays digital photo frame industry, market demand and stm32 excellent power control and low development costs. core design includ

4、es the main controller board, lcd liquid crystal display, a number of functional modules sd card memory. development process is roughly: use rvmdk3.80 version of the compiler writing project code in the pc win7 system, after passing through mcuisp serial download software compiler to generate hex do

5、wnloaded to the development board, and ultimately the system by reading the fat file system. within the sd card storage bmp, jpeg, jpg format images, the pieces of the picture in the form of a slide from the tft screen is displayed. keywords: digital photo frame; stm32;lcd liquid crystal display ;sd

6、 card memory. 目目 錄錄 摘要.1 abstract.2 目 錄.1 第一章 緒論.1 1.1 數(shù)碼相框的技術(shù)背景.1 1.2 數(shù)碼相框的市場(chǎng)背景.1 1.3 本課題主要研究?jī)?nèi)容與特點(diǎn).1 1.3.1 本課題的主要研究?jī)?nèi)容.1 1.3.2 本設(shè)計(jì)的主要特點(diǎn).1 第二章 硬件介紹.3 2.1 mcu 主控模塊 .3 2.2 lcd 模塊.4 2.3 sd 存儲(chǔ)卡模塊 .7 第三章 軟件介紹.10 3.1 安裝 mdk3.8a.10 3.2 注冊(cè) license.10 3.3 新建工程.12 3.4 mcuisp與sscom軟件 .18 第四章 程序設(shè)計(jì).20 4.1 整體描述.20

7、 4.2 各模塊描述.20 4.2.1 sd 卡圖片文件讀取.20 4.2.2 圖像解碼與顯示.21 4.3 主程序設(shè)計(jì).28 4.3 程序調(diào)試.31 第五章 結(jié)束語(yǔ).33 參考文獻(xiàn)(references).34 致 謝.35 外文文獻(xiàn).36 外文譯文.45 第一章第一章 緒論緒論 1.11.1 數(shù)碼相框的技術(shù)背景數(shù)碼相框的技術(shù)背景 嵌入式是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟件硬件可裁剪適合于應(yīng)用系 統(tǒng)對(duì)功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。 作為如今最有發(fā)展前途的 it 應(yīng)用領(lǐng)域之一嵌入式系統(tǒng)一般用在一些專用設(shè)備上, 通常這些設(shè)備的硬件資源非常有限、對(duì)成本很敏感,有時(shí)對(duì)實(shí)

8、時(shí)響應(yīng)要求很高。像 我們平常常見(jiàn)到的手機(jī)、vcd、mp3 播放器、數(shù)字?jǐn)z像機(jī)、機(jī)頂盒、高清電視、游 戲機(jī)、路由器、汽車電子、家電控制系統(tǒng)、醫(yī)療儀器、航天航空設(shè)備等等都是嵌入 式產(chǎn)品。 隨著數(shù)字?jǐn)z影的興起數(shù)碼相框產(chǎn)業(yè)得以發(fā)展。數(shù)碼相框的造型是將原來(lái)相框中 間放照片的部分換成了液晶顯示屏,外加電源,存儲(chǔ)介質(zhì)等,比普通相框的優(yōu)勢(shì)是 在同一個(gè)相框內(nèi)可以循環(huán)播放照片。 1.21.2 數(shù)碼相框的市場(chǎng)背景數(shù)碼相框的市場(chǎng)背景 市場(chǎng)方面,自 2008 年開(kāi)始數(shù)碼相框市場(chǎng)就呈現(xiàn)出了高速發(fā)展的態(tài)勢(shì),并一直 持續(xù)至今,因此本課題的研究具有極高的商業(yè)價(jià)值與意義。 數(shù)碼相框產(chǎn)品的首次出現(xiàn)是在 2001 年,但直至 200

9、3 年市場(chǎng)都一直低迷,其原 因在于產(chǎn)品的價(jià)格過(guò)高。之后在器件價(jià)格的下降等因素的促使下,其價(jià)格也得以下 降,于是市場(chǎng)自 2004 年有了起色,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), 2011 年出貨量達(dá)到 4000 萬(wàn)臺(tái)。 從長(zhǎng)遠(yuǎn)來(lái)看,未來(lái)幾年數(shù)碼相框的市場(chǎng)將逐漸步入成熟期,其產(chǎn)銷量和市場(chǎng)需 求仍會(huì)保持大幅度增長(zhǎng)。 1.31.3 本課題主要研究?jī)?nèi)容本課題主要研究?jī)?nèi)容與特點(diǎn)與特點(diǎn) 1.3.11.3.1 本課題的主要研究?jī)?nèi)容本課題的主要研究?jī)?nèi)容 本

10、課題是基于 arm 單片機(jī) stm32 的存儲(chǔ)程序控制,從 sd 卡讀取圖片,解碼之 后輸出到 tft-lcd(薄膜晶體管液晶顯示器)上顯示。實(shí)現(xiàn)了對(duì) sd 卡里多幅圖片 以幻燈片形式在 tft 屏上動(dòng)態(tài)顯示的效果。 1)硬件資料的研究; 2)軟件方案的選擇與論證; 3)軟件運(yùn)行與調(diào)試; 1.3.21.3.2 本設(shè)計(jì)的主要特點(diǎn)本設(shè)計(jì)的主要特點(diǎn) 從以往的市場(chǎng)發(fā)展來(lái)看,數(shù)碼相框產(chǎn)品市場(chǎng)化的兩大阻礙因素為:一是價(jià)格;二 是應(yīng)用功能。低廉的價(jià)格將贏得更多顧客的青睞,拓展應(yīng)用空間指的是消費(fèi)者的需 求開(kāi)發(fā)出相應(yīng)的應(yīng)用產(chǎn)品。 stm32 具有超低的價(jià)格、超多的外設(shè)、豐富的型號(hào)、優(yōu)異的實(shí)時(shí)性能、杰出 的功耗控

11、制和極低的開(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ù)十種

12、型號(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.12.1 mcumcu 主控模塊主控模塊 stm32 系列閃存微控制器是意法半導(dǎo)體公司(st)基于 arm 公司具有突破性 的 cortex-m3 內(nèi)核的處理器,該處理器是專門設(shè)計(jì)于滿足集高性能、低功耗、實(shí)時(shí) 應(yīng)用、具有競(jìng)爭(zhēng)性價(jià)格于一體的嵌入式領(lǐng)域的要求。此次設(shè)計(jì)采用的具體型號(hào)是 stm32f103rbt6,如圖

13、2-1 所示。 圖 2-1 stm32f103rbt6 處理器 stm32f103rbt6 嵌入式處理器具有以下特點(diǎn): 32 位 risc 性能處理器; 32 位 arm cortex-m3 結(jié)構(gòu)優(yōu)化; 72 mhz 運(yùn)行頻率,單周期訪問(wèn)時(shí)速度可達(dá) 1.25 dmips/mhz; 硬件除法和單周期乘法; 快速可嵌套中斷,612 個(gè)時(shí)鐘周期; 具有 mpu 保護(hù)設(shè)定訪問(wèn)規(guī)則; 片內(nèi)具有 256kb flash,48kb ram; 80 個(gè)快速 i/o 端口,16 個(gè) i/o 可映射到外部中斷,幾乎所有的 i/o 可以忍受 5v 電壓; 片上集成 12bit a/d、d/a、pwm、can、usb

14、、sdio、fsmc 等資源; arm cortex-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 還集成了睡眠模式和可選的

15、完整的八區(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ì)是專門面向 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ì)

16、,新產(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.22.2 lcdlcd 模塊模塊 thin film transistor(薄膜場(chǎng)效應(yīng)晶體管),是指液晶顯示器上的每一液晶象素點(diǎn) 都是由集成在其后的薄膜晶體管來(lái)驅(qū)動(dòng)。從而可以做到高速度、高亮度、高對(duì)比度 顯示屏幕信息,tft-lcd(薄膜晶體管液晶顯示器)是多數(shù)液晶顯示器的一種。tft 屏幕

17、的優(yōu)點(diǎn)如下: 大面積。九十年代初第一代大面積玻璃基板(300mm400mm)tft-lcd 生 產(chǎn)線投產(chǎn),到 2000 年上半年玻璃基板的面積已經(jīng)擴(kuò)大到了 680mm880mm),最 近 950mm1200mm 的玻璃基板也將投入運(yùn)行。 高集成度。用于液晶投影的 1.3 英寸 tft 芯片的分辨率為 xga 含有百萬(wàn)個(gè)象 素。分辨率為 sxga(12801024)的 16.1 英寸的 tft 陣列非晶體硅的膜厚只有 50nm,以及 tab on glass 和 system on glass 技術(shù),其 ic 的集成度,對(duì)設(shè) 備和供應(yīng)技術(shù)的要求,技術(shù)難度都超過(guò)傳統(tǒng)的 lsi。 功能強(qiáng)大。tft

18、最早作為矩陣選址電路改善了液晶的光閥特性。對(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é)氣相沉積

19、) 等傳統(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 并口,配合

20、觸摸屏專用 芯片 xpt2046,可對(duì)屏幕進(jìn)行觸摸操作,更顯智能化和個(gè)性化。為了方便用戶使用, 我們存儲(chǔ)方式采用兼容 fat 的文件系統(tǒng),同時(shí)該文件系統(tǒng)也兼容 fat32 等電腦主 流的文件系統(tǒng)方式進(jìn)行存儲(chǔ)。 圖 2-2 2.8 英寸 tft-lcd 模塊 該模塊的 80 并口有如下一些信號(hào)線: cs:tft-lcd 片選信號(hào)。 wr:向 tft-lcd 寫入數(shù)據(jù)。 rd:從 tft-lcd 讀取數(shù)據(jù)。 d15:0:16 位雙向數(shù)據(jù)線。 rst:硬復(fù)位 tft-lcd。 rs:命令/數(shù)據(jù)標(biāo)志(0,讀寫命令;1,讀寫數(shù)據(jù))。 tft-lcd 模塊的 rst 信號(hào)線是直接接到 stm32 的復(fù)位腳

21、上,并不由軟件控 制,這樣可以省下來(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-3 16 位數(shù)據(jù)與顯存對(duì)應(yīng)關(guān)系圖 最低 5 位代表藍(lán)色,中間 6 位為綠色,最高 5

22、位為紅色。數(shù)值越大,表示該顏 色越深。接下來(lái)介紹一下 ili9320 的幾個(gè)重要命令,因?yàn)?ili9320 的命令很多,這 里不一一介紹。這里我們要介紹的命令列表如下: 表 2.1 ili9320 常用命令表 r0,這個(gè)命令,有兩個(gè)功能,如果對(duì)它寫,則最低位為 osc,用于開(kāi)啟或關(guān)閉 振蕩器。而如果對(duì)它讀操作,則返回的是控制器的型號(hào)。這個(gè)命令最大的功能就是 通過(guò)讀它可以得到控器的型號(hào),而我們代碼在知道了控制器的型號(hào)之后,可以針對(duì) 不同型號(hào)的控制器,進(jìn)行不同的初始化。因?yàn)?93xx 系列的初始化,其實(shí)都比較類 似,我們完全可以用一個(gè)代碼兼容好幾個(gè)控制器。 r3,入口模式命令。我們重點(diǎn)關(guān)注的是 i

23、/d0、i/d1、am 這 3 個(gè)位,因?yàn)檫@ 3 個(gè)位控制了屏幕的顯示方向。 am:控制 gram 更新方向。當(dāng) am=0 的時(shí)候,地址以行方向更新。當(dāng) am=1 的時(shí)候,地址以列方向更新。 i/d1:0:當(dāng)更新了一個(gè)數(shù)據(jù)之后,根據(jù)這兩個(gè)位的設(shè)置來(lái)控制地址計(jì)數(shù)器自動(dòng) 增加/減少 1,其關(guān)系如下圖: 圖 2-4 gram 顯示方向設(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)啟顯

24、示,全 0 是關(guān)閉。我們一般通過(guò)該命令的設(shè)置來(lái)開(kāi)啟 或關(guān)閉顯示器,以降低功耗。 r32,r33,設(shè)置 gram 的行地址和列地址。r32 用于設(shè)置列地址(x 坐標(biāo), 0239),r33 用于設(shè)置行地址(y 坐標(biāo),0319)。當(dāng)我們要在某個(gè)指定點(diǎn)寫入一 個(gè)顏色的時(shí)候,先通過(guò)這兩個(gè)命令設(shè)置到改點(diǎn),然后寫入顏色值就可以了。 r34,寫數(shù)據(jù)到 gram 命令,當(dāng)寫入了這個(gè)命令之后,地址計(jì)數(shù)器才會(huì)自動(dòng)的 增加和減少。該命令是我們要介紹的這一組命令里面唯一的單個(gè)操作的命令,只需 要寫入該值就可以了,其他的都是要先寫入命令編號(hào),然后寫入操作數(shù)。 r80r83,行列 gram 地址位置設(shè)置。這幾個(gè)命令用于設(shè)定

25、顯示區(qū)域的大小, 我們整個(gè)屏的大小為 240*320,但是有時(shí)候我們只需要在其中的一部分區(qū)域?qū)懭霐?shù) 據(jù),如果用先寫坐標(biāo),后寫數(shù)據(jù)這樣的方式來(lái)實(shí)現(xiàn),則速度大打折扣。此時(shí)我們就 可以通過(guò)這幾個(gè)命令,在其中開(kāi)辟一個(gè)區(qū)域,然后不停的丟數(shù)據(jù),地址計(jì)數(shù)器就會(huì) 根據(jù) r3 的設(shè)置自動(dòng)增加/減少,這樣就不需要頻繁的寫地址了,大大提高了刷新的 速度。 通過(guò)以上介紹,我們可以得出 tft-lcd 顯示需要的相關(guān)設(shè)置步驟如下: 1)設(shè)置 stm32 與 tft-lcd 模塊相連接的 i/o。 這一步,先將我們與 tft-lcd 模塊相連的 i/o 口設(shè)置為輸出,具體使用哪些 i/o 口,這里需要根據(jù)連接電路以及 t

26、ft-lcd 模塊的設(shè)置來(lái)確定。 2)初始化 tft-lcd 模塊。 通過(guò)向 tft-lcd 寫入一系列的設(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.32.3 sdsd 存儲(chǔ)卡模塊存儲(chǔ)卡模塊 sd 卡(secure digital memory card)中文翻譯為安全數(shù)碼卡,是一種基于半導(dǎo) 體

27、快閃記憶器的新一代記憶設(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 卡

28、模式允許 4 線的高速數(shù)據(jù) 傳輸。spi 模式允許簡(jiǎn)單的通過(guò) spi 接口來(lái)和 sd 卡通信,這種模式同 sd 卡模式相 比就是喪失了速度。sd 卡的引腳排序如下圖 2-6 所示: 圖 2-5 kingston sd 卡 圖 2-6 sd 卡引腳排序圖 sd 卡引腳功能描述如下表所示: 表 2.2 sd 卡引腳功能表 sd 卡只能使用 3.3v 的 i/o 電平,所以,mcu 一定要能夠支持 3.3v 的 i/o 端 口輸出。在 spi 模式下,cs/mosi/miso/clk 都需要加 10100k 左右的上拉電阻。 sd 卡要進(jìn)入 spi 模式很簡(jiǎn)單,就是在 sd 卡收到復(fù)位命令(cmd0

29、)時(shí),cs 為有 效電平(低電平)則 spi 模式被啟用。不過(guò)在發(fā)送 cmd0 之前,要發(fā)送74 個(gè)時(shí)鐘, 這是因?yàn)?sd 卡內(nèi)部有個(gè)供電電壓上升時(shí)間,大概為 64 個(gè) clk,剩下的 10 個(gè) clk 用于 sd 卡同步,之后才能開(kāi)始 cmd0 的操作,在卡初始化的時(shí)候,clk 時(shí)鐘最大 不能超過(guò) 400khz。 本次硬件電路板使用的是 spi 模式來(lái)讀寫 sd 卡,下面我們就重點(diǎn)介紹一下 sd 卡在 spi 模式下的相關(guān)操作。 spi 模式下幾個(gè)重要的操作命令,如下表所示: 表 2.3 spi 模式下 sd 卡部分操作指令 其中 r1 的回應(yīng)格式如下表所示: 表 2.4 sd 卡 r1 回

30、應(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è)置讀寫塊數(shù)據(jù)長(zhǎng)度(cmd16); 8) 讀取 csd,獲取存儲(chǔ)卡的其他信息(cmd9); 9) 發(fā)送 8clk 后,禁止片選; 這樣我們就完成了對(duì) sd 卡的初始化,這里面我們一般設(shè)置讀寫塊數(shù)據(jù)長(zhǎng)度為 512 個(gè)

31、字節(jié),并禁止使用 crc。在完成了初始化之后,就可以開(kāi)始讀寫數(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 卡的寫與讀數(shù)據(jù)差不多,寫數(shù)據(jù) 通過(guò) cmd24 來(lái)實(shí)現(xiàn),具體過(guò)程如下: 1) 發(fā)送 cmd24; 2) 接收卡響應(yīng) r1; 3) 發(fā)送寫數(shù)據(jù)起始令牌 0xfe; 4) 發(fā)送數(shù)據(jù); 5) 發(fā)送 2

32、 字節(jié)的偽 crc; 6) 8clk 之后禁止片選; 第三章第三章 軟件介紹軟件介紹 3.13.1 安裝安裝 mdk3.8amdk3.8a 找到 mdk 的安裝文件并點(diǎn)擊安裝,點(diǎn)擊之后出現(xiàn)界面,選擇 next:選擇”i agreelicence agreement”同意協(xié)議,選擇安裝目錄,這里選擇安裝的目錄后,點(diǎn) 擊 next 即可,輸入郵箱之類的信息即可,點(diǎn)擊 next 開(kāi)始安裝,按圖配置,然后點(diǎn) 擊 finish,左面會(huì)出現(xiàn) keil 快捷圖標(biāo)。 圖 3-1 完成安裝 3.23.2 注冊(cè)注冊(cè) licenselicense 在 mdk 針對(duì)每臺(tái)機(jī)會(huì)有一個(gè) cid,copy 這個(gè) cid 到注

33、冊(cè)機(jī)處生成 license key,然后再將這個(gè) license key 添加到 mdk 里面去注冊(cè)。 右鍵點(diǎn)擊左面的 mdk 快捷方式,選擇“以管理員身份運(yùn)行”。 點(diǎn)擊:file-license management,彈出一個(gè) license management 界面,copy 界面 中的(cid): 圖 3-2 cid 打開(kāi)目錄為 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è) license

34、key,類似: d0dy8-30kak-0n8am-x9z14-a2nwp-j3lzz ,copy 這個(gè) license. 將這個(gè) license key 粘貼到 keil 的 license management 界面的 new license id code 一欄,然后點(diǎn)擊“add lic”,添加成功后會(huì)出現(xiàn)成功提示。然后點(diǎn)擊 close 關(guān) 閉這個(gè)界面即可。 圖 3-4 粘貼 license key 3.33.3 新建工程新建工程 回到 mdk 主界面,可以看到工程中有一個(gè)默認(rèn)的工程,點(diǎn)擊這個(gè)工程名字, 然后選擇菜單 project-close project,就關(guān)閉掉這個(gè)工程了,這樣整

35、個(gè) mdk 就是 一個(gè)空的了,接下來(lái)我們將建立我們的工程模版。 在建立工程之前,我們建議用戶在電腦的某個(gè)目錄下面建立一個(gè)文件夾,后面 所建立的工程都可以放在這個(gè)文件夾下面,這里我們建立一個(gè)文件夾為: stm32- projects. 點(diǎn)擊 keil 的菜單:project new uvision project ,然后將目錄定位到剛才建立 的文件夾 stm32-projecst 之下,在這個(gè)目錄下面建立子文件夾 tempalte,然后定位 到 template 目錄下面,我們的工程文件就都保存到 template 文件夾下面。工程命 名為 template,點(diǎn)擊保存。 接下來(lái)會(huì)出現(xiàn)一個(gè)選擇 d

36、evice 的界面,就是選擇我們的芯片型號(hào),這里我們定 位到 stmicroelectronics 下面的 stm32f103rb。 圖 3-5 選擇芯片型號(hào) 彈出對(duì)話框“copy stm32 startup code to project .”,詢問(wèn)是否添加啟動(dòng)代碼 到我們的工程中,這里我們選擇“否”,因?yàn)槲覀兪褂玫?st 固件庫(kù)文件已經(jīng)包含了 啟動(dòng)文件。 可以看到工程建立了,我們回到 template 目錄下面,可以看到只有三個(gè)文件: 圖 3-6 template 目錄下的文件 接下來(lái),我們?cè)?template 工程目錄下面,新建 3 個(gè)文件夾 core, user, stm32f10 x

37、_fwlib。user 用來(lái)放我們主函數(shù)文件 main.c,以及其他包括 system_stm32f10 x.c 等等,core 用來(lái)存放啟動(dòng)文件等,stm32f10 x_fwlib 文件 夾顧名思義用來(lái)存放 st 官方提供的庫(kù)函數(shù)源碼文件。 圖 3-7 template 工程目錄下新建的文件 下面我們要將官方的固件庫(kù)包里的源碼文件復(fù)制到我們的工程目錄文件夾下面。 打開(kāi)官方固件庫(kù)包,定位到我們之前準(zhǔn)備好的固件庫(kù)包的目錄 stm32f10 x_stdperiph_lib_v3.5.0librariesstm32f10 x_stdperiph_driver 下面, 將目錄下面的 src,inc 文

38、件夾 copy 到我們剛才建立的 stm32f10 x_fwlib 文件 夾下面。 src 存放的是固件庫(kù)的.c 文件,inc 存放的是對(duì)應(yīng)的.h 文件,您不妨打開(kāi)這兩個(gè) 文件目錄過(guò)目一下里面的文件,每個(gè)外設(shè)對(duì)應(yīng)一個(gè).c 文件和一個(gè).h 頭文件。 圖 3-8 stm32f10 x_stdperiph_driver 文件 下面我們要將固件庫(kù)包里面相關(guān)的啟動(dòng)文件復(fù)制到我們的工程目錄 core 之下。 打開(kāi)官方固件庫(kù)包,定位到目錄 stm32f10 x_stdperiph_lib_v3.5.0librariescmsiscm3coresupport 下面,將 文件 core_cm3.c 和文件 co

39、re_cm3.h 復(fù)制到 core 下面去。然后定位到目錄 stm32f10 x_stdperiph_lib_v3.5.0librariescmsiscm3devicesupportststm32f1 0 xstartuparm 下面,將里面所有的文件同樣復(fù)制到 core 下面。這里我們解釋一下, 其實(shí)我們只用到 arm 目錄下面的 startup_stm32f10 x_md.s 文件,這個(gè)文件是針對(duì)中 等容量芯片的啟動(dòng)文件。其他兩個(gè)主要的為 startup_stm32f10 x_ld.s 為小容量, startup_stm32f10 x_hs.c 為大容量芯片的啟動(dòng)文件。這里 copy 進(jìn)來(lái)

40、是方便其他開(kāi)發(fā)者 使用小容量或者大容量芯片的用戶。 現(xiàn)在看看我們的 core 文件夾下面的文件: 圖 3-9 core 文件夾內(nèi) 定位到目錄: stm32f10 x_stdperiph_lib_v3.5.0librariescmsiscm3devicesupportststm 32f10 x 將里面的三個(gè)文件 stm32f10 x.h,system_stm32f10 x.c,system_stm32f10 x.h,復(fù) 制到我們的 user 目錄之下。然后將 stm32f10 x_stdperiph_lib_v3.5.0projectstm32f10 x_stdperiph_template 下

41、面 的 4 個(gè)文件 main.c,stm32f10 x_conf.h,stm32f10 x_it.c,stm32f10 x_it.h 復(fù)制到 user 目錄下面。 圖 3-10 user 文件夾內(nèi) 前面 10 個(gè)步驟,我們將需要的固件庫(kù)相關(guān)文件復(fù)制到了我們的工程目錄下面,下 面我們將這些文件加入我們的工程中去。右鍵點(diǎn)擊 target1,選擇 manage components project targets 一欄,我們將 target 名字修改為 template,然后在 groups 一欄刪 掉一個(gè),建立三個(gè) groups:user,core,fwlib.點(diǎn)擊 ok.可以看到我們的 targ

42、et 名 字以及 groups 情況。 圖 3-11 target 名字以及 groups 情況 下面我們往 group 里面添加我們需要的文件。我們按照步驟 12 的方法, 右鍵 點(diǎn)擊點(diǎn)擊 tempate,選擇選擇 manage components.然后選擇需要添加文件的 group,這里第一步我們選擇 fwlib,然后點(diǎn)擊右邊的 add files,定位到我們剛才建 立的目錄 stm32f10 x_fwlib/src 下面,將里面所有的文件選中(ctrl+a),然后點(diǎn)擊 add,然后 close.可以看到 files 列表下面包含我們添加的文件。 圖 3-12 往 group 里面添加文

43、件 用同樣的方法,將 groups 定位到 core 和 user 下面,添加需要的文件。這 里 我們的 core 下面需要添加的文件為 core_cm3.c,startup_stm32f10 x_md.s,user 目錄下面需要添加的文件為 main.c,stm32f10 x_it.c,system_stm32f10 x.c. 這樣我們需要添加的文件已經(jīng)添加到我們的工程中去了,最后點(diǎn)擊 ok,回到 工程主界面。 圖 3-13 groups 定位到 core 和 user 下 下面我們要告訴 mdk,在哪些路徑之下搜索相應(yīng)的文件?;氐焦こ讨鞑藛?, 點(diǎn)擊魔術(shù)棒,出來(lái)一個(gè)菜單,然后點(diǎn)擊 c/c+選

44、項(xiàng).然后點(diǎn)擊 include paths 右邊的按 鈕。 彈出一個(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)定位到文件 stm32f10 x.h 中出錯(cuò)的地方,可以看到 代碼: #if !defined (stm32f10x_ld) int main(void) systeminit(); rcc_apb2periphclockcmd(rcc_

45、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, while (1) /* set pd0 and pd2 */ gpiod-bsrr = 0 x00000005; /* reset pd0 and pd2 */ gpiod-brr = 0 x00000

46、005; #ifdef use_full_assert void assert_failed(uint8_t* file, uint32_t line) while (1) #endif 這次編譯可以看出,已經(jīng)成功了。這樣一個(gè)工程模版建立完畢。下面還需要配 置,讓編譯之后能夠生成 hex 文件。同樣點(diǎn)擊魔術(shù)棒,進(jìn)入配置菜單,選擇 output。然后勾上下三個(gè)選項(xiàng)。其中 create hex file 是編譯生成 hex 文件,browser information 是可以查看變量和函數(shù)定義。 重新編譯代碼,可以看到生成了 hex 文件,這個(gè)文件我們用 mcuisp 下載到 mcu 即可。 圖

47、3-15 編譯結(jié)果 從上圖中可以看到,編譯器已經(jīng)產(chǎn)生了 hex 文件了,然后我們打開(kāi) user 文件 夾,看看里面發(fā)生了什么變化?重新編譯產(chǎn)生了很多文件,其中就有我們所需要的 hex 文件(圖中紅圈圈中),至此,我們就可以開(kāi)始下載了。 3.43.4 mcuispmcuisp 與與 sscomsscom 軟件軟件 用 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ù)位,

48、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ò)點(diǎn)擊菜單欄的搜索串口,來(lái)實(shí)現(xiàn)自 動(dòng)搜索當(dāng)前可用串口。串口波特率則可以通過(guò) bps 那里設(shè)置,對(duì)于 stm32,該波特 率最大為 23040

49、0bps,這里我們一般選擇最高的波特率:460800, 從之前 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)下載完成,并且從 0x80000000 處開(kāi)始運(yùn)行了,我打開(kāi)串口調(diào)試助手選擇 com5,會(huì)發(fā)現(xiàn)從硬件板發(fā)回來(lái)的信息,如下圖所示: 圖

50、3-17 串口調(diào)試助手 sscom 第四章第四章 程序設(shè)計(jì)程序設(shè)計(jì) 4.14.1 整體描述整體描述 本設(shè)計(jì)實(shí)現(xiàn)了對(duì) sd 卡里多幅圖片以幻燈片形式在 tft 屏上動(dòng)態(tài)顯示的效果。 主要的三大部分為:sd 卡圖片文件讀取、圖像解碼與顯示、系統(tǒng)主程序。 4.24.2 各模塊描述各模塊描述 4.2.14.2.1 sdsd 卡圖片文件讀取卡圖片文件讀取 本次試驗(yàn)讀取 sd 卡上的字庫(kù)以及 unicode 到 gbk 的轉(zhuǎn)換碼表到 w25x16 部分需要用到 fat 文件系統(tǒng)。 常用的文件系統(tǒng)有 fat12/16/32 等,fat12,現(xiàn)在基本淘汰了。fat16 則可以 管理 2g 的空間(通過(guò)特殊處理

51、也能管理 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 所在位

52、置就可以了。 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ū)數(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 表的

53、位置也就 確定了。fat 表記錄了每個(gè)文件的位置和區(qū)域,是一種鏈?zhǔn)浇Y(jié)構(gòu),fat 以“f8 ff ff 0f ff ff ff ff”這樣的 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è)簇的標(biāo)記是“ff ff ff 0f”,代表這個(gè)文件到此就結(jié)束。 fdt 稱為文件根目錄表,這個(gè)區(qū)域固定為 32 個(gè)扇區(qū),假設(shè)每個(gè)扇區(qū)為 512 個(gè) 字節(jié),那么更目錄下最多存放 512 個(gè)文件(假設(shè)都用短文件名存儲(chǔ),每個(gè)短文件名 占 32 個(gè)字節(jié))

54、。文件目錄表是另一個(gè)重要的部分,fat 文件系統(tǒng)中(僅以短文件 名介紹),文件目錄項(xiàng)在目錄表下以 32 個(gè)字節(jié)的方式記錄,各字段定義如下: 表 4.1 文件目錄項(xiàng)各字節(jié)定義 從上表可知,我們?cè)谖募哪夸涰?xiàng)就可以找到該文件的其實(shí)簇,然后在 fat 表里面找到該簇開(kāi)始的下一個(gè)簇,依次讀取這些簇就可以把整個(gè)文件讀出來(lái)了。 4.2.24.2.2 圖像解碼與顯示圖像解碼與顯示 bmp 是一種與硬件設(shè)備無(wú)關(guān)的圖像文件格式,使用非常廣。它采用位映射存儲(chǔ) 格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,bmp 文件所占用的空 間很大。bmp 文件的圖像深度可選 lbit、4bit、8bit 及 24bi

55、t。 bmp 文件存儲(chǔ)數(shù)據(jù)時(shí),圖像的掃描方式是按從左到右、從下到上的順序。 典型的 bmp 圖像文件由三部分組成:位圖文件頭數(shù)據(jù)結(jié)構(gòu),它包含 bmp 圖像 文件的類型、顯示內(nèi)容等信息;位圖信息數(shù)據(jù)結(jié)構(gòu),它包含有 bmp 圖像的寬、高、 壓縮方法,以及定義顏色等信息。 jpeg 是 joint photographic experts grou 的縮寫,是最常用的圖像文件格式。 其特點(diǎn)是用有損壓縮方式去除冗余的圖像數(shù)據(jù),在獲得極高的壓縮率的同時(shí)能展現(xiàn) 十分豐富生動(dòng)的圖像。jpeg 具有調(diào)節(jié)圖像質(zhì)量的功能,允許用不同的壓縮比例對(duì) 文件進(jìn)行壓縮,支持多種壓縮級(jí)別,壓縮比率通常在 10:1 到 40:

56、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)的顏色分量

57、單元進(jìn)行解碼,把其恢復(fù) 成 88 的數(shù)據(jù)矩陣。 4) 88 的數(shù)據(jù)矩陣進(jìn)一步解碼。 此部分解碼工作以 88 的數(shù)據(jù)矩陣為單位, 其中包括相鄰矩陣的直流系數(shù)差 分解碼、利用文件頭給出的量化表反量化數(shù)據(jù)、反 zig-zag 編碼、隔行正負(fù)糾正、 反向離散余弦變換等 5 個(gè)步驟,最終輸出仍然是一個(gè) 88 的數(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ù)正確排列成完整的圖 像直至讀完所有 mc

58、u 為止。 主要代碼: #include jpegbmp.h / /全局變量聲明,bmp 和 jpeg 共用 fileinfostruct *curfile;/當(dāng)前解碼/操作的文件 /圖像信息 typedef struct u32 imgwidth; /圖像的實(shí)際寬度和高度 u32 imgheight; u32 div_fac; /縮放系數(shù) (擴(kuò)大了 10000 倍的) u32 s_height; /設(shè)定的高度和寬度 u32 s_width; u32 s_xoff; /x 軸和 y 軸的偏移量 u32 s_yoff; u32 staticx; /當(dāng)前顯示到的坐標(biāo) u32 staticy; pi

59、c_pos; pic_pos picinfo;/圖像位置信息 / void ai_drow_init(void); /智能畫圖,初始化.得到比例因子 picinfo.div_fac / /在 jpeg 函數(shù)里面用到的變量 shortsamprate_y_h,samprate_y_v; shortsamprate_u_h,samprate_u_v; shortsamprate_v_h,samprate_v_v; shorth_ytou,v_ytou,h_ytov,v_ytov; shorty_in_mcu,u_in_mcu,v_in_mcu; unsigned char *lp;/取代 lpjp

60、egbuf shortqt_table364; shortcomp_num; u8comp_index3; u8 ydcindex,yacindex,uvdcindex,uvacindex; u8huftabindex; short *yqttable,*uqttable,*vqttable; short code_pos_table416,code_len_table416; unsigned shortcode_value_table4256; unsigned shorthuf_max_value416,huf_min_value416; shortbitpos,curbyte;/byt

溫馨提示

  • 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)論