北方工業大學電子信息工程學院通信工程系 崔曉康 范馨予
基于STM32數碼相框的設計與實現
北方工業大學電子信息工程學院通信工程系 崔曉康 范馨予
數碼相框作為嵌入式設計的典型應用,相對于普通相框來說更加靈活多變。基于STM32系列嵌入式開發板豐富的外圍設備,使得數碼相框的到了進一步的發展。本系統采用STM32作為控制核心,添加了多種格式漢字顯示、并移植了FATFS去讀取相關文件信息的功能,研究實現了對SD卡里多幅圖片多種格式(如bmp、jpg/jpeg、gif)以幻燈片形式在TFT屏上動態顯示的效果,同時連接顯示了相應圖片內容的文字信息,并且增加了按鍵控制,使得數碼相框的設計更加人性化。
嵌入式;STM32微處理器;數碼相框;圖片解碼
近年來,隨著數字技術的快速發展,各種數字類產品遍布全球,數字圖像的數量也正以驚人的速度增長,為了更加方便快捷的查看圖像,高速瀏覽圖片的設備應運而生,數碼相框采用傳統的外觀造型,只是把傳統外觀部分換成了液晶顯示屏,加上外圍設備以及供電模塊等,就可以實現數碼照片的直接顯示,與此同時還可以循環顯示照片,實現幻燈片的效果。這給日益增多的數字照片和攝影愛好者們提供了一個很好的照片展示平臺和空間。數碼相框擁有相當大的優勢,使用簡單,直接從數碼相機中取出記憶卡插入到數碼相框卡槽中即可瀏覽;無需像之前那樣繁瑣,無需電腦,更不需要沖洗打印,各種格式的數字圖片均能夠快速顯示。
嵌入式是當今最熱門的概念之一,它具有體積小、性能強、功耗低、可靠性高以及面向行業應用等突出特征。嵌入式系統將先進的半導體技術、計算機技術和電子技術,以及各個行業的具體應用相結合,是一個技術密集、資金密集、學科交叉和不斷創新的知識集成系統。因此基于嵌入式的各種數碼相框的設計已經成為目前研究的熱點。通常來說,嵌入式系統可以劃分為硬件和軟件兩部分。嵌入式硬件由嵌入式微處理器、片內周邊電路和外圍設備三部分組成。其中嵌入式微處理器是嵌入式硬件系統的核心,直接影響嵌入式產品的應用范圍和開發復雜度。典型的嵌入式微處理器有Motorola公司。
本課題所研究的數碼相框主要實現以下功能:插入SD卡后對指定文件夾中的圖片進行尋址與讀取,即通過SD卡進入SPI模式對數據進行讀寫。通過系統讀取以及解碼SD卡內存儲的BMP、JPEG、JPG以及GIF格式圖片,把多幅圖片以幻燈片的形式在TFTLCD屏幕上顯示出來,并且通過按鍵控制實現對屏幕顯示圖片的控制包括開啟/暫停幻燈片顯示、上一張/下一張顯示等功能,并且顯示圖片的同時在圖片下方會同時顯示基于MATLAB自動標注的結果內容。
2.1 系統結構
基于STM32的數碼相框的系統設計如圖1所示,由圖中可知,本系統設計由SD_CARD模塊(SD卡通常支持兩種操作模式:SD卡模式與SPI模式。本設計采用SPI模式)、SPI模塊、FLASH緩存模塊、MCU主控模塊、按鍵(Key)模塊、LCD顯示模塊、LED狀態顯示模塊共七個模塊組成。下面依據順序說明各個模塊以及連接方法。
第一個SD_CARD模塊,SD卡通過SDIO接口進行通訊,所有的通信都要遵從SD卡通信協議(SD卡協議相對復雜,這里只說明有關應用的部分,具體講解可查看具體的協議手冊),首先,可以使用SDIO接口通訊的不只是常見的單純用于儲存數據的SD儲存卡,還有SD I/O卡,MMC卡。這幾種卡的類型是有區別的,其中,SD I/O卡就是利用SDIO接口的一些模塊,通過插入特定的SD卡槽中由SD卡槽中,使設備的功能得到擴展。SDIO的基本構架如圖1所示。從圖中可以看出,SDIO接口包含了CMD(命令信號線,由主時鐘產生時鐘信號)、CLK及DAT[7 :0]信號線(主機和從機之間的數據信號在這八條線上傳輸)。圖中這三條信號線都是在通信中共用的總線,SDIO主機是通過命令來和SD從設備的相應來尋址的。 SDIO的所有命令以及命令相應都是通過SDIO-CMD引腳來進行傳輸的。并且命令只能是由主機的SDIO控制器發出。

圖1 STM32的SDIO接口
SPI模塊,是一種串行外圍設備接口,是作為一種高速全雙工的通信總線,如圖2所示,共包含了四條總線,分別為SS、SCK、MOSI、MISO。其中SS(Slave Select)為片選信號線,每個設備的的片選信號線都是與MCU單獨的引腳相連,其他幾個引腳則以并聯的方式連接到相同的SPI總線上,當片選引腳有效時開始通信。

圖2 SPI接口模塊原理圖
MCU主控模塊(見圖3),本系統設計采用的CPU是STM-32F103RBT6,具備有內置的128KB的Flash、20K的RAM、12位的AD、4個16位定時器以及三路UART通訊接口等多種資源,其時鐘頻率最高可達到72MHZ。
按鍵(Key)模塊,按鍵模塊主要借助系統時鐘進行定時掃描完成,采取非CPU阻塞方法,提高了系統執行效率以及響應靈敏度等。通過按鍵識別來進行相應的系統響應。
LCD顯示模塊,此模塊主要對解碼得到的最直接的圖像數據進行處理顯示。
整個系統實現了經過軟件解碼圖片相關數據,解碼后再將數據傳輸到LCD模塊進行顯示得到數碼相框顯示圖片的效果。在進行圖片顯示的同時,有LED模塊進行LED燈閃爍,同時增加按鍵中斷控制,通過按鍵可以控制LCD的顯示模式,控制循環顯示文件夾數據還是單一顯示、上一張和下一張等。與此同時在LCD屏幕上還留有一段文字顯示區,在圖片顯示的同時進行相應內容的說明展示等。
2.2 系統硬件設計
系統硬件分為數據儲存端、數據處理端、數據顯示端三大部分電路組成。數據儲存端主要包括SD卡儲存設備以及相應的數據傳輸電路等組成。數據處理端主要有STM32開發板的MCU主控模塊(見圖4)處理完成,主要對數據進行處理,通過讀取文件頭信息對圖片類型進行判別,然后依據不同類型文件進行相應解碼流程,最終將處理后的數據送到下一端數據顯示端(圖5)進行顯示。數據顯示端接收固定模式的數據格式通過LCD驅動電路對數據進行輸出顯示。

圖3 系統硬件方框圖

圖4 STM32開發板的MCU主控模塊原理圖

圖5 LCD顯示模塊原理圖
3.1 數據讀入模塊
本模塊包含FATFS文件系統MALLOC內存分配單元,USMART終端操作等。
首先,需要用MALLOC內存分配單元的函數申請一定格式的內存空間,為FATES文件系統進行文件打開以及文件讀寫做準備。在申請完內存空間并判定申請成功后(某一步申請不成功就釋放所有已申請空間,并返回相應錯誤參數)進入文件打開以及讀寫階段。首先通過FATFS文件系統的f_opendir()函數打開相應文件夾目錄,然后通過返回參數判定是否打開成功,如果打開成功,則通過f_readdir()讀取目錄下的一個文件,并通過while(1)循環全部查詢確定文件數目。
3.1.1 FATFS文件系統
FATFS是一個為小型嵌入式系統設計的通用FAT(File Allocation Table)文件系統模塊。具有Windows兼容的FAT文件系統;不依賴于平臺,易于移植;代碼和工作區占用空間非常小;多種配置選項等優點。FATFS 的編寫遵循ANSI C,并且完全與磁盤I/O層分開。因此,它獨立(不依賴)于硬件架構。它可以被嵌入到低成本的微控制器中,而不需要做任何修改。FAT文件系統用"簇"作為數據單元。每一個"簇"都有一組連續的刪去組成,并且其所含的扇區數必須是2的整倍數。簇的最大值是32KB。在使用FATFS文件系統的時候,首先需要將其移植到開發平臺,移植主要分為三步,依次是數據類型定義(在interger。h內部定義)、配置(在ffconf。h)、和函數編寫(6個接口函數)。有關詳細的移植步驟請參見參考文獻[5]和[6]。
3.1.2 MALLOC內存分配單元
該單元主要用于進行內存的分配和釋放,下面介紹一下主要函數的基本用法:
內存分配函數:malloc()
函數原型:(類型說明符 *)malloc (unsigned size);
參數說明:"類型說明符"用于表示此內存區域用于何種數據類型。
"類型說明符 *"用于表明返回值類型強制類型轉換為該類型指針。
"size"要求是一個無符號數,用以表示申請內存的長度。使用舉例:cxk=(char *)malloc(1000);
作用:在內存的動態儲存區中分配申請一塊數據長度為"size"字節的連續內存區域,該函數的返回值是該區域的首地址。
內存空間釋放函數:free()
函數原型:free(void *ptr)
參數說明:*ptr ptr是一指針變量,指向一塊需要被釋放內存空間的首地址(該區域是被malloc函數或其他內存分配函數所分配的)。
使用舉例:
cxk=(char *)malloc(1000);
…
…
free(ps);
3.1.3 USMART終端操作單元
USMART組件是由廣州市星翼電子科技公司開發的,是一個串口調試交互組件,主要有可以調用百分之九十以上的用戶直接編寫的函數,并且占用的資源極少支持數據類型多、支持函數返回顯示,使用方便,具有很好的移植性等優點。USMART組件包含有六個文件: usmart。c、usmart。h、readme。txt、usmart_conFig.c、usmart_str。c、smart_ str。h。其中readme。txt是說明文檔,是對組件使用的具體說明,usmart。c是負責與外部實時交互等,usmat_str。c 內部主要負責命令和參數的解析等,usmart_conFig.c主要由用戶添加,添加需要由usma進行調試的函數。通過 USMART 和串口助手可以任意調用源程序中的任何函數并執行,進行調試。詳細內容請參考參考文獻[9]。
3.2 圖片格式識別以及解碼模塊
本系統設計可以識別解碼出如bmp、jpg/jpeg、gif等多種格式的圖片,首先從格式識別來說,主要是通過代碼實現文件名的讀取,然后進行其后綴部分的截取,通過后綴識別得到圖片文件類型,在得到圖片類型后并不能直接對其進行顯示,因為同一種圖片格式也有不同的類型,例如16位顏色圖、24位顏色圖、32位顏色圖、RGB(5.5.5)、RGB(5.6.5)等。進而針對不同的文件類型采用對應的解碼方式進行解碼,最終解析出圖片數據,再以LCD所需的數據格式把數據傳送到LCD硬件模塊開始顯示。對應的流程圖如圖6所示。

圖6 圖片解碼流程
3.3 TFT-LCD顯示模塊
本模塊主要通過畫點函數實現數據的寫入,關鍵代碼如下:
pic_phy。draw_point函數原型以及參數介紹
函數原型:pic_phy。draw_point(int a,int b,int color);
參數說明:a表示在顯示屏上的x坐標,b表示顯示屏上的y坐標,color為要顯示的像素值,其中color的計算需要對取出的像素點數據進行相應移位轉換操作才能轉換成正確的顯示數據。

圖7 LCD顯示
本實驗對BMP、JPEG、JPG以及GIF等多種格式圖片進行按鍵控制播放以及幻燈片播放測試,均得到了正確快速地顯示,并通過按鍵控制檢測實現了顯示模式的轉換等功能。如圖8(a)(b)給出了顯示結果示例。

圖8 (a) 通過按鍵控制播放

圖8 (b) 自動幻燈片播放
整個系統實現了經過軟件解碼圖片相關數據,解碼后再將數據傳輸到LCD模塊進行顯示得到數碼相框顯示圖片的效果。在進行圖片顯示的同時,有LED模塊進行LED燈閃爍,同時增加按鍵中斷控制,通過按鍵可以控制LCD的顯示模式,控制循環顯示文件夾數據還是單一顯示、上一張和下一張等。與此同時在LCD屏幕上還留有一段文字顯示區,在圖片顯示的同時進行相應內容的說明展示等功能。本系統顯示效果良好,系統的功能有待進一步研究與發展,下一步的研究方向是實現更智能化的顯示,例如連接MABLAB自動標注圖像特征的結果數據實現跨平臺顯示等。
致謝:
在此感謝北京市教委面上項目(KM201510009008)支持。
[1]吳嘉慧。JPEG圖像解碼方案[J]。現代計算機,2007,03:49-53.
[2]徐壽芳。BMP圖像的文件格式及顯示方法探究[J]。湖州職業技術學院學報,2005,02:80-82.
[3]李世清,陳春光,鞠曉光,潘照新。GIF圖像格式及壓縮方法的分析[J]。微型機與應用,1994,09:13-14.
[4]陳雪芳?;赟TM32F103的電子相框的設計[J]。東莞理工學院學報,2012,01:49-52.
[5]顧春洋,李鑫,張強?;赟D卡的FAT32文件系統的設計與實現[J]。產業與科技論壇,2013,02:96-98.
[6]史勝偉,潘冀寧,孫慧洋?;赟TM32的MicroSD卡Fat文件系統快速實現[J]。通訊世界,2016,17:81-83.
[7]戴春燕,徐智文。對c++中malloc/free和new/delete的探討[J]。包鋼科技,2009,01:59-60+66.
[8]陸金江。深入探究C中的malloc()和free()函數[J]。計算機光盤軟件與應用,2013,21:120+122.
[9]胡仕剛,曹會祎,吳笑峰,席在芳,唐志軍。USMART調試方法在嵌入式系統教學中的應用[J]。信息通信,2016,05:130-131.
[10]劉軍。精通STM32F4[M]。北京:北京航空航天大學出版社,2015.