基于RT-Thread和STM32的數碼相框設計方案
1.引言
近年來,隨著數碼相機的普及,一種以數碼照片的保存、回放和瀏覽為核心功能的產品,數碼相框應運而生,它以其獨特的設計理念和美妙的欣賞效果倍受市場青睞。數碼相框采用傳統(tǒng)普通相框的外觀造型,把傳統(tǒng)普通相框的中間照片部分換成液晶顯示屏,配上電源,控制器,存儲介質等部件,可以直接展示數碼照片。同時,數碼相框也可以在同一個相框內循環(huán)展示不同照片,解決了需要使用電腦才能查看數碼相片的缺陷,給日益增多的數碼照片和喜好照片的人們提供一個更好的展示照片的平臺和空間。基于此,本系統(tǒng)設計了基于RT-Thread和STM32的數碼相框。
本系統(tǒng)采用STM32為主控芯片,利用源代碼開放的嵌入式RT-Thread操作系統(tǒng)和人機交互界面μC/GUI共同建立的平臺設計了數碼相框系統(tǒng)。系統(tǒng)主要實現了JPEG格式圖片在觸摸液晶屏上的瀏覽展示、USB主機讀取功能、SPIFLASH存儲等功能。
2.系統(tǒng)總體設計
本系統(tǒng)由嵌入式處理器、外圍設備、嵌入式操作系統(tǒng)和應用軟件等部分組成。系統(tǒng)以嵌入式RT- Thread和嵌入式微控制器STM32為核心平臺,通過μC/GUI建立人機交互界面,利用USB主機讀取功能將圖片和字庫文件寫入外部SPI FLASH,利用文件系統(tǒng)讀取圖片文件,經過圖片解碼算法處理,顯示在觸摸液晶屏上,通過觸摸完成對圖片的瀏覽功能。系統(tǒng)總體結構框圖如圖1所示。
3.系統(tǒng)硬件設計
本系統(tǒng)以STM32為主要硬件平臺,系統(tǒng)整體硬件結構圖如圖2所示。系統(tǒng)硬件主要有電源模塊、STM32最小系統(tǒng)、JTAG下載調試接口、USB驅動電路、SPI FLASH驅動模塊、觸摸LCD驅動電路等部分組成。
3.1電源模塊
本系統(tǒng)中微控制器及其外圍電路驅動模塊需要3.3V電源,系統(tǒng)選用的電源電池為3.7V,需要通過穩(wěn)壓芯片提供3.3V電壓。
對于產生3.3V電壓,采用國家半導體公司的LM1117穩(wěn)壓芯片輸出3.3V,LM1117提供電流限制和熱保護。電路包含1個齊納調節(jié)的帶隙參考電壓以確保輸出電壓的精度在±1%以內。
輸出端需要一個至少10uF的鉭電容來改善瞬態(tài)響應和穩(wěn)定性。LM1117穩(wěn)壓芯片輸出3.3V電路如圖3所示。
3.2 USB驅動電路
STM32芯片內部集成了USB外設,減輕了USB電路的設計負擔,本系統(tǒng)設計了USB接口電路以及ESD保護電路。
3.2.1 USB接口電路
在USB接口電路中將USB上拉電壓接到D+上,實現USB全速通訊,三極管為開關作用,當開關開啟時,PC開始枚舉USB存儲設備。USB的VCC引腳沒有接板上電源,通過PC機給USB設備供電。
3.2.2 ESD保護電路
采用意法半導體公司的USBLC6-2P6,該芯片使USB的D+/D-信號完全平衡,I/O接口到地線的匹配公差僅為0.04pF,完全在USB 2.0最大1pF的公差范圍內。如果USB數據線路上發(fā)生ESD現象,芯片的ESD保護功能就會將電流引至地線,為了確保ESD保護的最高效能,數據線路采用軌對軌保護拓撲,為了提高輸出功率,VCC線路采用鉗位保護結構。USB驅動保護電路原理圖如圖4所示。
3.3 SPI FLASH驅動電路
系統(tǒng)采用SPI串行閃存芯片W25Q64,該芯片具有電路設計簡單、數據讀取速度快等優(yōu)點,能夠減少系統(tǒng)電路切換噪聲,降低系統(tǒng)功耗及開發(fā)成本。其應用電路如圖5所示。
3.4 LCD觸摸驅動電路
本系統(tǒng)的觸摸控制器選用TSC2046,TSC2046是四線電阻式觸摸屏控制器,其核心是一個具有采樣和保持功能的12位逐次逼近式A/D轉換器。本系統(tǒng)通過STM32的SPI接口驅動TSC2046控制器,典型的驅動電路如圖6所示。
4.系統(tǒng)軟件設計
本系統(tǒng)的軟件主要由系統(tǒng)各模塊初始化、μC/GUI建立人機交互界面、文件系統(tǒng)讀取圖片及字庫文件、圖片解碼算法的實現、觸摸瀏覽功能及幻燈片播放功能等功能模塊組成。
4.1μC/GUI建立人機交互界面本系統(tǒng)利用μC/GUI builder建立μC/GUI人機交互界面,在μC/GUI builder中建立窗體、文本框、控件等、將編譯后產生的C文件添加到工程目錄中。μC/GUI builder的應用,縮短了界面開發(fā)周期,修改靈活方便,后期修改界面時,只需要在μC/GUI builder修改相關組件,編譯運行即可實現程序的修改。
4.2μC/GUI顯示漢字
μC/GUI中通過查找字模的方式來實現字體的顯示。字體庫中的每一個字母都有其對應的字模,字模由結構體GUI_FONT和GUI_FONT_PROP統(tǒng)一管理。但是μC/GUI中本身只支持英文,沒有提供中文的字庫源碼文件。本系統(tǒng)在修改μC /GUI字庫顯示驅動函數的基礎上實現了漢字的顯示,以顯示12*12點陣漢字為例,具體的修改步驟如下:
第一步:在GUI.H中聲明全局結構體對象GUI_Font12_HZ;
第二步:定義存放字模數據的數組;
第三步:定義用于說明每個字母的字模數據在程序段存儲方式的結構體;
第四步:根據漢字內碼高位定義多個結構體,用于存放字庫字模編碼和字模數據存放地址的映像;
第五步:將創(chuàng)建的漢字庫文件HZK12.C添加至μC/GUI工程,在主函數中調用顯示函數。
通過以上步驟實現了中文漢字在μC/GUI界面的顯示,經測試,漢字顯示流暢穩(wěn)定。
4.3圖片解碼算法
JPEG圖片解碼顯示包括解析JPEG頭文件信息、基于連續(xù)DCT編碼的JPEG解碼算法處理、轉換圖像格式、液晶顯示等部分,總體流程圖如圖7所示。
4.3.1解析JPEG頭文件信息
對JPEG解碼的過程進行初始化,獲取JPEG頭文件中的相關信息,本系統(tǒng)的方法是設計一系列的結構體對應頭文件中的各個信息標記,并存儲標記內表示的信息,如色彩信息、采樣比、圖片尺寸、量化表、Huffman解碼表等重要信息。
4.3.2基于連續(xù)DCT編碼的JPEG解碼算法
基于連續(xù)DCT編碼的JPEG解碼算法包括熵解碼、反量化和反向離散余弦變換(IDCT)共三個步驟。JPEG基本系統(tǒng)的解碼器結構圖如圖8所示。
(1)熵解碼。熵解碼的輸入信號是被壓縮編碼的比特流,輸出是被解碼得到的DCT變換系數的量化值。通過查找Huffman解碼表將壓縮圖像數據還原成交流AC系數和直流DC系數組成的量化數據塊。
熵解碼對讀入的圖像數據進行DC直流系數和AC交流系數的Huffman解碼。JPEG算法提供標準的Huffman碼表,針對每幅圖像都有各自不同的特點,系統(tǒng)熵解碼采用自適應的Huffman碼表。采用自適應的Huffman碼表,首先統(tǒng)計輸入圖像數據的特性,生成碼樹,再反推得到各級Huffman碼表。
在JPEG頭文件信息的標記中,定義了一張表用來記錄Huffman樹其代碼長度限制在16bit以內。JPEG頭文件信息一般包含4個Huffman碼:用于解碼直流DC系數的Huffman碼表,其中包括一個亮度表和一個色度表;用于解碼交流AC系數的Huffman碼表,其中包括一個亮度表和一個色度表。根據Huffman碼表在文件中的保存形式,設計Huffman解碼一個碼字的程序,程序流程圖如圖9所示。
解碼時,輸入圖像壓縮后的數據流,從數據流中讀取比特數據組成的碼字,在Huffman樹中搜索碼字的位置,根據碼字的位置確定解碼的值,解碼輸出結果是一個8位值。在Huffman解碼過程中,如果產生了一個0xFF,就用0xFF0x00代替,把0xFF0x00當做0xFF進行處理。
(2)反量化。反量化的輸入信號是熵解碼后的數據,通過查量化表進行計算,將在壓縮過程中經過DCT變換后的頻率系數還原出來,反量化成DCT系數。
JPEG文件中包括亮度量化表和色度量化表兩張量化表,將Huffman解碼得到的系數矩陣與相應的量化矩陣相乘,即得到反量化結果。
由于數據是按8×8矩陣的“Z”字形編排,所以要對反量化運算的結果進行反Zig-Zag變換。
(3)反向離散余弦變換(IDCT)。反向離散余弦變換把頻率域DCT分量系數反轉成顏色空間域表示的圖像數據。對反量化后得到的DCT變換系數經過反向離散余弦變換IDCT得到圖像的像素。反離散余弦轉換的輸入是頻率域的一個8×8分量系數塊,輸出則得到空間域的一個8×8像素塊。
在程序運行過程中,IDCT運算量較大,有大量浮點乘法和加法運算,程序執(zhí)行速度較慢,這對圖片能否流暢的顯示有很大影響?;诖吮窘y(tǒng)軟件對IDCT算法了優(yōu)化,采用一種快速IDCT算法[5],把二維IDCT分解成行和列兩個一維IDCT,再將IDCT算法通過數學變換轉化為離散傅里葉逆變換(IDFT),利用矩陣變換簡化計算。在開始進行二維IDCT轉換時,先對輸入的反量化后的數據進行8次一維的行變換,并將存儲運行結果,再對運行的結果進行8次一維的列變換,經過兩次變換,得到的就是二維IDCT運算變換的結果。程序流程圖如圖10所示。
4.3.3色彩模式轉換
由于液晶支持的是RGB格式的圖像數據,需要把執(zhí)行完解碼過程得到的YCrCb格式的數據轉換成RGB模式,將256級的YCrCb色彩模型轉換成RGB色彩模型的計算公式如式(1)。
因為R、G、B的取值范圍為[0,255],需要對運算結果進行閾值保護,對超過255的數值,限定在255,小于0的數值,限定在0.經過運算最終可以得到RGB模式的圖像數據,完成解碼過程。
4.4圖片瀏覽模式
本系統(tǒng)的圖片瀏覽模式有觸摸手動瀏覽和定時自動瀏覽兩種模式可供選擇。在觸摸手動瀏覽模式下,有“下一張”,“上一張”,“退出”控件。通過操作觸摸屏上下翻頁的控件,實現瀏覽圖片的功能。在瀏覽完最后一張時,系統(tǒng)會自動跳轉到第一張。在定時自動瀏覽模式下,界面僅有退出控件,每隔3秒,自動進行下一張圖片的瀏覽,并循環(huán)顯示。
5.系統(tǒng)調試
5.1硬件調試
通過硬件電路設計,檢查元器件之間的電氣連接,下載基本調試程序,檢測系統(tǒng)板運行狀況,在對USB枚舉測試時,通過USB數據線連接至電腦,可以對flash存儲設備進行讀寫操作。
5.2軟件調試
5.2.1 LIB庫的編譯
本系統(tǒng)的軟件開發(fā)環(huán)境是MDK,在程序基本模塊的底層驅動編寫完善以后,將STM32的底層外設驅動庫和μC/GUI庫函數編譯封裝成LIB庫,在后期程序開發(fā)時,大大提高了程序的編譯效率,縮短了軟件開發(fā)周期。
5.2.2 Finsh Shell調試組件本系統(tǒng)采用RT-Thread嵌入式操作系統(tǒng),通過其自帶的用戶命令行組件Finsh Shell查看系統(tǒng)運行狀況。通過超級終端輸入相應的命令來使用Finsh Shell.Finsh Shell在RT-Thread中被設計成一個獨立的線程,通過串口設備輸入相應的命令,系統(tǒng)對用戶命令進行解析執(zhí)行,可用來獲取系統(tǒng)運行時信息,對任意寄存器和內存地址進行讀寫操作,還能夠直接在shell中調用系統(tǒng)函數,訪問系統(tǒng)變量。FinshShell組件的使用,在很大程度上提高了調試程序的效率。
5.2.3圖片解碼調試
由于圖片解碼算法占用內存較大,考慮到圖片解碼算法在STM32中可能會因為內存分配不足而無法正常運行,在驗證圖片解碼函數的正確性時,先在PC機的VC模擬器上運行,用以給圖片解碼算法提供一個理想的運行平臺。在模擬器中,用數組存儲圖片二進制源碼,用解碼算法對圖片的數組數據進行解碼,驗證解碼算法的正確性。在模擬器運行正確后,再將圖片解碼算法移植到本系統(tǒng)上運行,實踐證明,STM32的內存足以支持圖片解碼算法正常執(zhí)行。實驗在VC模擬器中運行的效果圖如圖11所示。
6.結論
本文介紹了基于RT-Thread和STM32的數碼相框的設計方案,通過設計相關硬件電路和軟件算法,實現了數碼相框對JPEG格式圖片文件的瀏覽功能。本系統(tǒng)設計的基于連續(xù)IDCT變換的JPEG解碼算法能夠正確穩(wěn)定完成JPEG格式圖像的解碼,解碼速度較快,恢復圖像的質量良好。實際測試表明,本方案具有很強的實用性。