北方工業(yè)大學(xué)電子信息工程學(xué)院通信工程系 崔曉康 范馨予
基于STM32數(shù)碼相框的設(shè)計(jì)與實(shí)現(xiàn)
北方工業(yè)大學(xué)電子信息工程學(xué)院通信工程系 崔曉康 范馨予
數(shù)碼相框作為嵌入式設(shè)計(jì)的典型應(yīng)用,相對(duì)于普通相框來說更加靈活多變。基于STM32系列嵌入式開發(fā)板豐富的外圍設(shè)備,使得數(shù)碼相框的到了進(jìn)一步的發(fā)展。本系統(tǒng)采用STM32作為控制核心,添加了多種格式漢字顯示、并移植了FATFS去讀取相關(guān)文件信息的功能,研究實(shí)現(xiàn)了對(duì)SD卡里多幅圖片多種格式(如bmp、jpg/jpeg、gif)以幻燈片形式在TFT屏上動(dòng)態(tài)顯示的效果,同時(shí)連接顯示了相應(yīng)圖片內(nèi)容的文字信息,并且增加了按鍵控制,使得數(shù)碼相框的設(shè)計(jì)更加人性化。
嵌入式;STM32微處理器;數(shù)碼相框;圖片解碼
近年來,隨著數(shù)字技術(shù)的快速發(fā)展,各種數(shù)字類產(chǎn)品遍布全球,數(shù)字圖像的數(shù)量也正以驚人的速度增長,為了更加方便快捷的查看圖像,高速瀏覽圖片的設(shè)備應(yīng)運(yùn)而生,數(shù)碼相框采用傳統(tǒng)的外觀造型,只是把傳統(tǒng)外觀部分換成了液晶顯示屏,加上外圍設(shè)備以及供電模塊等,就可以實(shí)現(xiàn)數(shù)碼照片的直接顯示,與此同時(shí)還可以循環(huán)顯示照片,實(shí)現(xiàn)幻燈片的效果。這給日益增多的數(shù)字照片和攝影愛好者們提供了一個(gè)很好的照片展示平臺(tái)和空間。數(shù)碼相框擁有相當(dāng)大的優(yōu)勢,使用簡單,直接從數(shù)碼相機(jī)中取出記憶卡插入到數(shù)碼相框卡槽中即可瀏覽;無需像之前那樣繁瑣,無需電腦,更不需要沖洗打印,各種格式的數(shù)字圖片均能夠快速顯示。
嵌入式是當(dāng)今最熱門的概念之一,它具有體積小、性能強(qiáng)、功耗低、可靠性高以及面向行業(yè)應(yī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)。因此基于嵌入式的各種數(shù)碼相框的設(shè)計(jì)已經(jīng)成為目前研究的熱點(diǎn)。通常來說,嵌入式系統(tǒng)可以劃分為硬件和軟件兩部分。嵌入式硬件由嵌入式微處理器、片內(nèi)周邊電路和外圍設(shè)備三部分組成。其中嵌入式微處理器是嵌入式硬件系統(tǒng)的核心,直接影響嵌入式產(chǎn)品的應(yīng)用范圍和開發(fā)復(fù)雜度。典型的嵌入式微處理器有Motorola公司。
本課題所研究的數(shù)碼相框主要實(shí)現(xiàn)以下功能:插入SD卡后對(duì)指定文件夾中的圖片進(jìn)行尋址與讀取,即通過SD卡進(jìn)入SPI模式對(duì)數(shù)據(jù)進(jìn)行讀寫。通過系統(tǒng)讀取以及解碼SD卡內(nèi)存儲(chǔ)的BMP、JPEG、JPG以及GIF格式圖片,把多幅圖片以幻燈片的形式在TFTLCD屏幕上顯示出來,并且通過按鍵控制實(shí)現(xiàn)對(duì)屏幕顯示圖片的控制包括開啟/暫?;脽羝@示、上一張/下一張顯示等功能,并且顯示圖片的同時(shí)在圖片下方會(huì)同時(shí)顯示基于MATLAB自動(dòng)標(biāo)注的結(jié)果內(nèi)容。
2.1 系統(tǒng)結(jié)構(gòu)
基于STM32的數(shù)碼相框的系統(tǒng)設(shè)計(jì)如圖1所示,由圖中可知,本系統(tǒng)設(shè)計(jì)由SD_CARD模塊(SD卡通常支持兩種操作模式:SD卡模式與SPI模式。本設(shè)計(jì)采用SPI模式)、SPI模塊、FLASH緩存模塊、MCU主控模塊、按鍵(Key)模塊、LCD顯示模塊、LED狀態(tài)顯示模塊共七個(gè)模塊組成。下面依據(jù)順序說明各個(gè)模塊以及連接方法。
第一個(gè)SD_CARD模塊,SD卡通過SDIO接口進(jìn)行通訊,所有的通信都要遵從SD卡通信協(xié)議(SD卡協(xié)議相對(duì)復(fù)雜,這里只說明有關(guān)應(yīng)用的部分,具體講解可查看具體的協(xié)議手冊),首先,可以使用SDIO接口通訊的不只是常見的單純用于儲(chǔ)存數(shù)據(jù)的SD儲(chǔ)存卡,還有SD I/O卡,MMC卡。這幾種卡的類型是有區(qū)別的,其中,SD I/O卡就是利用SDIO接口的一些模塊,通過插入特定的SD卡槽中由SD卡槽中,使設(shè)備的功能得到擴(kuò)展。SDIO的基本構(gòu)架如圖1所示。從圖中可以看出,SDIO接口包含了CMD(命令信號(hào)線,由主時(shí)鐘產(chǎn)生時(shí)鐘信號(hào))、CLK及DAT[7 :0]信號(hào)線(主機(jī)和從機(jī)之間的數(shù)據(jù)信號(hào)在這八條線上傳輸)。圖中這三條信號(hào)線都是在通信中共用的總線,SDIO主機(jī)是通過命令來和SD從設(shè)備的相應(yīng)來尋址的。 SDIO的所有命令以及命令相應(yīng)都是通過SDIO-CMD引腳來進(jìn)行傳輸?shù)?。并且命令只能是由主機(jī)的SDIO控制器發(fā)出。
圖1 STM32的SDIO接口
SPI模塊,是一種串行外圍設(shè)備接口,是作為一種高速全雙工的通信總線,如圖2所示,共包含了四條總線,分別為SS、SCK、MOSI、MISO。其中SS(Slave Select)為片選信號(hào)線,每個(gè)設(shè)備的的片選信號(hào)線都是與MCU單獨(dú)的引腳相連,其他幾個(gè)引腳則以并聯(lián)的方式連接到相同的SPI總線上,當(dāng)片選引腳有效時(shí)開始通信。
圖2 SPI接口模塊原理圖
MCU主控模塊(見圖3),本系統(tǒng)設(shè)計(jì)采用的CPU是STM-32F103RBT6,具備有內(nèi)置的128KB的Flash、20K的RAM、12位的AD、4個(gè)16位定時(shí)器以及三路UART通訊接口等多種資源,其時(shí)鐘頻率最高可達(dá)到72MHZ。
按鍵(Key)模塊,按鍵模塊主要借助系統(tǒng)時(shí)鐘進(jìn)行定時(shí)掃描完成,采取非CPU阻塞方法,提高了系統(tǒng)執(zhí)行效率以及響應(yīng)靈敏度等。通過按鍵識(shí)別來進(jìn)行相應(yīng)的系統(tǒng)響應(yīng)。
LCD顯示模塊,此模塊主要對(duì)解碼得到的最直接的圖像數(shù)據(jù)進(jìn)行處理顯示。
整個(gè)系統(tǒng)實(shí)現(xiàn)了經(jīng)過軟件解碼圖片相關(guān)數(shù)據(jù),解碼后再將數(shù)據(jù)傳輸?shù)絃CD模塊進(jìn)行顯示得到數(shù)碼相框顯示圖片的效果。在進(jìn)行圖片顯示的同時(shí),有LED模塊進(jìn)行LED燈閃爍,同時(shí)增加按鍵中斷控制,通過按鍵可以控制LCD的顯示模式,控制循環(huán)顯示文件夾數(shù)據(jù)還是單一顯示、上一張和下一張等。與此同時(shí)在LCD屏幕上還留有一段文字顯示區(qū),在圖片顯示的同時(shí)進(jìn)行相應(yīng)內(nèi)容的說明展示等。
2.2 系統(tǒng)硬件設(shè)計(jì)
系統(tǒng)硬件分為數(shù)據(jù)儲(chǔ)存端、數(shù)據(jù)處理端、數(shù)據(jù)顯示端三大部分電路組成。數(shù)據(jù)儲(chǔ)存端主要包括SD卡儲(chǔ)存設(shè)備以及相應(yīng)的數(shù)據(jù)傳輸電路等組成。數(shù)據(jù)處理端主要有STM32開發(fā)板的MCU主控模塊(見圖4)處理完成,主要對(duì)數(shù)據(jù)進(jìn)行處理,通過讀取文件頭信息對(duì)圖片類型進(jìn)行判別,然后依據(jù)不同類型文件進(jìn)行相應(yīng)解碼流程,最終將處理后的數(shù)據(jù)送到下一端數(shù)據(jù)顯示端(圖5)進(jìn)行顯示。數(shù)據(jù)顯示端接收固定模式的數(shù)據(jù)格式通過LCD驅(qū)動(dòng)電路對(duì)數(shù)據(jù)進(jìn)行輸出顯示。
圖3 系統(tǒng)硬件方框圖
圖4 STM32開發(fā)板的MCU主控模塊原理圖
圖5 LCD顯示模塊原理圖
3.1 數(shù)據(jù)讀入模塊
本模塊包含F(xiàn)ATFS文件系統(tǒng)MALLOC內(nèi)存分配單元,USMART終端操作等。
首先,需要用MALLOC內(nèi)存分配單元的函數(shù)申請(qǐng)一定格式的內(nèi)存空間,為FATES文件系統(tǒng)進(jìn)行文件打開以及文件讀寫做準(zhǔn)備。在申請(qǐng)完內(nèi)存空間并判定申請(qǐng)成功后(某一步申請(qǐng)不成功就釋放所有已申請(qǐng)空間,并返回相應(yīng)錯(cuò)誤參數(shù))進(jìn)入文件打開以及讀寫階段。首先通過FATFS文件系統(tǒng)的f_opendir()函數(shù)打開相應(yīng)文件夾目錄,然后通過返回參數(shù)判定是否打開成功,如果打開成功,則通過f_readdir()讀取目錄下的一個(gè)文件,并通過while(1)循環(huán)全部查詢確定文件數(shù)目。
3.1.1 FATFS文件系統(tǒng)
FATFS是一個(gè)為小型嵌入式系統(tǒng)設(shè)計(jì)的通用FAT(File Allocation Table)文件系統(tǒng)模塊。具有Windows兼容的FAT文件系統(tǒng);不依賴于平臺(tái),易于移植;代碼和工作區(qū)占用空間非常小;多種配置選項(xiàng)等優(yōu)點(diǎn)。FATFS 的編寫遵循ANSI C,并且完全與磁盤I/O層分開。因此,它獨(dú)立(不依賴)于硬件架構(gòu)。它可以被嵌入到低成本的微控制器中,而不需要做任何修改。FAT文件系統(tǒng)用"簇"作為數(shù)據(jù)單元。每一個(gè)"簇"都有一組連續(xù)的刪去組成,并且其所含的扇區(qū)數(shù)必須是2的整倍數(shù)。簇的最大值是32KB。在使用FATFS文件系統(tǒng)的時(shí)候,首先需要將其移植到開發(fā)平臺(tái),移植主要分為三步,依次是數(shù)據(jù)類型定義(在interger。h內(nèi)部定義)、配置(在ffconf。h)、和函數(shù)編寫(6個(gè)接口函數(shù))。有關(guān)詳細(xì)的移植步驟請(qǐng)參見參考文獻(xiàn)[5]和[6]。
3.1.2 MALLOC內(nèi)存分配單元
該單元主要用于進(jìn)行內(nèi)存的分配和釋放,下面介紹一下主要函數(shù)的基本用法:
內(nèi)存分配函數(shù):malloc()
函數(shù)原型:(類型說明符 *)malloc (unsigned size);
參數(shù)說明:"類型說明符"用于表示此內(nèi)存區(qū)域用于何種數(shù)據(jù)類型。
"類型說明符 *"用于表明返回值類型強(qiáng)制類型轉(zhuǎn)換為該類型指針。
"size"要求是一個(gè)無符號(hào)數(shù),用以表示申請(qǐng)內(nèi)存的長度。使用舉例:cxk=(char *)malloc(1000);
作用:在內(nèi)存的動(dòng)態(tài)儲(chǔ)存區(qū)中分配申請(qǐng)一塊數(shù)據(jù)長度為"size"字節(jié)的連續(xù)內(nèi)存區(qū)域,該函數(shù)的返回值是該區(qū)域的首地址。
內(nèi)存空間釋放函數(shù):free()
函數(shù)原型:free(void *ptr)
參數(shù)說明:*ptr ptr是一指針變量,指向一塊需要被釋放內(nèi)存空間的首地址(該區(qū)域是被malloc函數(shù)或其他內(nèi)存分配函數(shù)所分配的)。
使用舉例:
cxk=(char *)malloc(1000);
…
…
free(ps);
3.1.3 USMART終端操作單元
USMART組件是由廣州市星翼電子科技公司開發(fā)的,是一個(gè)串口調(diào)試交互組件,主要有可以調(diào)用百分之九十以上的用戶直接編寫的函數(shù),并且占用的資源極少支持?jǐn)?shù)據(jù)類型多、支持函數(shù)返回顯示,使用方便,具有很好的移植性等優(yōu)點(diǎn)。USMART組件包含有六個(gè)文件: usmart。c、usmart。h、readme。txt、usmart_conFig.c、usmart_str。c、smart_ str。h。其中readme。txt是說明文檔,是對(duì)組件使用的具體說明,usmart。c是負(fù)責(zé)與外部實(shí)時(shí)交互等,usmat_str。c 內(nèi)部主要負(fù)責(zé)命令和參數(shù)的解析等,usmart_conFig.c主要由用戶添加,添加需要由usma進(jìn)行調(diào)試的函數(shù)。通過 USMART 和串口助手可以任意調(diào)用源程序中的任何函數(shù)并執(zhí)行,進(jìn)行調(diào)試。詳細(xì)內(nèi)容請(qǐng)參考參考文獻(xiàn)[9]。
3.2 圖片格式識(shí)別以及解碼模塊
本系統(tǒng)設(shè)計(jì)可以識(shí)別解碼出如bmp、jpg/jpeg、gif等多種格式的圖片,首先從格式識(shí)別來說,主要是通過代碼實(shí)現(xiàn)文件名的讀取,然后進(jìn)行其后綴部分的截取,通過后綴識(shí)別得到圖片文件類型,在得到圖片類型后并不能直接對(duì)其進(jìn)行顯示,因?yàn)橥环N圖片格式也有不同的類型,例如16位顏色圖、24位顏色圖、32位顏色圖、RGB(5.5.5)、RGB(5.6.5)等。進(jìn)而針對(duì)不同的文件類型采用對(duì)應(yīng)的解碼方式進(jìn)行解碼,最終解析出圖片數(shù)據(jù),再以LCD所需的數(shù)據(jù)格式把數(shù)據(jù)傳送到LCD硬件模塊開始顯示。對(duì)應(yīng)的流程圖如圖6所示。
圖6 圖片解碼流程
3.3 TFT-LCD顯示模塊
本模塊主要通過畫點(diǎn)函數(shù)實(shí)現(xiàn)數(shù)據(jù)的寫入,關(guān)鍵代碼如下:
pic_phy。draw_point函數(shù)原型以及參數(shù)介紹
函數(shù)原型:pic_phy。draw_point(int a,int b,int color);
參數(shù)說明:a表示在顯示屏上的x坐標(biāo),b表示顯示屏上的y坐標(biāo),color為要顯示的像素值,其中color的計(jì)算需要對(duì)取出的像素點(diǎn)數(shù)據(jù)進(jìn)行相應(yīng)移位轉(zhuǎn)換操作才能轉(zhuǎn)換成正確的顯示數(shù)據(jù)。
圖7 LCD顯示
本實(shí)驗(yàn)對(duì)BMP、JPEG、JPG以及GIF等多種格式圖片進(jìn)行按鍵控制播放以及幻燈片播放測試,均得到了正確快速地顯示,并通過按鍵控制檢測實(shí)現(xiàn)了顯示模式的轉(zhuǎn)換等功能。如圖8(a)(b)給出了顯示結(jié)果示例。
圖8 (a) 通過按鍵控制播放
圖8 (b) 自動(dòng)幻燈片播放
整個(gè)系統(tǒng)實(shí)現(xiàn)了經(jīng)過軟件解碼圖片相關(guān)數(shù)據(jù),解碼后再將數(shù)據(jù)傳輸?shù)絃CD模塊進(jìn)行顯示得到數(shù)碼相框顯示圖片的效果。在進(jìn)行圖片顯示的同時(shí),有LED模塊進(jìn)行LED燈閃爍,同時(shí)增加按鍵中斷控制,通過按鍵可以控制LCD的顯示模式,控制循環(huán)顯示文件夾數(shù)據(jù)還是單一顯示、上一張和下一張等。與此同時(shí)在LCD屏幕上還留有一段文字顯示區(qū),在圖片顯示的同時(shí)進(jìn)行相應(yīng)內(nèi)容的說明展示等功能。本系統(tǒng)顯示效果良好,系統(tǒng)的功能有待進(jìn)一步研究與發(fā)展,下一步的研究方向是實(shí)現(xiàn)更智能化的顯示,例如連接MABLAB自動(dòng)標(biāo)注圖像特征的結(jié)果數(shù)據(jù)實(shí)現(xiàn)跨平臺(tái)顯示等。
致謝:
在此感謝北京市教委面上項(xiàng)目(KM201510009008)支持。
[1]吳嘉慧。JPEG圖像解碼方案[J]?,F(xiàn)代計(jì)算機(jī),2007,03:49-53.
[2]徐壽芳。BMP圖像的文件格式及顯示方法探究[J]。湖州職業(yè)技術(shù)學(xué)院學(xué)報(bào),2005,02:80-82.
[3]李世清,陳春光,鞠曉光,潘照新。GIF圖像格式及壓縮方法的分析[J]。微型機(jī)與應(yīng)用,1994,09:13-14.
[4]陳雪芳?;赟TM32F103的電子相框的設(shè)計(jì)[J]。東莞理工學(xué)院學(xué)報(bào),2012,01:49-52.
[5]顧春洋,李鑫,張強(qiáng)?;赟D卡的FAT32文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]。產(chǎn)業(yè)與科技論壇,2013,02:96-98.
[6]史勝偉,潘冀寧,孫慧洋?;赟TM32的MicroSD卡Fat文件系統(tǒng)快速實(shí)現(xiàn)[J]。通訊世界,2016,17:81-83.
[7]戴春燕,徐智文。對(duì)c++中malloc/free和new/delete的探討[J]。包鋼科技,2009,01:59-60+66.
[8]陸金江。深入探究C中的malloc()和free()函數(shù)[J]。計(jì)算機(jī)光盤軟件與應(yīng)用,2013,21:120+122.
[9]胡仕剛,曹會(huì)祎,吳笑峰,席在芳,唐志軍。USMART調(diào)試方法在嵌入式系統(tǒng)教學(xué)中的應(yīng)用[J]。信息通信,2016,05:130-131.
[10]劉軍。精通STM32F4[M]。北京:北京航空航天大學(xué)出版社,2015.