版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄第1章緒論 11.1研究背景與意義 21.2研究?jī)?nèi)容 4第2章系統(tǒng)方案設(shè)計(jì) 42.1整體框架設(shè)計(jì) 42.2主控模塊 52.3液晶顯示模塊 122.4存儲(chǔ)器模塊 162.5圖像采集模塊 21第3章系統(tǒng)軟件設(shè)計(jì) 293.1頂層程序設(shè)計(jì) 293.2系統(tǒng)初始化程序設(shè)計(jì) 293.3拍照處理程序設(shè)計(jì) 32第4章系統(tǒng)功能測(cè)試分析 34總結(jié) 36參考文獻(xiàn) 37第1章緒論一幅圖像可以描述為“一個(gè)平面上與位置成函數(shù)關(guān)系的光強(qiáng)或反射率的變化〞。相機(jī)是一臺(tái)捕捉并記錄圖像的設(shè)備,其中“捕捉〞是指將一幅圖像中包含的信息轉(zhuǎn)換成相應(yīng)的以可以重現(xiàn)的方式存儲(chǔ)的信號(hào)[1]。在傳統(tǒng)鹵化銀的相機(jī)中,圖像信息被轉(zhuǎn)換成膠片中的化學(xué)信號(hào),并存儲(chǔ)在膠片中對(duì)應(yīng)的點(diǎn)上。而現(xiàn)代的電子相機(jī)是通過(guò)圖像傳感器將捕捉到的圖像信號(hào)轉(zhuǎn)換成了電子信號(hào),并將圖像信息存儲(chǔ)在內(nèi)存中。電子相機(jī)又根據(jù)存儲(chǔ)的方式不同,分為模擬相機(jī)和數(shù)碼相機(jī)。圖1.1數(shù)字系統(tǒng)圖像捕捉原理物鏡:聚焦圖像,折射來(lái)自物體的光線,使光線會(huì)聚成為一幅清晰的圖像;光圈:決定進(jìn)入鏡頭的光量,通過(guò)光圈數(shù)值計(jì)量。光圈數(shù)值越大那么光圈開(kāi)口越??;快門:快門速度決定曝光時(shí)間長(zhǎng)短,通常以一秒的十分之一計(jì)量??扉T速度越快那么曝光時(shí)間越短;CCD:光耦合組件。1.1研究背景與意義自1991年第一款商用數(shù)碼相機(jī)面市以來(lái),數(shù)碼相機(jī)的性能有了極大的提高[2]。作為數(shù)碼相機(jī)的核心部件———感光元件CCD像素?cái)?shù)已從初期的10幾萬(wàn)開(kāi)展到目前的2千萬(wàn)以上,另一種感光元件CMOS在圖像質(zhì)量方面已經(jīng)根本上與CCD不相上下,因而在專業(yè)級(jí)數(shù)碼相機(jī)方面得到廣泛應(yīng)用。變焦倍率已從2~3倍增加到10倍以上[2]。至于存儲(chǔ)器,不僅品種多,且存儲(chǔ)量已達(dá)8GB,數(shù)碼相機(jī)的功能也從單拍照開(kāi)展到十機(jī)一體的多媒體拍照[3]。1.1.1電子相機(jī)的早期開(kāi)展電子照相的設(shè)想由來(lái)已久,最早于1973年出現(xiàn)在著名的半導(dǎo)體制造商德州儀器公司〔TexasInstrumentsIncorporated〕提出的一項(xiàng)專利申請(qǐng)。在實(shí)施方案中,半導(dǎo)體圖像傳感器位于可伸縮鏡頭前方,其捕捉的圖像信號(hào)被傳輸?shù)诫姶庞涗涱^,并存儲(chǔ)到一個(gè)可移動(dòng)的環(huán)形磁鼓中。然而由于1973年傳感器技術(shù)與磁記錄技術(shù)還在起步階段,該想法并沒(méi)有付諸在真正的產(chǎn)品之中。直到1981年,這一年對(duì)于相機(jī)制造商而言是極其重要的一年,索尼公司發(fā)布了一款電子相機(jī)的原型,被稱為“Mavica〞。這種原型相機(jī)將半導(dǎo)體圖像傳感器捕獲到的圖像信號(hào)記錄在磁性軟盤(pán)上,包含有單鏡頭反光式取景器、CCD圖像傳感器、信號(hào)處理電路和軟盤(pán)驅(qū)動(dòng)器。但是記錄到軟盤(pán)上的圖像信號(hào)是一種改進(jìn)的視頻信號(hào),屬于模擬信號(hào),故它并非是一款完整意義上的數(shù)碼相機(jī)。在索尼Mavica發(fā)布后,數(shù)家相機(jī)制造商和電子設(shè)備制造商組成了聯(lián)盟來(lái)推進(jìn)索尼的設(shè)想。他們建立了一套電子照相系統(tǒng)的標(biāo)準(zhǔn),名為“靜態(tài)視頻系統(tǒng)〞。但由于此系統(tǒng)基于NTSC的視頻格式,圖像的畫(huà)質(zhì)不是太好,鏡頭相機(jī)的使用只被局限在無(wú)須紙質(zhì)打印的小應(yīng)用之中。圖1.2索尼Mavica〔原型〕1.1.2數(shù)碼相機(jī)的出現(xiàn)隨著數(shù)字技術(shù)的進(jìn)步,模擬電子相機(jī)向數(shù)字化過(guò)渡,在1988年的世界影像貿(mào)易博覽會(huì)上,第一臺(tái)數(shù)碼相機(jī)〔富士DS-1P〕發(fā)布。該相機(jī)將數(shù)字圖像信號(hào)記錄在一塊容量為2MB的靜態(tài)RAM卡上。雖然這款富士原型機(jī)沒(méi)有上市銷售,但隨著對(duì)其概念的不斷改進(jìn)和完善,有幾款數(shù)碼相機(jī)陸續(xù)上市。1995年,卡西歐QV-10上市銷售,由于其不僅是一臺(tái)相機(jī),更是一個(gè)便攜式圖像瀏覽器,即在用戶拍完照后能即刻共享和欣賞圖片,受到年輕一代的熱烈歡送。1.1.3像素?cái)?shù)量之戰(zhàn)隨著市場(chǎng)的日益增長(zhǎng),數(shù)碼相機(jī)的前景變得愈創(chuàng)造朗,許多廠家開(kāi)始了數(shù)碼相機(jī)的開(kāi)發(fā)。半導(dǎo)體制造商也認(rèn)識(shí)到其中蘊(yùn)含的重大商機(jī),開(kāi)始研發(fā)專用于數(shù)碼相機(jī)上的圖像傳感器。1996年奧林巴斯發(fā)布了C-800L型數(shù)碼相機(jī),其CCD圖像傳感器約含80萬(wàn)像素。隨后,富士和奧林巴斯與次年分別發(fā)布130萬(wàn)像素的DS300和140萬(wàn)像素的C-1400L。1999年,多家廠商發(fā)布了200萬(wàn)像素的機(jī)型,而在2000年發(fā)布300萬(wàn)像素的機(jī)型時(shí)情形再次發(fā)生。直到2004年,出現(xiàn)了高達(dá)800萬(wàn)像素的傻瓜相機(jī)和1670萬(wàn)像素的單反相機(jī)。圖1.3卡西歐OV-10圖1.4單反照相機(jī)本課題研究的意義市場(chǎng)上的照相機(jī)大多都是像素很高,體驗(yàn)也非常不錯(cuò)的照相機(jī),但這些數(shù)碼照相機(jī)太過(guò)于獨(dú)立,而且價(jià)格也不低。在有些場(chǎng)合,需要把照相功能嵌入到某個(gè)系統(tǒng)中,完成一些簡(jiǎn)單的攝像和保存圖片的功能,本次課設(shè)實(shí)現(xiàn)的STM32照相機(jī)的系統(tǒng)正好滿足要求。STM32照相機(jī)的程序還可以以板級(jí)支持包的方式根據(jù)需求對(duì)功能進(jìn)行裁剪,功耗低,本錢也很低。1.2研究?jī)?nèi)容本文主要研究STM32照相機(jī)的程序設(shè)計(jì)流程,從硬件的參考手冊(cè)入手。根據(jù)芯片手冊(cè)或模塊資料,配置相關(guān)存放器,并對(duì)信號(hào)的時(shí)序做出分析,搭建出每個(gè)器件操作的完整的編程模型。再選擇出適宜的算法,使各個(gè)模塊之間協(xié)調(diào)工作,最終設(shè)計(jì)出較低本錢、可移植性較好的STM32照相機(jī)系統(tǒng)。第2章系統(tǒng)方案設(shè)計(jì)2.1整體框架設(shè)計(jì)整個(gè)照相系統(tǒng)根據(jù)功能劃分,可分為:主控模塊、液晶顯示模塊、存儲(chǔ)器模塊、圖像采集模塊。另外,在實(shí)際拍照中,還需要參加按鍵作為拍照的按鈕、LED燈作為操作指示燈。在器件選型上,在綜合了相機(jī)像素、存儲(chǔ)容量、本錢,以及功耗各方面的考慮后,決定選用STM32最小系統(tǒng)作為主控模塊,OV7725攝像頭作為圖像采集模塊,ILI9341作為液晶驅(qū)動(dòng),容量為128MB的SD卡作為存儲(chǔ)模塊,見(jiàn)圖2.1。圖2.1STM32照相機(jī)系統(tǒng)框圖2.2主控模塊2.2.1STM32F103ZET6芯片功能介紹〔1〕內(nèi)核:ARM32位的Crotex-M3的CPU,最高72MHZ工作頻率;可進(jìn)行單周期的乘法和硬件除法?!?〕存儲(chǔ)器:256KB/512KB的FLASH;高達(dá)64KB的SRAM;帶4個(gè)片選控制的靜態(tài)存儲(chǔ)器控制器:SRAM、PSRAM、NOR和NAND;并行LCD接口,兼容8080/6800模式?!?〕時(shí)鐘、復(fù)位與電源管理:2.0~3.6V供電和I/O引腳;上電、斷電復(fù)位〔POR/PDR〕,可編程電壓監(jiān)測(cè)器〔PVD〕;4~16MHZ晶體振蕩器;內(nèi)嵌經(jīng)出廠調(diào)校的8MHZ的RC振蕩器;帶校準(zhǔn)功能的32kHZRTC振蕩器?!?〕低功耗:睡眠、停機(jī)和待機(jī)模式;VBAT為RTC和后備存放器供電?!?〕3個(gè)12位模數(shù)轉(zhuǎn)換器,1μs轉(zhuǎn)換時(shí)間(多達(dá)21個(gè)輸入通道)?!?〕DMA:12通道DMA控制器,支持的外設(shè):定時(shí)器,ADC,SPI,I2C和USART?!?〕多達(dá)112個(gè)快速I/O端口:51/80/112個(gè)I/O口,所有I/O可以映像到16個(gè)外部中斷?!?〕調(diào)試模式:串行單線調(diào)試〔SWD〕和JTAG接口;Cortex-M3內(nèi)嵌跟蹤模塊〔ETM〕?!?〕多達(dá)11個(gè)定時(shí)器:4個(gè)16位定時(shí)器,每個(gè)定時(shí)器有多達(dá)4個(gè)用于輸入捕獲/輸出比擬/PWM/脈沖計(jì)數(shù)的通道和增量編碼輸入;2個(gè)16位帶死區(qū)控制和緊急剎車,用于電機(jī)控制和PWM高級(jí)控制定時(shí)器;2個(gè)看門狗定時(shí)器;系統(tǒng)時(shí)間定時(shí)器;2個(gè)16位根本定時(shí)器用于驅(qū)動(dòng)DAC?!?0〕多達(dá)13個(gè)通信接口:多達(dá)2個(gè)I2C接口〔支持SMBus/PSMBus〕;多達(dá)5個(gè)USART〔支持ISO7816接口,LIN,IrDA接口和調(diào)制解調(diào)器接口〕;多達(dá)3個(gè)SPI接口〔18Mbit/s〕;CAN接口;USB2.0全速接口;SDIO接口。CRC計(jì)算單元,96位的芯片唯一代碼。ECOPACK封裝。2.2.2時(shí)鐘樹(shù)為了滿足系統(tǒng)時(shí)鐘和不同外設(shè)時(shí)鐘的需求,STM32芯片內(nèi)部對(duì)系統(tǒng)時(shí)鐘和多種總線時(shí)鐘進(jìn)行了管理,形成了時(shí)鐘樹(shù)。為了低功耗的需要,系統(tǒng)時(shí)鐘、中斷、GPIO以及外設(shè)時(shí)鐘都設(shè)置了開(kāi)關(guān)。所以,要求在系統(tǒng)啟動(dòng)前設(shè)置內(nèi)部或外部時(shí)鐘晶振頻率和分/倍頻數(shù),在使用GPIO管腳時(shí)要翻開(kāi)GPIO掛接在總線上的時(shí)鐘開(kāi)關(guān),在使能中斷和使用外設(shè)時(shí)都要翻開(kāi)對(duì)應(yīng)的時(shí)鐘開(kāi)關(guān)。下面介紹STM32的時(shí)鐘源和時(shí)鐘系統(tǒng)框圖:在STM32的內(nèi)部共有五個(gè)時(shí)鐘源,分別為HSI、HSE、LSI、LSE、PLL[4]?!?〕HSI〔高速內(nèi)部時(shí)鐘〕為RC振蕩器,其頻率為8MHz?!?〕HSE〔高速外部時(shí)鐘〕可接石英或陶瓷諧振器,還可以接外部時(shí)鐘源,頻率范圍為4MHz~16MHz?!?〕LSI〔低速內(nèi)部時(shí)鐘〕為RC振蕩器,其頻率為40kHz?!?〕LSE〔低速外部時(shí)鐘〕,可接頻率為32.768kHz的石英晶振?!?〕PLL〔鎖相環(huán)〕,其時(shí)鐘輸入源可選擇為高速內(nèi)部時(shí)鐘的二分頻、高速外部時(shí)鐘或其二分頻。倍頻可選擇為2~16倍,但是其輸出頻率最大不得超過(guò)72MHz。圖2.2STM32時(shí)鐘樹(shù)2.2.3GPIO及功能復(fù)用在使用STM32上的GPIO
時(shí),都要對(duì)其存放器進(jìn)行配置。包含2個(gè)32bit數(shù)據(jù)存放器(GPIOx_IDR和GPIOx_ODR),1個(gè)32
bit置位/復(fù)位存放器(GPIOx_BSRR),2個(gè)32
bit配置存放器(GPIOx_CRL和GPIOx_CRH),以及1個(gè)16bit復(fù)位存放器(GPIOx_BRR)和1個(gè)32
bit鎖定存放器(GPIOx_LCKR)。為方便用戶使用,GPIO的存放器在GPIOx結(jié)構(gòu)體中實(shí)現(xiàn):Typedefstruct{__IOuint32_tCRL;__IOuint32_tCRH;__IOuint32_tIDR;__IOuint32_tODR;__IOuint32_tBSRR;__IOuint32_tBRR;__IOuint32_tLCKR;}GPIO_TypeDef;另外,GPIO
端口上的每一位可以由軟件分別配置成多種模式〔在GPIO_InitStruct體中實(shí)現(xiàn)〕,即每一位都可以自由編程。Typedefstruct{uint16_tGPIO_Pin;GPIOSpeed_TypeDefGPIO_Speed;GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;但要注意的是,I/0
端口存放器必須按4個(gè)字節(jié)〔即32bit〕被訪問(wèn),不支持只訪問(wèn)某一位或某幾個(gè)字節(jié)。假設(shè)要只進(jìn)行位操作,可以將存放器的值與某一32位數(shù)值進(jìn)行按位與/或/同或/異或等操作實(shí)現(xiàn)?!?〕GPIO根本設(shè)置圖2.3GPIO內(nèi)部結(jié)構(gòu)框圖GPIO類型GPIO_Mode共8種:=1\*GB3①GPIO_Mode_AIN
模擬輸入:應(yīng)用ADC模擬輸入,或者低功耗下省電;=2\*GB3②GPIO_Mode_IN_FLOATING
浮空輸入:可以做按鍵識(shí)別,串口接受端RX
;=3\*GB3③GPIO_Mode_IPD
下拉輸入:內(nèi)部下拉電阻輸入;=4\*GB3④GPIO_Mode_IPU
上拉輸入:內(nèi)部上拉電阻輸入;=5\*GB3⑤GPIO_Mode_Out_OD
開(kāi)漏輸出:當(dāng)輸出為0時(shí),IO內(nèi)部硬件接地,當(dāng)輸出為1時(shí),引腳是懸空的,需要外接上拉電阻,才能實(shí)現(xiàn)輸出高電平。要想實(shí)現(xiàn)雙向通信,外接上拉電阻后,可先向IO口寫(xiě)入1,此時(shí)的IO的電平會(huì)隨著外部電路的電壓值變化,從而完成輸入功能;=6\*GB3⑥GPIO_Mode_Out_PP
推挽輸出:輸出0時(shí),內(nèi)部接低,輸出1
時(shí),接的是電源電壓VCC,但讀輸入的值是未知的;=7\*GB3⑦GPIO_Mode_AF_OD
復(fù)用開(kāi)漏輸出:主要針對(duì)一些片內(nèi)外設(shè)功能〔如:串口TX1,SPI通信〕;=8\*GB3⑧GPIO_Mode_AF_PP
復(fù)用推挽輸出:片內(nèi)外設(shè)功能〔如:I2C的SCL,SDA〕。對(duì)于輸出引腳除設(shè)置引腳的輸出模式外,還需設(shè)置GPIO引腳速率GPIO_SpeedGPIO引腳速率是指I/O口驅(qū)動(dòng)電路的響應(yīng)速度〔不是信號(hào)的輸出速率〕,對(duì)于STM32上的輸出引腳需要選擇速度:2MHz、10MHz和50MHz。根據(jù)不同的外設(shè),合理地選擇不同的輸出驅(qū)動(dòng)模塊,以到達(dá)最正確的性噪比和最低的系統(tǒng)功耗。比方,對(duì)于高頻的驅(qū)動(dòng)電路,噪聲較高,所以不需要高的輸出頻率時(shí),選用低頻驅(qū)動(dòng)電路,這樣非常有利于提高系統(tǒng)的抗電磁干擾性能?!?〕GPIO功能復(fù)用復(fù)用功能是指內(nèi)置外設(shè)與I/O口共用了引出管腳,也可能出現(xiàn)不同的功能對(duì)應(yīng)同一管腳。假設(shè)將GPIO配置成復(fù)用輸出功能,那么I/O將不能使用輸出存放器,并在內(nèi)部結(jié)構(gòu)中與片上外設(shè)的輸出信號(hào)連接。如果通過(guò)編程將某個(gè)GPIO引腳配置成復(fù)用輸出功能,但是外設(shè)沒(méi)有啟動(dòng),其輸出將不確定。使用默認(rèn)復(fù)用功能前必須對(duì)端口位配置存放器編程。=1\*GB3①對(duì)于復(fù)用的輸入功能,端口必須配置成輸入模式(浮空、上拉或下拉)且輸入引腳必須由外部驅(qū)動(dòng);=2\*GB3②對(duì)于復(fù)用輸出功能,端口必須配置成復(fù)用功能輸出模式(推挽或開(kāi)漏);=3\*GB3③對(duì)于雙向復(fù)用功能,端口位必須配置復(fù)用功能輸出模式(推挽或開(kāi)漏),此時(shí)的輸入驅(qū)動(dòng)器被配置成浮空輸入模式。2.2.4中斷〔1〕中斷根本概念中斷是指當(dāng)軟件或硬件出現(xiàn)需要時(shí),CPU暫時(shí)停止當(dāng)前程序的執(zhí)行,轉(zhuǎn)去處理應(yīng)對(duì)突發(fā)情況的程序的執(zhí)行請(qǐng)求,在處理事件后完后又返回到源程序繼續(xù)執(zhí)行的過(guò)程。觸發(fā)中斷的事件稱為中斷源,而中斷源向內(nèi)核申請(qǐng)中斷的入口就稱為中斷通道。也就是說(shuō),中斷通道給中斷源提供一個(gè)向內(nèi)核申請(qǐng)中斷的入口,中斷源通過(guò)中斷通道向內(nèi)核提出中斷申請(qǐng)。一個(gè)中斷通道可以對(duì)應(yīng)一個(gè)中斷源,也可以對(duì)應(yīng)多個(gè);有的外設(shè)只對(duì)應(yīng)一個(gè),而有的外設(shè)可以對(duì)應(yīng)多個(gè)中斷通道。中斷優(yōu)先級(jí)是針對(duì)中斷通道的。圖2.4中斷通道、中斷源與外設(shè)的關(guān)系〔2〕中斷優(yōu)先級(jí)
STM32的中斷優(yōu)先級(jí)可分為響應(yīng)式優(yōu)先級(jí)或搶占式優(yōu)先級(jí)。其中,搶占式優(yōu)先級(jí)的中斷會(huì)打斷當(dāng)前的主程序或者中斷程序運(yùn)行,是實(shí)現(xiàn)中斷嵌套的一種手段。對(duì)于每一個(gè)中斷通道,Cortex-M3內(nèi)核的頭文件“core_m3.h〞中都提供了一個(gè)8位的存放器IP,來(lái)確定該中斷通道的搶占式優(yōu)先級(jí)或響應(yīng)式優(yōu)先級(jí)?!?〕中斷相關(guān)存放器
NVIC結(jié)構(gòu)體〔core_m3.h〕內(nèi)核中的存放器與中斷控制SCB結(jié)構(gòu)體〔core_m3.h〕相關(guān)存放器外設(shè)相關(guān)存放器外設(shè)中的存放器〔如:TIM2的TIM2_DIER中斷使能存放器〕……在配置中斷時(shí)主要使用中斷控制〔NVIC〕存放器組中的存放器,可以通過(guò)NVIC的結(jié)構(gòu)體來(lái)實(shí)現(xiàn):typedefstruct{vu32ISER[2];u32RESERVED0[30];vu32ICER[2];u32RSERVED1[30];vu32ISPR[2];u32RESERVED2[30];vu32ICPR[2];u32RESERVED3[30];vu32IABR[2];u32RESERVED4[62];vu32IPR[11];}NVIC_TypeDef;配置這些內(nèi)核存放器時(shí)〔以按鍵中斷為例〕STM32的庫(kù)函數(shù)中提供了中斷初始化結(jié)構(gòu)體:typedef
struct
{
uint8_t
NVIC_IRQChannel
uint8_t
NVIC_IRQChannelPreemptionPriority;
uint8_t
NVIC_IRQChannelSubPriority;
FunctionalState
NVIC_IRQChannelCmd;
}
NVIC_InitTypeDef;
在按鍵中斷初始化時(shí),需進(jìn)行如下操作:第一步:設(shè)置搶占優(yōu)先級(jí)的分組;第二步:選擇外部中斷輸入引腳,設(shè)置搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí);第三步:使能中斷通道,中斷設(shè)置成功?!?〕總中斷的開(kāi)和關(guān)STM32/Cortex-M3是通過(guò)改變CPU當(dāng)前優(yōu)先級(jí)來(lái)實(shí)現(xiàn)允許/禁止中斷的。在STM32固件庫(kù)中〔stm32f10x_nvic.h和stm32f10x_nvic.c〕定義了四個(gè)函數(shù)操作PRIMASK位和FAULTMASK位,改變CPU當(dāng)前優(yōu)先級(jí),從而到達(dá)控制所有中斷的目的。/*關(guān)閉總中斷的兩個(gè)函數(shù)*/
void
NVIC_SETPRIMASK(void);
void
NVIC_SETFAULTMASK(void);/*使能總中斷的兩個(gè)函數(shù)*/
void
NVIC_RESETPRIMASK(void);
void
NVIC_RESETFAULTMASK(void);
2.3液晶顯示模塊2.3.1ILI9341驅(qū)動(dòng)器介紹ILI9341是一個(gè)用于TFT液晶顯示的單芯片控制驅(qū)動(dòng)器,具有26萬(wàn)色的240RGBX320像素顯示解決方案,它的組成包括一個(gè)720通道的源極驅(qū)動(dòng)器,一個(gè)320通道的柵極驅(qū)動(dòng)器,172800字節(jié)用于圖形顯示的GRAM,以及供電電路[5]。ILI9341支持8/9/16/18位數(shù)據(jù)總線的MCU接口,6/16/18位數(shù)據(jù)總線的RGB接口,以及3/4線的SPI接口,移動(dòng)圖像區(qū)域可以通過(guò)窗口地址功能在內(nèi)部GRAM來(lái)指定,指定的窗口區(qū)域可以選擇性地更新,因此,可以在圖像區(qū)域同時(shí)獨(dú)立地顯示移動(dòng)圖像[6]。ILI9341可以使用1.65~3.3V的I/O接口電壓和一個(gè)對(duì)應(yīng)的電壓跟隨電路來(lái)產(chǎn)生驅(qū)動(dòng)LCD的電壓。ILI9341有精確的電壓控制〔軟件控制〕,來(lái)支持全色,8色顯示模式和睡眠模式,是理想的中小型手提產(chǎn)品的LCD驅(qū)動(dòng)器。2.3.2FSMC總線FSMC(FlexibleStaticMemoryController,可變靜態(tài)存儲(chǔ)控制器)是STM32系列中內(nèi)部集成256KB以上FLASH,后綴為xC、xD和xE的高存儲(chǔ)密度微控制器特有的存儲(chǔ)控制機(jī)制[7]。之所以稱為“可變〞,是由于通過(guò)對(duì)特殊功能存放器的設(shè)置,F(xiàn)SMC能夠根據(jù)不同的外部存儲(chǔ)器類型,發(fā)出相應(yīng)的數(shù)據(jù)/地址/控制信號(hào)類型以匹配信號(hào)的速度,從而使得STM32系列微控制器不僅能夠應(yīng)用各種不同類型、不同速度的外部靜態(tài)存儲(chǔ)器,而且能夠在不增加外部器件的情況下同時(shí)擴(kuò)展多種不同類型的靜態(tài)存儲(chǔ)器,滿足系統(tǒng)設(shè)計(jì)對(duì)存儲(chǔ)容量、產(chǎn)品體積以及本錢的綜合要求[8]?!?〕FSMC框圖及配置:圖2.5FSMC框圖FSMC總線配置流程:第一步:選擇適宜的存儲(chǔ)塊映射NORFLASH存儲(chǔ)器,共有4個(gè)獨(dú)立的存儲(chǔ)塊可以用于與NORFLASH、SRAM和PSRAM存儲(chǔ)器接口,每個(gè)存儲(chǔ)塊都有一個(gè)專用的片選管腳。第二步:使用或禁用地址/數(shù)據(jù)總線的復(fù)用功能;第三步:選擇所用的存儲(chǔ)器類型:NORFLASH、SRAM或PSRAM〔其中NORFLASHMemory和SRAM都支持同步或異步讀寫(xiě)時(shí)序的存儲(chǔ)器〕;第四步:定義外部的存儲(chǔ)器的數(shù)據(jù)總線:8bit/16bit;第五步:使用或關(guān)閉NORFLASHMemory的突發(fā)訪問(wèn)模式;第六步:配置等待信號(hào)的使用:開(kāi)啟或關(guān)閉,極性設(shè)置,時(shí)序配置;第七步:使用或關(guān)閉擴(kuò)展模式:擴(kuò)展模式用于訪問(wèn)具有不同讀寫(xiě)操作時(shí)序的存儲(chǔ)器。〔2〕時(shí)序參數(shù)及計(jì)算異步讀寫(xiě)時(shí)序的參數(shù)及時(shí)序:ADDSET:addresssetuptime;ADDHOLD:addressholdtime;DATAST:datasetuptime圖2.6異步讀時(shí)序圖2.7異步寫(xiě)時(shí)序讀/寫(xiě)訪問(wèn)時(shí)間為:((ADDSET
+
1)
+
(DATAST
+
1))
×
HCLK
;寫(xiě)使能信號(hào)由低到高的時(shí)間為:tWP=DATAST
×
HCLK;考慮最大的讀/寫(xiě)訪問(wèn)時(shí)間,F(xiàn)SMC和存儲(chǔ)器的內(nèi)部延時(shí),數(shù)據(jù)建立時(shí)間應(yīng)滿足:DATAST
=
(tAVQV
+
tsu(Data_NE)
+
tv(A_NE))/HCLK
–
ADDSET
–
4。本次畢設(shè)LCD驅(qū)動(dòng)的存儲(chǔ)器接口是掛接在FSMC總線上〔FSMC總線上的LCD連接見(jiàn)圖2.8〕,選用NORFLASH存儲(chǔ)器的BANK1的第4塊區(qū)域,并且禁用地址/數(shù)據(jù)總線的復(fù)用功能和存儲(chǔ)器的突發(fā)訪問(wèn)模式,設(shè)置數(shù)據(jù)總線寬度為16位,讀寫(xiě)時(shí)序?yàn)楫惒綍r(shí)序,并關(guān)閉擴(kuò)展模式。其實(shí)只需對(duì)下面的三個(gè)存放器做如下操作:FSMC_Bank1->BTCR[6]=0X5011;FSMC_Bank1->BTCR[7]=0X0809;FSMC_Bank1E->BWTR[6]=0X0301。圖2.8LCD與FSMC總線連接2.3.3LCD初始化表2.1LCD存放器操作局部指令集指令描述指令描述指令描述EDH電源序列控制F7H泵比控制C5HVCOM控制1E8H驅(qū)動(dòng)時(shí)序控制AB1H幀速率控制C7HVCOM控制2EAH驅(qū)動(dòng)時(shí)序控制BB6H顯示功能控制F2H使能3GCBH功耗控制AC0H功耗控制126H 伽馬設(shè)置CFH功耗控制BC1H功耗控制2E0H正極伽馬校準(zhǔn)2AH列地址設(shè)置3AH像素格式設(shè)置E1H負(fù)極伽馬校準(zhǔn)2BH頁(yè)地址設(shè)置11H 退出睡眠模式2CH存儲(chǔ)器寫(xiě)36H 存儲(chǔ)器訪問(wèn)控制29H 開(kāi)顯示2EH讀存儲(chǔ)器FSMC總線〔STM32引腳復(fù)用FSMC的硬件接口〕配置完成后,就能通過(guò)STM32來(lái)對(duì)LCD內(nèi)的存放器進(jìn)行讀寫(xiě)操作了。本章節(jié)中所有關(guān)于時(shí)鐘的設(shè)置,GPIO的配置,引腳的復(fù)用功能,中斷函數(shù)將在下一個(gè)章節(jié)集中講解,LCD內(nèi)部的存放器比擬多,可以對(duì)照LCDILI9341的數(shù)據(jù)手冊(cè)通過(guò)命令來(lái)指定配置存放器,并輸入相應(yīng)的參數(shù)。LCDILI9341的操作指令可分為:一級(jí)、二級(jí)、三級(jí)指令。LCD初始化和顯示圖片時(shí)需要用到的指令如表2.1。關(guān)于LCD的初始化代碼,不同的液晶驅(qū)動(dòng)程序是不一樣的,在購(gòu)置液晶屏?xí)r廠家會(huì)提供源代碼,所以這里不再展開(kāi)。2.4存儲(chǔ)器模塊2.4.1SD卡2.0協(xié)議SD存儲(chǔ)卡兼容MMC卡的接口標(biāo)準(zhǔn),采用9針的接口〔CLK為時(shí)鐘線,CMD為命令響應(yīng)線,DATA0~DATA3為雙向數(shù)據(jù)傳輸線,VDD、VSS1和VSS2為電源和地〕,最大的工作頻率是25MHZ。SD卡系統(tǒng)支持SD卡模式和SPI模式〔如表2.2和表2.3〕,兩種通信協(xié)議[9]。SD卡在結(jié)構(gòu)上使用一主多從星型拓?fù)浣Y(jié)構(gòu)。雖然SPI的初始化流程比SDIO簡(jiǎn)單得多,但SDIO用4根數(shù)據(jù)線傳輸,而SPI只是串行傳輸,SDIO的傳輸速度明顯高于SPI。在傳輸圖像時(shí)對(duì)傳輸速度要求較高,故本次畢設(shè)選用SD模式的接口〔SDIO〕。表2.2SD卡模式下的接口定義管腳類型描述備注DATA0~DATA2輸入/輸出/推挽類型數(shù)據(jù)總線CM輸入/輸出/推挽類型卡監(jiān)測(cè)數(shù)據(jù)位DATA3CLK輸入時(shí)鐘引腳CMD推挽命令/響應(yīng)串行〔1〕SDIO初始化SD_ErrorSD_Init(void);初始化函數(shù)包括GPIO設(shè)置,存放器的復(fù)位,上電操作,SD卡的信息獲取。假設(shè)初始化成功返回值為0。表2.3SPI模式下的接口定義管腳類型描述備注CS輸入片選低電平有效DI輸入數(shù)據(jù)輸入端串行DO輸出數(shù)據(jù)輸出端串行CLK輸入時(shí)鐘引腳在進(jìn)行初始化之前先了解幾個(gè)命令和SD卡內(nèi)部存放器〔見(jiàn)圖2.9和表2.4〕:圖2.9SD卡內(nèi)部結(jié)構(gòu)及存放器CMD0:將所有的卡復(fù)位到理想狀態(tài);CMD8:發(fā)送主機(jī)的提供的電壓范圍,并響應(yīng)SD卡支持的電壓范圍;CMD55:指定下一條命令是應(yīng)用命名;ACMD41:發(fā)送主機(jī)支持的卡的容量,并響應(yīng)SD卡的OCR中的內(nèi)容;CMD2:獲取SD卡的ID;CMD3:獲取SD卡的相對(duì)地址。SDIO模式下的初始化流程:當(dāng)HOST上電后,使所有的卡設(shè)備處于卡識(shí)別模式,完成設(shè)置有效操作電壓范圍,卡識(shí)別和請(qǐng)求卡相對(duì)地址等操作。第一步:發(fā)送指令CMD0使卡設(shè)備處于空閑狀態(tài),進(jìn)入第二步。第二步:發(fā)送指令CMD8,假設(shè)卡設(shè)備有響應(yīng),說(shuō)明此卡為SD2.0以上,此時(shí)會(huì)響應(yīng)SD卡支持的電壓范圍,進(jìn)入第三步;假設(shè)沒(méi)有響應(yīng),那么為SD2.0以下的SD卡,執(zhí)行第四步。第三步:假設(shè)主機(jī)支持大容量的SD卡,將HCS置1,否那么置0。發(fā)送指令CMD55+ACMD41,假設(shè)響應(yīng)CCS為1,那么SD卡為大容量的存儲(chǔ)器,進(jìn)入第四步;否那么為標(biāo)準(zhǔn)容量的SD卡,進(jìn)入第五步。第四步:HCS置0,并發(fā)送CMD55+ACMD41,假設(shè)有響應(yīng),那么為標(biāo)準(zhǔn)容量的SD卡,進(jìn)入第五步;假設(shè)無(wú)響應(yīng),那么返回沒(méi)有找到可用的SD卡。第五步:發(fā)送指令CMD2獲取CID。第六步:發(fā)送指令CMD3獲取RCA(relativecardaddress),初始化完成。表2.4SD卡內(nèi)部存放器存放器位寬〔bit〕描述CID128卡標(biāo)識(shí)號(hào)RCA16相對(duì)卡地址:本地系統(tǒng)中卡的地址,是動(dòng)態(tài)變化的,需要在主機(jī)初始化時(shí)確定;在SPI模式中沒(méi)有CSD128卡描述數(shù)據(jù):卡操作條件的信息數(shù)據(jù)SCR64SD卡配置存放器:SD卡特定信息數(shù)據(jù)OCR32操作條件存放器DSR16驅(qū)動(dòng)級(jí)存放器,用于提高總線的性能;可選可不選〔2〕SD卡的根本操作=1\*GB3①SD卡的讀操作:SD_ErrorSD_ReadBlock(uint8_t*readbuff,uint32_tReadAddr,uint16_tBlockSize);函數(shù)功能:讀單個(gè)塊的數(shù)據(jù),并采用DMA傳輸方式;Readbuff:指向數(shù)據(jù)接受緩存器;ReadAddr:讀取區(qū)域的首地址;BlockSize:塊的大小〔512B〕;讀取成功后返回SD_Error=0。〔下同〕SD_ErrorSD_ReadMultiBlocks(uint8_t*readbuff,uint32_tReadAddr,uint16_tBlockSize,uint32_tNumberOfBlocks);函數(shù)功能:可以讀取連續(xù)幾個(gè)塊的內(nèi)容,塊的個(gè)數(shù)由NumberOfBlocks確定。讀寫(xiě)都是以block為單位,一個(gè)block為512個(gè)字節(jié)〔發(fā)送CMD16命令可以設(shè)置塊的大小〕,小于512B時(shí),以block的邊界對(duì)齊。每個(gè)塊傳輸?shù)暮竺娑几粋€(gè)CRC校驗(yàn)。CMD17(READ_SINGLE_BLOCK)用于傳輸單個(gè)塊,傳輸完之后,卡進(jìn)入傳輸狀態(tài);CMD18
(READ_MULTIPLE_BLOCK)用于多個(gè)塊的傳輸,直到收到一個(gè)CMD12命令。=2\*GB3②SD卡的寫(xiě)操作:SD_ErrorSD_WriteBlock(uint8_t*writebuff,uint32_tWriteAddr,uint16_tBlockSize);函數(shù)功能:寫(xiě)入一個(gè)塊的內(nèi)容,DMA傳輸;寫(xiě)入成功后返回SD_Error=0。〔下同〕SD_ErrorSD_WriteMultiBlocks(uint8_t*writebuff,uint32_tWriteAddr,uint16_tBlockSize,uint32_tNumberOfBlocks);函數(shù)功能:連續(xù)寫(xiě)入幾個(gè)塊的內(nèi)容,塊的個(gè)數(shù)由NumberSize確定。塊寫(xiě)操作與塊讀操作類似,每個(gè)塊傳輸?shù)暮竺娑几粋€(gè)CRC校驗(yàn)??▽?xiě)數(shù)據(jù)時(shí)會(huì)進(jìn)行CRC校驗(yàn),多塊寫(xiě)比重復(fù)的單塊寫(xiě)更能提高效率。如果CSD中的WRITE_BLK_MISALIGN沒(méi)設(shè)置,并且發(fā)送的數(shù)據(jù)不是塊對(duì)齊的,卡會(huì)設(shè)置狀態(tài)存放器中的ADDRESS_ERROR位,并且進(jìn)入Receive-data狀態(tài)等待停止命令。此時(shí)寫(xiě)操作也會(huì)停止,并且卡會(huì)設(shè)置其的WP_VIOLATION位。如果寫(xiě)緩沖滿的話,卡會(huì)停止接受WRITE_BLOCK命令。此時(shí)主機(jī)應(yīng)發(fā)送SEND_STATUS
(CMD13)命令,卡返回?cái)?shù)據(jù)的READY_FOR_DATA位標(biāo)志卡是否準(zhǔn)備好接受新的數(shù)據(jù)。在多塊寫(xiě)操作中通過(guò)事先發(fā)送ACMD23命令可提高寫(xiě)速度。ACMD23用于定義接下來(lái)要寫(xiě)數(shù)據(jù)的塊的數(shù)目[10]。每次多塊寫(xiě)操作后,這個(gè)值又被設(shè)為默認(rèn)值1,ACMD22會(huì)使卡返回寫(xiě)成功的塊數(shù)目。=3\*GB3③SD卡的擦除操作:SD_ErrorSD_Erase(uint32_tstartaddr,uint32_tendaddr);函數(shù)功能:擦除SD卡中指定的內(nèi)容,擦除成功時(shí)返回0;startaddr是擦除內(nèi)容的起始地址;endaddr是擦除內(nèi)容的終止地址。擦除命令的順序是:ERASE_WR_BLK_START(CMD32)、ERASE_WR_BLK_END(CMD33)、ERASE
(CMD38)[10]。如果(CMD38或(CMD32,
33)接收到出錯(cuò)信息,卡會(huì)設(shè)置狀態(tài)存放器中的ERASE_SEQ_ERROR
位并且重新等待新的命令時(shí)序;如果接收到時(shí)序錯(cuò)誤命令,卡會(huì)設(shè)置其ERASE_RESET位并且重新等待新的命令時(shí)序。2.4.2SD卡的文件系統(tǒng)FATFS上一節(jié)的SD卡驅(qū)動(dòng)只完成了向物理地址寫(xiě)入數(shù)據(jù)的工作,而根據(jù)文件系統(tǒng)格式的邏輯轉(zhuǎn)換局部那么需要額外的代碼來(lái)完成。實(shí)質(zhì)上,這個(gè)邏輯轉(zhuǎn)換局部可以理解為當(dāng)需要寫(xiě)入一段數(shù)據(jù)時(shí),由它來(lái)求解向什么物理地址寫(xiě)入數(shù)據(jù)、以什么格式寫(xiě)入及寫(xiě)入一些原始數(shù)據(jù)以外的信息(如目錄)。這個(gè)邏輯轉(zhuǎn)換局部代碼也稱之為文件系統(tǒng)。FATFS是面向小型嵌入式系統(tǒng)的一種通用的FAT文件系統(tǒng)。它完全是由AISIC語(yǔ)言編寫(xiě)并且完全獨(dú)立于底層的I/O介質(zhì),因此它可以很容易地不加修改地移植到其他的處理器當(dāng)中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FATFS支持FAT12、FAT16、FAT32等格式[11]。所以利用前面寫(xiě)好的SDIO驅(qū)動(dòng),把FATFS文件系統(tǒng)代碼移植到工程之中,就可以利用文件系統(tǒng)的各種函數(shù),對(duì)已格式化的SD卡的文件進(jìn)行讀寫(xiě)了。〔1〕FatFsR0.09本次畢設(shè)采用FatFs文件系統(tǒng)的R0.09的版本,提供有兩類接口函數(shù):底層函數(shù)〔DeviceControlInterface〕和上層函數(shù)〔ApplicationInterface〕。圖2.10FATFS文件系統(tǒng)模型 FileAccess:f_open(),f_close(),f_read(),f_write(),f_gets(),f_puts(),f_printf()…DirectoryAccess:f_opendir(),f_closedir(),f_readdir()…APIFile/DirectoryManagement:f_stat(),f_unlink(),f_rename(),f_mkdir(),f_getcwd()…VolumeManagement:f_mount(),f_mkfs(),f_fdisk()…DCI:disk_status()獲取扇區(qū)狀態(tài);disk_initialize()初始化扇區(qū);disk_read()讀扇區(qū);disk_write()寫(xiě)入扇區(qū);disk_ioctl()控制設(shè)備相關(guān)函數(shù);get_fattime()獲取當(dāng)前時(shí)間。上一節(jié)講到的SD卡的初始化,SD卡的讀寫(xiě)操作,以及擦除等操作的實(shí)現(xiàn)全部封裝到DCI函數(shù)中使用,即使用FatFS提供的API和DCI就能實(shí)現(xiàn)對(duì)SD卡的讀寫(xiě)及管理文件系統(tǒng)的所有操作。〔2〕常用的API函數(shù)FRESULTf_mount(BYTEvol,FATFS*fs);函數(shù)功能:注冊(cè)邏輯存儲(chǔ)設(shè)備〔翻開(kāi)一個(gè)工作區(qū)〕,成功后返回FR_OK;vol為盤(pán)符號(hào);fs指向新建的文件系統(tǒng)。FRESULTf_open(FIL*fp,constTCHAR*path,BYTEmode);函數(shù)功能:新建或翻開(kāi)一個(gè)文件,成功后返回FR_OK;fp指向創(chuàng)立的文件;path指向文件路徑名;mode文件訪問(wèn)方式。FRESULTf_close(FIL*fp);函數(shù)功能:關(guān)閉fp指向的文件。FRESULTf_read(FIL*fp,void*buff,UINTbtr, UINT*br);函數(shù)功能:讀取文件,成功后返回FR_OK;fp指向要讀取的文件;buff指向指向讀取到的數(shù)據(jù);btr讀取的字節(jié)數(shù);br指向讀取的字節(jié)數(shù)。FRESULTf_write(FIL*fp,constvoid*buff,UINTbtw, UINT*bw);函數(shù)功能:寫(xiě)入文件,成功后返回FR_OK;fp指向要寫(xiě)入的文件;buff指向待寫(xiě)入的數(shù)據(jù);btw指向?qū)懭氲淖止?jié)數(shù)。FatFs文件系統(tǒng)除了提供上述的庫(kù)函數(shù),還提供其他一些頭文件,可根據(jù)需要進(jìn)行手動(dòng)添加:cc932.h,cc936.h,cc949.h,cc950.h,ccsbcs.h,syscall.h2.5圖像采集模塊OV7725是一個(gè)能夠提供單片VGA攝像頭和影像處理器的所有功能的圖像傳感器,它可以輸出整幀,子采樣,取窗口等方式的各種分辨率8/10位圖像數(shù)據(jù),支持的數(shù)據(jù)格式有很多種,包括RAWRGB,RGB(GRB4:2:2,RGB565/555/444)以及YCbCr(4:2:2)等格式[12]。它的體積小,工作電壓低,具有單片VGA攝像頭影像處理器的功能,可以對(duì)圖像進(jìn)行伽瑪曲線、白平衡、飽和度、色度等處理[13]。2.5.1攝像頭輸出時(shí)序OV7725芯片的輸出采用了VGA時(shí)序〔是一種640*480像素顯示器的顯示模式〕,而ILI9341液晶屏為3.2寸屏只能顯示320*240像素的圖像,故將其時(shí)序改為QVGA〔即原VGA的四分之一,可配置OV7725的COM7存放器選擇〕。一個(gè)像素用16位的數(shù)據(jù)〔RGB565〕表示,而OV7725的數(shù)據(jù)總線寬度最多可設(shè)置為10位,故采用了8位的數(shù)據(jù)寬度〔D2~D9〕輸出圖像信息。對(duì)OV7725內(nèi)存放器的配置接口是采用了SCCB總線〔后面會(huì)詳細(xì)講解〕,見(jiàn)圖2.11。圖2.11OV7725一幅圖像就是一幀的數(shù)據(jù),OV7725在采集完一幅圖像后,都會(huì)產(chǎn)生一個(gè)場(chǎng)/幀同步信號(hào)VSYNC,其時(shí)序?yàn)椋阂粋€(gè)脈沖為一幀的開(kāi)始,低電平時(shí)開(kāi)始傳輸,另一個(gè)脈沖為一幀結(jié)束,見(jiàn)圖2.13。當(dāng)捕捉到VSYNC的上跳沿〔或下跳沿〕時(shí),產(chǎn)生中斷,將數(shù)據(jù)寫(xiě)入到FIFO中。VSYNC保持低電平說(shuō)明正在傳送圖像。當(dāng)再次捕捉到VSYNC的上跳沿〔或下調(diào)沿〕時(shí),產(chǎn)生中斷,一幀圖像傳輸完畢,禁止向FIFO的寫(xiě)入,并開(kāi)始讀FIFO中的數(shù)據(jù)。一幅圖由240行,320列個(gè)像素點(diǎn)組成,因此在VSYNC信號(hào)保持低電平階段〔即開(kāi)始傳輸圖像時(shí)〕需要行同步信號(hào)HREF〔輸出行起始和行結(jié)束信號(hào)〕換行,使數(shù)據(jù)一行行地被讀出。行同步的時(shí)序?yàn)椋篐REF由低電平變?yōu)楦唠娖綍r(shí)開(kāi)始傳輸一行像素?cái)?shù)據(jù),高電平表示正在傳輸,由高變低時(shí)表示一行傳輸完畢。實(shí)際上,信號(hào)HSYNC〔和HREF共用一個(gè)管腳,可以通過(guò)軟件來(lái)配置)也可以用于行同步,但與HREF有一點(diǎn)區(qū)別。從圖2.12中可以看到,HREF為高電平時(shí),攝像頭輸出的數(shù)據(jù)都是有效的,而HSYNC高電平期間,在后面有一段時(shí)間是無(wú)意義的,即圖中灰色局部。再結(jié)合FIFO的特性,選用了HREF作為行同步,見(jiàn)圖2.13。圖2.12幀時(shí)序圖圖2.13行時(shí)序圖前面講到每一行都有320個(gè)像素點(diǎn),在輸出一行的像素點(diǎn)時(shí),需要一個(gè)像素時(shí)鐘PCLK,確保像素點(diǎn)是一個(gè)個(gè)地被讀出。在HREF保持高電平時(shí),像素時(shí)鐘信號(hào)PCLK每出現(xiàn)一次上跳沿,就能輸出一個(gè)字節(jié)數(shù)。而每個(gè)像素點(diǎn)采用RGB565的格式,共16位〔2個(gè)字節(jié)數(shù)〕,故需要分兩次輸出。前一個(gè)字節(jié)從高位到低位依次是R4~R0、G5~G3,后一個(gè)字節(jié)是依次是G2~G0、B4~B0,見(jiàn)圖2.14。圖2.14 像素輸出時(shí)序FIFO存儲(chǔ)器由于攝像頭采集圖片信息的傳輸速率比擬快〔可達(dá)60fps〕,而STM32最快能每秒處理24幀的圖像信息〔每秒顯示24張以上的圖時(shí),人眼會(huì)感覺(jué)出是連續(xù)的畫(huà)面〕。為了防止丟幀和解決STM32與OV7725間的速率匹配,在STM32和攝像頭之間參加一個(gè)FIFO存儲(chǔ)器,見(jiàn)圖2.15。FIFO讀時(shí)序主要用到4個(gè)管腳:RE〔讀使能:低電平有效,已硬件接地〕、OE〔輸出使能:低電平有效,高電平關(guān)閉輸出〕、RCLK〔讀時(shí)鐘〕、RRST〔讀指針復(fù)位操作:低電平時(shí),讀指針復(fù)位到0地址開(kāi)始讀取數(shù)據(jù)〕。RE端硬件接地,那么STM32隨時(shí)可以讀取里面的數(shù)據(jù),但只有當(dāng)OE為低電平時(shí),讀到的數(shù)據(jù)才是有效的,否那么D0~D7呈現(xiàn)高組態(tài)。OE為低電平時(shí),隨著RCLK的運(yùn)轉(zhuǎn),輸出管腳D7~D0按地址遞增的方式〔每讀出一個(gè)字節(jié),指針就會(huì)加一〕輸出數(shù)據(jù),見(jiàn)圖2.16。在數(shù)據(jù)全部讀出后,要操作RRST將讀指針復(fù)位,方便下次讀取。圖2.15FIFO與OV7725、STM32連接圖2.16FIFO讀時(shí)序FIFO的寫(xiě)時(shí)序主要用到3個(gè)管腳:WE〔寫(xiě)使能:低電平有效〕、WCLK〔寫(xiě)時(shí)鐘〕、WRST〔寫(xiě)指針復(fù)位操作:當(dāng)WRST為低電平時(shí),寫(xiě)指針就復(fù)位到0地址開(kāi)始寫(xiě)入〕。WE為低電平時(shí),隨著WCLK的運(yùn)轉(zhuǎn),輸入管腳D17~D10的數(shù)據(jù)就會(huì)按地址自增的方式寫(xiě)入到FIFO中,見(jiàn)圖2.17。在數(shù)據(jù)全部寫(xiě)入后,要操作WRST將寫(xiě)指針復(fù)位,方便下次寫(xiě)入。完整驅(qū)動(dòng)程序流程:將攝像頭的幀同步信號(hào)送入STM32,當(dāng)STM32捕捉到場(chǎng)中斷信號(hào)時(shí),拉高WEN管腳電平,之后整幅圖像的數(shù)據(jù)就會(huì)存入FIFO。當(dāng)再次捕捉到場(chǎng)中斷時(shí),說(shuō)明一幅圖像已經(jīng)送入FIFO,此時(shí),關(guān)閉場(chǎng)中斷,拉低WEN電平,防止攝像頭數(shù)據(jù)再次寫(xiě)入FIFO。并開(kāi)始讀取FIFO數(shù)據(jù)到內(nèi)存緩沖區(qū),交由STM32處理后顯示到液晶屏上。再使能場(chǎng)中斷,采集下一幅圖像,如此循環(huán)。圖2.17FIFO寫(xiě)時(shí)序2.5.3SCCB總線SCCB〔OmniVisionserialcameracontrolbus〕,即串行攝像機(jī)控制總線,是一種已經(jīng)由OmniVision公司定義和采納的SCCB總線是一種三線結(jié)構(gòu)的串行總線,用于完成對(duì)絕大多數(shù)OmniVision系列圖像傳芯片功能的控制[14]。在簡(jiǎn)化的引腳封裝中,SCCB總線可以工作在改進(jìn)的兩線工作方式下[15]。兩線SCCB接口有兩條通迅連接線,即SIO_D〔數(shù)據(jù)線〕和SIO_C〔時(shí)鐘線〕[15]。SCCB接口協(xié)議是一種簡(jiǎn)化的I2C協(xié)議,兩者通信的時(shí)序根本一致,但是在應(yīng)答信號(hào)ACK和總線停止信號(hào)等方面上存在差異。STM32上沒(méi)有SCCB的硬件接口,故采用GPIO模擬I2C〔SCCB的雙總線,將SCCB_E硬件接地〕的方式實(shí)現(xiàn),下面是雙總線功能原理圖:圖2.18SCCB的雙總線接法〔1〕管腳定義=1\*GB3①SCCB_E信號(hào)低電平有效,一個(gè)高到低的轉(zhuǎn)換說(shuō)明數(shù)據(jù)傳輸開(kāi)始;一個(gè)低到高的轉(zhuǎn)換說(shuō)明數(shù)據(jù)傳輸結(jié)束;數(shù)據(jù)傳輸過(guò)程保持為低電平;高電平說(shuō)明總線處于空閑狀態(tài)。在SCCB_E說(shuō)明數(shù)據(jù)傳輸開(kāi)始之前主機(jī)必須將數(shù)據(jù)線SIO_D置為1,這樣可以防止總線數(shù)據(jù)傳輸開(kāi)始之前的總線不確定狀態(tài)的出現(xiàn)。=2\*GB3②SIO_C信號(hào)高電平有效,當(dāng)處于空閑狀態(tài)時(shí)必須被拉高;當(dāng)啟動(dòng)傳輸后,SIO_C被拉低說(shuō)明數(shù)據(jù)傳輸?shù)拈_(kāi)始,傳輸過(guò)程中高電平說(shuō)明一位數(shù)據(jù)正在傳輸,所以SIO_D的數(shù)據(jù)變化只能在SIO_C為低時(shí)發(fā)生,一位傳輸時(shí)間定義為tCYC,最小為10us。表2.5主控器件管腳描述管腳類型描述SCCB_E輸出串行片選輸出,當(dāng)總線處于空閑狀態(tài)時(shí)主機(jī)把SCCB_E拉高為1,啟動(dòng)傳輸或處在懸浮狀態(tài)時(shí)主機(jī)把SCCB_E拉低。SIO_C輸出串行I/O信號(hào)1輸出,空閑狀態(tài)時(shí)主機(jī)把SIO_C拉高;當(dāng)SCCB_E拉低時(shí),在上下電平之間變化;當(dāng)系統(tǒng)處于懸浮狀態(tài)時(shí),被拉低。SIO_DI/O串行信號(hào)0輸入和輸出,當(dāng)總線處于空閑保持懸??;系統(tǒng)處于懸浮狀態(tài)時(shí)被拉低。PWDN輸出掉電輸出。注:當(dāng)SCCB_E沒(méi)有出現(xiàn)在攝像頭芯片引腳上時(shí),默認(rèn)使能,被拉高。表2.6從控器件管腳描述管腳類型描述SCCB_E輸入串行片選輸入,當(dāng)系統(tǒng)處于掛起模式時(shí),輸入點(diǎn)可以被關(guān)閉。SIO_C輸入串行I/O信號(hào)1輸出,當(dāng)系統(tǒng)處于掛起模式時(shí),輸入點(diǎn)可以被關(guān)閉。SIO_DI/O串行I/O信號(hào)0輸入和輸出,當(dāng)系統(tǒng)處于掛起模式時(shí),輸入點(diǎn)可以被關(guān)閉。PWDN輸入掉電輸入?!?〕SCCB總線傳輸SCCB與I2C總線的協(xié)議根本一致,讀寫(xiě)時(shí)序相同,故對(duì)SCCB的通信時(shí)序不再展開(kāi)討論。=1\*GB3①SCCB的讀操作:intSCCB_ReadByte(uint8_t*pBuffer,uint16_tlength,uint8_tReadAddress);入口參數(shù):pBuffer存放待讀出的數(shù)據(jù);length:待讀出的長(zhǎng)度;ReadAddress:待讀出的地址。第一步:判斷起始信號(hào),假設(shè)初始化成功,進(jìn)入第二步,否那么返回失?。坏诙剑喊l(fā)送器件地址DEV_ADR,并等待應(yīng)答,假設(shè)有應(yīng)答,進(jìn)入第三步,否那么返回失敗;第三步:設(shè)置器件內(nèi)部待讀出的存放器的低起始地址,并等待應(yīng)答,釋放總線;第四步:再次啟用總線,并發(fā)送器件地址〔DEV_ADR+1〕,并等待應(yīng)答,進(jìn)入第五步,否那么返回失??;第五步:將數(shù)據(jù)讀到pBuffer中,共讀取length個(gè)字節(jié),全部讀出后,釋放總線,返回成功。=2\*GB3②SCCB寫(xiě)操作:intSCCB_WriteByte(uint16_tWriteAddress,uint8_tSendByte);入口參數(shù):WriteAddress待寫(xiě)入的地址;SendByte待寫(xiě)入的數(shù)據(jù)。第一步:判斷起始信號(hào),假設(shè)初始化成功,進(jìn)入第二步,否那么返回失??;第二步:發(fā)送器件地址DEV_ADR,并等待應(yīng)答,假設(shè)有應(yīng)答,進(jìn)入第三步,否那么返回失??;第三步:設(shè)置器件內(nèi)部待寫(xiě)入的存放器的低起始地址,并等待應(yīng)答,進(jìn)入第四步;第四步:發(fā)送數(shù)據(jù),并等待應(yīng)答,釋放總線,返回成功。第3章系統(tǒng)軟件設(shè)計(jì)關(guān)于STM32的片上資源,LCDILI9341液晶屏的根本配置,SD卡的驅(qū)動(dòng)及文件系統(tǒng),OV7725攝像頭功能的介紹已經(jīng)在上一個(gè)章節(jié)中進(jìn)行了詳細(xì)的說(shuō)明。硬件平臺(tái)的搭建都是建立在STM32開(kāi)發(fā)板與其他器件模塊連接上的,本章節(jié)那么主要采用自頂向下,層層細(xì)化的程序設(shè)計(jì)思想,分模塊講解整個(gè)系統(tǒng)的軟件實(shí)現(xiàn)流程。3.1頂層程序設(shè)計(jì)STM32照相機(jī)根本流程可以描述為:系統(tǒng)初始化,拍照處理。首先是系統(tǒng)初始化,包括系統(tǒng)時(shí)鐘配置,對(duì)按鍵的GPIO和中斷使能,LED的GPIO初始化;再初始化LCD的GPIO,F(xiàn)SMC總線功能和內(nèi)部存放器;還有初始化SD卡FATFS文件系統(tǒng)并使能SDIO的中斷;最后,在實(shí)現(xiàn)模擬SCCB總線后,OV7725還需要配置FIFO的GPIO和OV7725內(nèi)部的存放器,并初始化場(chǎng)信號(hào)線。接著,拍照處理:等待幀同步信號(hào),進(jìn)入攝像;等待按鍵,開(kāi)始拍照〔即液晶截屏〕并將圖片保存到SD卡中,見(jiàn)圖3.1。3.2系統(tǒng)初始化程序設(shè)計(jì)3.2.1GPIO初始化在第二章的主控模塊局部已經(jīng)介紹了GPIO的存放器和引腳的輸入輸出模式,對(duì)復(fù)用功能實(shí)現(xiàn)也做出了詳細(xì)說(shuō)明。在STM32控制下的LED,KEY的GPIO以及LCD,SDcard,攝像頭使用的所有GPIO或特殊功能引腳的設(shè)置都要通過(guò)流程圖來(lái)實(shí)現(xiàn)〔圖3.2〕。3.2.2LCD初始化LCD初始化主要包括兩個(gè)內(nèi)容:FSMC總線配置,LCD存放器配置,見(jiàn)圖3.3。程序中的涉及液晶屏的讀寫(xiě)操作〔如清屏,設(shè)置液晶掃描方向以及寫(xiě)入圖片信息〕,都是在向Bank1_LCD_C和Bank1_LCD_D兩個(gè)區(qū)域分別寫(xiě)入命令和數(shù)據(jù)實(shí)現(xiàn)的。其中,命令/數(shù)據(jù)的含義可參考ILI9341參考手冊(cè)上的內(nèi)容,在第二章的液晶顯示模塊中也給出了局部指令的含義。3.2.3SD卡文件系統(tǒng)初始化SD卡文件系統(tǒng)初始化可分兩塊:SD卡中斷初始化和硬件初始化。如何設(shè)置中斷和FatFs文件系統(tǒng)的函數(shù)接口前面都已經(jīng)介紹過(guò)了,圖3.4是整個(gè)SD卡文件系統(tǒng)的初始化流程圖。3.2.4OV7725初始化攝像頭OV7725的初始化分為三大局部:SCCB總線和FIFO的GPIO初始化,傳感器的初始化,場(chǎng)信號(hào)線的初始化。其中的SCCB總線時(shí)序在上一章已經(jīng)講過(guò),圖3.5是OV7725初始化的程序流程圖。圖3.1主程序流程圖圖3.2GPIO的配置及復(fù)用圖3.3LCD初始化流程圖3.4SD卡文件初始化流程圖3.5OV7725初始化流程3.3拍照處理程序設(shè)計(jì)前幾個(gè)小節(jié)詳細(xì)介紹了各個(gè)子模塊的初始化的實(shí)現(xiàn),從主程序框圖上看,還要有FIFO的準(zhǔn)備,圖像采集與顯示,中斷效勞程序,液晶截屏與保存子程序。FIFO的準(zhǔn)備〔使能數(shù)據(jù)出FIFO輸出〕,圖像采集與顯示是通過(guò)反復(fù)的讀FIFO的輸出并往LCD存放器寫(xiě)入數(shù)據(jù)的過(guò)程,這些可以參考第二章的液晶顯示模塊和圖像采集模塊中FIFO的時(shí)序。最后一小節(jié)的重點(diǎn)是液
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新型保溫材料抹灰分包勞務(wù)合同
- 二零二五年度苗木種植與生態(tài)旅游合作合同范本7篇
- 2025年度個(gè)人商品住宅買賣合同標(biāo)準(zhǔn)范本4篇
- 2025年木地板原材采購(gòu)合同304402025采購(gòu)版3篇
- 2025年度南京個(gè)人住宅房產(chǎn)買賣合同規(guī)范文本
- 2025年雞蛋市場(chǎng)調(diào)研與采購(gòu)合作合同模板3篇
- 2025年度數(shù)控打磨工勞動(dòng)合同與職業(yè)技能鑒定考核協(xié)議4篇
- 二零二五年度出租房屋用電安全責(zé)任追究合同樣本4篇
- 2025年度房地產(chǎn)項(xiàng)目施工總承包合同范本2篇
- 2025年南山磚廠市場(chǎng)拓展與銷售渠道建設(shè)合同4篇
- 垃圾車駕駛員聘用合同
- 2024年大宗貿(mào)易合作共贏協(xié)議書(shū)模板
- 新聞?dòng)浾咦C600道考試題-附標(biāo)準(zhǔn)答案
- 變壓器搬遷施工方案
- 單位轉(zhuǎn)賬個(gè)人合同模板
- 八年級(jí)語(yǔ)文下冊(cè) 成語(yǔ)故事 第十五課 諱疾忌醫(yī) 第六課時(shí) 口語(yǔ)交際教案 新教版(漢語(yǔ))
- 中考語(yǔ)文二輪復(fù)習(xí):記敘文閱讀物象的作用(含練習(xí)題及答案)
- 2024年1月高考適應(yīng)性測(cè)試“九省聯(lián)考”數(shù)學(xué) 試題(學(xué)生版+解析版)
- (正式版)JBT 11270-2024 立體倉(cāng)庫(kù)組合式鋼結(jié)構(gòu)貨架技術(shù)規(guī)范
- EPC項(xiàng)目采購(gòu)階段質(zhì)量保證措施
- T-NAHIEM 101-2023 急診科建設(shè)與設(shè)備配置標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論