<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 消費電子 > 設計應用 > 基于RT-Thread和STM32的數碼相框的設計方案(二)

基于RT-Thread和STM32的數碼相框的設計方案(二)

作者: 時(shí)間:2018-09-06 來(lái)源:網(wǎng)絡(luò ) 收藏

4.系統軟件設計

本文引用地址:http://dyxdggzs.com/article/201809/388619.htm

本系統的軟件主要由系統各模塊初始化、μC/GUI建立人機交互界面、文件系統讀取圖片及字庫文件、圖片解碼算法的實(shí)現、觸摸瀏覽功能及幻燈片播放功能等功能模塊組成。

4.1 μC/GUI建立人機交互界面本系統利用μC/GUI builder建立μC/GUI人機交互界面,在μC/GUI builder中建立窗體、文本框、控件等、將編譯后產(chǎn)生的C文件添加到工程目錄中。μC/GUI builder的應用,縮短了界面開(kāi)發(fā)周期,修改靈活方便,后期修改界面時(shí),只需要在μC/GUI builder修改相關(guān)組件,編譯運行即可實(shí)現程序的修改。

4.2 μC/GUI顯示漢字

μC/GUI中通過(guò)查找字模的方式來(lái)實(shí)現字體的顯示。字體庫中的每一個(gè)字母都有其對應的字模,字模由結構體GUI_FONT和GUI_FONT_PROP統一管理。但是μC/GUI中本身只支持英文,沒(méi)有提供中文的字庫源碼文件。本系統在修改μC/GUI字庫顯示驅動(dòng)函數的基礎上實(shí)現了漢字的顯示,以顯示12*12點(diǎn)陣漢字為例,具體的修改步驟如下:

第一步:在GUI.H中聲明全局結構體對象GUI_Font12_HZ;

第二步:定義存放字模數據的數組;

第三步:定義用于說(shuō)明每個(gè)字母的字模數據在程序段存儲方式的結構體;

第四步:根據漢字內碼高位定義多個(gè)結構體,用于存放字庫字模編碼和字模數據存放地址的映像;

第五步:將創(chuàng )建的漢字庫文件HZK12.C添加至μC/GUI工程,在主函數中調用顯示函數。

通過(guò)以上步驟實(shí)現了中文漢字在μC/GUI界面的顯示,經(jīng)測試,漢字顯示流暢穩定。

4.3 圖片解碼算法

JPEG圖片解碼顯示包括解析JPEG頭文件信息、基于連續DCT編碼的JPEG解碼算法處理、轉換圖像格式、液晶顯示等部分,總體流程圖如圖7所示。

4.3.1 解析JPEG頭文件信息

對JPEG解碼的過(guò)程進(jìn)行初始化,獲取JPEG頭文件中的相關(guān)信息,本系統的方法是設計一系列的結構體對應頭文件中的各個(gè)信息標記,并存儲標記內表示的信息,如色彩信息、采樣比、圖片尺寸、量化表、Huffman解碼表等重要信息。

4.3.2 基于連續DCT編碼的JPEG解碼算法

基于連續DCT編碼的JPEG解碼算法包括熵解碼、反量化和反向離散余弦變換(IDCT)共三個(gè)步驟。JPEG基本系統的解碼器結構圖如圖8所示。

(1)熵解碼。熵解碼的輸入信號是被壓縮編碼的比特流,輸出是被解碼得到的DCT變換系數的量化值。通過(guò)查找Huffman解碼表將壓縮圖像數據還原成交流AC系數和直流DC系數組成的量化數據塊。

熵解碼對讀入的圖像數據進(jìn)行DC直流系數和AC交流系數的Huffman解碼。JPEG算法提供標準的Huffman碼表,針對每幅圖像都有各自不同的特點(diǎn),系統熵解碼采用自適應的Huffman碼表。采用自適應的Huffman碼表,首先統計輸入圖像數據的特性,生成碼樹(shù),再反推得到各級Huffman碼表。

在JPEG頭文件信息的標記中,定義了一張表用來(lái)記錄Huffman樹(shù)其代碼長(cháng)度限制在16bit以?xún)?。JPEG頭文件信息一般包含4個(gè)Huffman碼:用于解碼直流DC系數的Huffman碼表,其中包括一個(gè)亮度表和一個(gè)色度表;用于解碼交流AC系數的Huffman碼表,其中包括一個(gè)亮度表和一個(gè)色度表。根據Huffman碼表在文件中的保存形式,設計Huffman解碼一個(gè)碼字的程序,程序流程圖如圖9所示。

解碼時(shí),輸入圖像壓縮后的數據流,從數據流中讀取比特數據組成的碼字,在Huffman樹(shù)中搜索碼字的位置,根據碼字的位置確定解碼的值,解碼輸出結果是一個(gè)8位值。在Huffman解碼過(guò)程中,如果產(chǎn)生了一個(gè)0xFF,就用0xFF0x00代替,把0xFF0x00當做0xFF進(jìn)行處理。

(2)反量化。反量化的輸入信號是熵解碼后的數據,通過(guò)查量化表進(jìn)行計算,將在壓縮過(guò)程中經(jīng)過(guò)DCT變換后的頻率系數還原出來(lái),反量化成DCT系數。

JPEG文件中包括亮度量化表和色度量化表兩張量化表,將Huffman解碼得到的系數矩陣與相應的量化矩陣相乘,即得到反量化結果。

由于數據是按8×8矩陣的“Z”字形編排,所以要對反量化運算的結果進(jìn)行反Zig-Zag變換。

(3)反向離散余弦變換(IDCT)。反向離散余弦變換把頻率域DCT分量系數反轉成顏色空間域表示的圖像數據。對反量化后得到的DCT變換系數經(jīng)過(guò)反向離散余弦變換IDCT得到圖像的像素。反離散余弦轉換的輸入是頻率域的一個(gè)8×8分量系數塊,輸出則得到空間域的一個(gè)8×8像素塊。

在程序運行過(guò)程中,IDCT運算量較大,有大量浮點(diǎn)乘法和加法運算,程序執行速度較慢,這對圖片能否流暢的顯示有很大影響?;诖吮窘y軟件對IDCT算法了優(yōu)化,采用一種快速I(mǎi)DCT算法[5],把二維IDCT分解成行和列兩個(gè)一維IDCT,再將IDCT算法通過(guò)數學(xué)變換轉化為離散傅里葉逆變換(IDFT),利用矩陣變換簡(jiǎn)化計算。在開(kāi)始進(jìn)行二維IDCT轉換時(shí),先對輸入的反量化后的數據進(jìn)行8次一維的行變換,并將存儲運行結果,再對運行的結果進(jìn)行8次一維的列變換,經(jīng)過(guò)兩次變換,得到的就是二維IDCT運算變換的結果。程序流程圖如圖10所示。

4.3.3 色彩模式轉換

由于液晶支持的是RGB格式的圖像數據,需要把執行完解碼過(guò)程得到的YCrCb格式的數據轉換成RGB模式,將256級的YCrCb色彩模型轉換成RGB色彩模型的計算公式如式(1)。

因為R、G、B的取值范圍為[0,255],需要對運算結果進(jìn)行閾值保護,對超過(guò)255的數值,限定在255,小于0的數值,限定在0.經(jīng)過(guò)運算最終可以得到RGB模式的圖像數據,完成解碼過(guò)程。

4.4 圖片瀏覽模式

本系統的圖片瀏覽模式有觸摸手動(dòng)瀏覽和定時(shí)自動(dòng)瀏覽兩種模式可供選擇。在觸摸手動(dòng)瀏覽模式下,有“下一張”,“上一張”,“退出”控件。通過(guò)操作觸摸屏上下翻頁(yè)的控件,實(shí)現瀏覽圖片的功能。在瀏覽完最后一張時(shí),系統會(huì )自動(dòng)跳轉到第一張。在定時(shí)自動(dòng)瀏覽模式下,界面僅有退出控件,每隔3秒,自動(dòng)進(jìn)行下一張圖片的瀏覽,并循環(huán)顯示。

5.系統調試

5.1 硬件調試

通過(guò)硬件電路設計,檢查元器件之間的電氣連接,下載基本調試程序,檢測系統板運行狀況,在對USB枚舉測試時(shí),通過(guò)USB數據線(xiàn)連接至電腦,可以對flash存儲設備進(jìn)行讀寫(xiě)操作。

5.2 軟件調試

5.2.1 LIB庫的編譯

本系統的軟件開(kāi)發(fā)環(huán)境是MDK,在程序基本模塊的底層驅動(dòng)編寫(xiě)完善以后,將STM32的底層外設驅動(dòng)庫和μC/GUI庫函數編譯封裝成LIB庫,在后期程序開(kāi)發(fā)時(shí),大大提高了程序的編譯效率,縮短了軟件開(kāi)發(fā)周期。

5.2.2 Finsh Shell調試組件本系統采用RT-Thread嵌入式操作系統,通過(guò)其自帶的用戶(hù)命令行組件Finsh Shell查看系統運行狀況。通過(guò)超級終端輸入相應的命令來(lái)使用Finsh Shell.Finsh Shell在RT-Thread中被設計成一個(gè)獨立的線(xiàn)程,通過(guò)串口設備輸入相應的命令,系統對用戶(hù)命令進(jìn)行解析執行,可用來(lái)獲取系統運行時(shí)信息,對任意寄存器和內存地址進(jìn)行讀寫(xiě)操作,還能夠直接在shell中調用系統函數,訪(fǎng)問(wèn)系統變量。FinshShell組件的使用,在很大程度上提高了調試程序的效率。

5.2.3 圖片解碼調試

由于圖片解碼算法占用內存較大,考慮到圖片解碼算法在STM32中可能會(huì )因為內存分配不足而無(wú)法正常運行,在驗證圖片解碼函數的正確性時(shí),先在PC機的VC模擬器上運行,用以給圖片解碼算法提供一個(gè)理想的運行平臺。在模擬器中,用數組存儲圖片二進(jìn)制源碼,用解碼算法對圖片的數組數據進(jìn)行解碼,驗證解碼算法的正確性。在模擬器運行正確后,再將圖片解碼算法移植到本系統上運行,實(shí)踐證明,STM32的內存足以支持圖片解碼算法正常執行。實(shí)驗在VC模擬器中運行的效果圖如圖11所示。

6.結論

本文介紹了基于RT-Thread和STM32的數碼相框的設計方案,通過(guò)設計相關(guān)硬件電路和軟件算法,實(shí)現了數碼相框對JPEG格式圖片文件的瀏覽功能。本系統設計的基于連續IDCT變換的JPEG解碼算法能夠正確穩定完成JPEG格式圖像的解碼,解碼速度較快,恢復圖像的質(zhì)量良好。實(shí)際測試表明,本方案具有很強的實(shí)用性。

  • STM32單片機中文官網(wǎng)
  • STM32單片機官方開(kāi)發(fā)工具
  • STM32單片機參考設計


關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>