《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 一種簡易數(shù)碼相框的設計
一種簡易數(shù)碼相框的設計
來源:微型機與應用2011年第3期
丁鑫蕾,,劉一清,,余 奔
(華東師范大學,上海 200241)
摘要: 為應對數(shù)碼相框成本較高的問題,,介紹了一種簡易數(shù)碼相框的設計,,實現(xiàn)從SD卡讀取bmp圖片文件并在TFT液晶屏上顯示的功能,。本設計成本低,具有很高的實用價值,。
Abstract:
Key words :

摘  要: 為應對數(shù)碼相框成本較高的問題,,介紹了一種簡易數(shù)碼相框的設計,實現(xiàn)從SD卡讀取bmp圖片文件并在TFT液晶屏上顯示的功能,。本設計成本低,,具有很高的實用價值。
關鍵詞: 數(shù)碼相框,;SD卡,;STM32;μCOS-II,;FATFS

 本文介紹一種簡單,、低成本的數(shù)碼相框的設計,它可以幻燈片式地瀏覽SD卡中的bmp格式的照片,。
1 硬件電路
 該數(shù)碼相框的硬件平臺以32 bit STM32系列的處理器STM32F103ZET6為核心,,外圍電路主要包括一個2.8英寸的TFT液晶模塊、1個SD卡插座,、5個LED燈和2個按鍵,。硬件系統(tǒng)如圖1所示。

 系統(tǒng)關鍵器件的電路原理圖如圖2所示,。STM32系列MCU基于專為要求高性能、低成本,、低功耗的嵌入式應用而設計的ARM Cortex-M3內(nèi)核,,包括了STM32F103增強型系列和STM32F101基本型系列。本設計使用的是增強型系列的高端型號STM32F103ZET6,其最高主頻可以達到72 MHz,,內(nèi)置512 KB的閃存以及64 KB的SRAM,。同時其外設資源豐富,包括并行LCD接口(FSMC),、12通道DMA控制器,、定時器、ADC,、DAC,、SDIO、I2C,、SPI,、USB、UART等[1],??梢哉f,它完全超越了同價位的8 bit或者16 bit單片機的性能,,而又不像一般32 bit處理器那樣價格昂貴,。

 本設計使用了一個帶有通用并行接口(FSMC)的2.8英寸TFT液晶模塊,這種液晶模塊很常見,,而且價格便宜,,另外還有3.2英寸甚至更大的尺寸可供選擇。STM32F103ZET6通過一個SPI接口與SD卡座連接,,以便于控制和簡化程序,,而且對于靜態(tài)圖片,SPI的傳輸速度已足夠,。另外,,還有用于調(diào)試的2個按鍵和5個LED。
2 軟件設計
2.1 移植FATFS文件系統(tǒng)

 FATFS文件系統(tǒng)是一種完全免費開源的FAT文件系統(tǒng)模塊,,專為小型嵌入式系統(tǒng)而設計,,用標準C語言編寫,很方便移植[2],。本設計移植的FATFS版本為R0.07e,,它支持FAT12、FAT16和FAT32,,由于不涉及多個存儲介質(zhì),,因此,本設計僅移植了其簡化版本Tiny-FATFS,,其占用內(nèi)存更少,,只需要大約1 KB RAM,。FATFS具有三層結構,如圖3所示,。

 應用層為用戶提供了一系列接口函數(shù),,只需要簡單的調(diào)用即可,而無需理會復雜的FAT協(xié)議,。移植過程中,,需要使用者修改的是底層接口(包括存儲介質(zhì)讀寫接口和供給文件創(chuàng)建修改時間的實時時鐘)。
Tiny-FATFS包含5個文件,,分別是tff.c,、tff.h、diskio.c,、diskio.h和integer.h,,移植之前首先要編寫初始化和讀寫SD卡的SPI接口代碼。代碼主要包括SD_Init(),、SD_ReadSingleBlock(),、SD_ReadMultiBlock ()、SD_WriteSingle
 Block(),、SD_WriteMultiBlock()函數(shù),,而這些代碼將在diskio.c中被調(diào)用。移植FATFS文件過程:
 (1)準備好SPI讀寫SD卡的代碼后就可以修改diskio.c了,,實際上只需要編寫6個接口函數(shù):
?、俅鎯γ浇槌跏蓟瘮?shù):DSTATUS disk_initialize(BYTE drv)。由于存儲媒介是SD卡,,所以實際上是對SD卡的初始化,。drv是存儲媒介號碼,由于Tiny-FATFS只支持一個存儲媒介,,所以drv應恒為0,。執(zhí)行無誤返回0,錯誤返回非0,。
?、跔顟B(tài)檢測函數(shù):DSTATUS disk_status(BYTE drV)。檢測是否支持當前的存儲媒介,,對Tiny-FATFS來說,,只要drv為0,就認為支持,,然后返回0,。
 ③讀扇區(qū)函數(shù):DRESULT disk_read(BYTE drv,,BYTE*buff,,DWORD sector,,BYTE.count)。在SD卡讀接口函數(shù)的基礎上編寫,,*buff存儲已經(jīng)讀取的數(shù)據(jù),sector是開始讀的起始扇區(qū),,count是需要讀的扇區(qū)數(shù),。1個扇區(qū)為512 B。執(zhí)行無誤返回0,,錯誤返回非0,。
 ④寫扇區(qū)函數(shù):DRESULT disk_write(BYTE drv,,const BYTE*buff,,DWORD sector,BYTE count),。在SD卡寫接口函數(shù)的基礎上編寫,,*buff存儲要寫入的數(shù)據(jù),sector是開始寫的起始扇區(qū),,count是需要寫的扇區(qū)數(shù),。1個扇區(qū)為512 B。執(zhí)行無誤返回0,,錯誤返回非0,。
 ⑤存儲媒介控制函數(shù):DRESULT disk_ioctl(BYTE drv,,BYTE ctrl,,VoiI*buff)。ctrl是控制代碼,,*buff存儲或接收控制數(shù)據(jù),。可以在此函數(shù)里編寫自己需要的功能代碼,,如獲得存儲媒介的大小,、檢測存儲媒介的上電與否,存儲媒介的扇區(qū)數(shù)等,。如果是簡單的應用,,也可以不用編寫,返回0即可,。
?、轉(zhuǎn)WORD get_fattime(Void)。本設計未涉及到文件的創(chuàng)建和修改,,因此實時時鐘部分未編寫,,直接返回一個32 bit無符號整數(shù)即可,。
 (2)對Tiny-FATFS進行配置,主要是修改tff.h和diskio.h,。在diskio.h中,,只需要配置一項:使能或者使能只讀屬性。由于本設計只涉及到SD卡的讀操作,,因此定義使能只讀屬性:#define_READONLY1,。這樣可以裁減掉關于寫SD卡的那部分代碼,從而使文件系統(tǒng)更精簡,。
在tff.h中,,需要對整個文件系統(tǒng)做全面的配置,包括:
?、?define_MCU_ENDIAN 1,。STM32是小端模式,選擇1,。
?、?define_FS_READONLY 1。使能只讀操作,,去掉寫操作,,節(jié)省空間。
?、?define_FS_MINIMIZE 3,。設為3表示使用最基本的FATFS函數(shù),最大限度節(jié)省空間,。
?、?define_USE_STRFUNC 0。禁用字符串函數(shù)功能,。
?、?define_USE_FORWARD 0。禁用forward功能,。
?、?define_FAT321。支持FAT32文件系統(tǒng),。
?、?define_USE_FSINFO 1。支持FAT32磁盤信息獲取,。
?、?define_USE_SJIS 0。禁用shift-JIS碼,。
?、?define_USE_NTFLAG 1,。對文件名大小寫敏感。
 到此為止,,F(xiàn)ATFS的移植就全部完成了,。
 編寫一段程序測試FATFS是否移植成功。以1 s的間隔循環(huán)讀取SD卡中的bmp格式圖片并顯示,,main函數(shù)的流程如圖4所示,。

 需要說明的是,為了便于循環(huán)讀圖,,SD卡中存儲的bmp格式圖片被刻意用數(shù)字編號來命名(如:1.bmp~n.bmp),這樣,,在程序中只需要簡單處理文件名就可以按順序讀取圖片了,。
 通常bmp圖片都是24位顏色深度的(即RGB=8:8:8),而本設計使用的TFT液晶是16位顏色深度的(即RGB=5:6:5),,因此在程序中需要作轉(zhuǎn)換處理才能正常顯示,。轉(zhuǎn)換程序代碼如下:
u16 RGB888toRGB565(u8 r,u8 g,,u8 b)
{
 return(u16) (r & 0xF8) <<8|(g & 0xFC)<<3|(b &               0xF8)>>3,;
}
 由于bmp圖片是最簡單的圖片格式,不涉及解碼處理,,因此大大簡化了程序設計,。
2.2 在μCOS-II平臺上加載FATFS文件系統(tǒng)
 FATFS的加載比其他一些嵌入式文件系統(tǒng)要簡單[4],只需要在工程中加入tff.c和diskio.c這兩個文件即可,。需要注意的是,,在tff.h中有以下4個函數(shù):
int fputc(int, FIL*),;
int fputs(const char*,, FIL*);
int fprintf(FIL*,, const char*,, ...);
char* fgets(char*,, int,, FIL*);
 這4個函數(shù)與stdio.h中定義的函數(shù)有沖突,,需要將其刪除,。
 此外,tff.h中還定義了一個EOF,,也與stdio.h中的定義有沖突,,只需把它重命名即可(如EOFF),。
2.3 在μCOS-II平臺上編寫任務函數(shù)
 定義三個任務以實現(xiàn)數(shù)碼相框功能:
 static void TaskStart(void *pdata);
 static void Task1(void *pdata),;
 static void Task2(void *pdata),;
 其中,TaskStart的優(yōu)先級最高,,在main函數(shù)中,,初始化?滋COS-II后即被創(chuàng)建:
 /* Initialize "μC/OS-II, The Real-Time Kernel"*/
             OSInit(),;
 /* Create the start task */
            OSTaskCreate(TaskStart,,(void*)0,
              &TaskStartStk[TASK_START_STK_SIZE-1],,0),;
 負責初始化目標板、SD卡和LCD,,并創(chuàng)建任務Task1,,同時處理按鍵USER_BUTTON_1。當按下USER_BUTTON_1時,,刪除任務Task2,,其流程如圖5所示。

 Task1的任務是循環(huán)讀取SD卡的bmp格式圖片并送LCD顯示,,同時還要處理按鍵USER_BUTTON_2,。當按下USER_BUTTON_2時,創(chuàng)建任務Task2,,其示意性代碼如下:
static void Task1(void *pdata)
{
    /*    設置變量,;   */
        While(1)
            {
                if(!USER_BUTTON_2)
        OSTaskCreate(Task2,(void *)0,,
        &TaskStk2[TASK2_STK_SIZE-1],,4);
        Read_pic_display(),;
        OSTimeDly(OS_TICKS_PER_SEC/2),;
            }
    }
 Task2任務則只負責執(zhí)行流水燈程序,即循環(huán)依次點亮5個LED,,其優(yōu)先級最低,。
3 測試結果
 本設計的實驗平臺是STM32紅牛開發(fā)板,實物效果圖如圖6所示,。

 實驗結果表明,,μCOS-II+FATFS方案實現(xiàn)的數(shù)碼相框工作穩(wěn)定,開機后μCOS-II加載成功即開始循環(huán)讀取SD卡中的bmp圖片并在TFT屏上顯示。圖片間的切換是簡單的拉幕式切換,,間隔為5 s(可調(diào)),,經(jīng)長時間觀察,無讀取失敗,、掉幀,、花屏等問題,每張圖片都是完美展示,。根據(jù)測試程序的設計,,按下USER_BUTTON_2按鍵則流水燈任務被創(chuàng)建,5個LED燈開始以走馬燈的形式循環(huán)點亮,;與此同時,,圖片讀取和顯示未受到任何影響,證明μCOS-II的任務調(diào)度機制穩(wěn)定可靠,。再按下USER_BUTTON_1,,則流水燈任務被刪除,LED停止動作,。
 本設計基本實現(xiàn)了數(shù)碼相框的功能,其設計的硬件極其簡單,,相比于一些基于高端32 bit MCU(如ARM)的方案[5],,成本要低得多。相比于一些簡單的讀圖顯示程序,,本設計基于嵌入式實時操作系統(tǒng)μCOS-II,,在穩(wěn)定性和可擴展性上都具有優(yōu)勢。另外,,STM32性能優(yōu)越,,可以很流暢地運行μCOS-II和FATFS系統(tǒng),也能夠驅(qū)動QVGA甚至更高分辨率的TFT液晶屏,,這是同價位8 bit或16 bit單片機所不能比擬的[6],。本設計還有需要改進的地方,如增加JPEG解碼,、增強文件名支持,、改進幻燈切換方式以及添加其他功能等。
參考文獻
[1] 王永虹,,徐煒,,郝立平.STM32系列ARM Cortex-M3微控制器原理與實踐[M].北京:北京航空航天大學出版社,2008.
[2] 洪岳煒,,王百鳴,,謝超英.一種易于移植和使用的文件系統(tǒng)FATFS Module[J].單片機與嵌入式系統(tǒng)應用,2008(1):29-31.
[3] 任哲.嵌入式實時操作系統(tǒng)μC/OS-II原理與應用[M].北京:北京航空航天大學出版社,2005.
[4] 王命延,,余愛軍.一種加載在μCOS-II內(nèi)核上的嵌入式文件系統(tǒng)[J].南昌大學學報,,2005,29(2):197-199.
[5] 王偉能,,吳爍宇,,陳弟虎,等.基于S3C2410和Qt/Embedded的數(shù)碼相框設計[J].微計算機信息,,2009,,25(6-2):81-83.
[6] 鄭友勝.μCOS-II在C51中的應用設計[J].中小企業(yè)科技,2007(1):126-127.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權禁止轉(zhuǎn)載,。