電科1301嵌入式結(jié)課作業(yè)基于ARM-Cortex-M處理器的圖像無線傳輸_第1頁
電科1301嵌入式結(jié)課作業(yè)基于ARM-Cortex-M處理器的圖像無線傳輸_第2頁
電科1301嵌入式結(jié)課作業(yè)基于ARM-Cortex-M處理器的圖像無線傳輸_第3頁
電科1301嵌入式結(jié)課作業(yè)基于ARM-Cortex-M處理器的圖像無線傳輸_第4頁
電科1301嵌入式結(jié)課作業(yè)基于ARM-Cortex-M處理器的圖像無線傳輸_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 嵌入式課程設(shè)計課程設(shè)計名稱:基于ARM-Cortex-M處理器的圖像無線傳輸 專業(yè)班級: 電科1301班 學(xué)生姓名: 學(xué) 號: 2013160 指導(dǎo)教師: 金廣鋒 基于ARM-Cortex-M處理器的圖像無線傳輸一,設(shè)計簡介本論文主要闡述設(shè)計一款以ARM Cortex-M系列微處理器為核心的圖像無線傳輸系統(tǒng)的設(shè)計方法和實現(xiàn)細(xì)節(jié)。論文主要針對未來對于智能家居以及安防設(shè)備的日益需求,采用迄今最為流行性能卓越的ARM Cortex-M系列嵌入式微處理器作為嵌入式智能設(shè)備的處理核心,并搭載使用Micrium公司的嵌入式實時操作系統(tǒng)uC/OSII。圖像無線傳輸具有十分廣闊的應(yīng)用前景,在軍事、國防、工農(nóng)

2、業(yè)、城市管理、生物醫(yī)療、環(huán)境監(jiān)測、危險區(qū)域等許多領(lǐng)域都有重要的科研價值和潛在的實用價值, 已經(jīng)引起了人們廣泛的關(guān)注。美國技術(shù)評論雜志把圖像無線傳感器視為未來新興十大技術(shù)的首位。美國早在上個世紀(jì)90年代就著手對無線傳感器網(wǎng)絡(luò)展開了先期研究,并在軍方應(yīng)用與推廣。美國軍方的遠(yuǎn)景研究計劃局(DARPA)陸續(xù)支持了Wins、SmartDust等一系列重要的圖像無線傳感器項目。二,系統(tǒng)硬件設(shè)計1,系統(tǒng)框圖攝像頭模塊發(fā)送端處理器ILI9325顯示屏SD卡存儲單元2.4G無線模塊接受端處理器ILI9325顯示屏SD卡存儲單元2.4G無線模塊能源供應(yīng)部分能源供應(yīng)部分圖1 圖像無線傳輸工作原理框圖處理器模塊是整個

3、傳感器節(jié)點的核心部分,包括處理單元和存儲單元,它負(fù)責(zé)控制整個節(jié)點的操作,處理所有相關(guān)數(shù)據(jù);傳感器模塊是外圍的設(shè)備的真正接口,負(fù)責(zé)監(jiān)測區(qū)域內(nèi)數(shù)據(jù)的采集和轉(zhuǎn)換;無線通信模塊負(fù)責(zé)與其他傳感器節(jié)點進(jìn)行無線通信,并傳遞數(shù)據(jù);能量供應(yīng)模塊也就是傳感器節(jié)點運行所需的電源,一般直接供電不太實際,通常采用微型電池。此外,還提供與用戶的通信接口,方便與用戶進(jìn)行交互。圖像無線傳輸工作原理框圖見圖1.2,ARM處理器系統(tǒng)核心部分采用ARM處理器。Cortex系列屬于ARMv7架構(gòu),這是ARM公司最新的指令集架構(gòu)。ARMv7架構(gòu)定義了三大分工明確的系列:“A”(Application)系列面向尖端的基于虛擬內(nèi)存的操作系

4、統(tǒng)和用戶應(yīng)用,處理性能越來越接近于電腦,典型的產(chǎn)品有平板電腦、iphone、安卓手機(jī)和windows phone8;“R”(Realtime)系列針面向?qū)崟r系統(tǒng);“M”(Microcontroller)系列面向微控制器。由于應(yīng)用領(lǐng)域不同,基于v7架構(gòu)的Cortex處理器系列所采用的技術(shù)也不相同,基于v7A的稱為Cortex-A系列,基于v7R的稱為Cortex-R系列,基于v7M的稱為Cortex-M系列。本系統(tǒng)設(shè)計便使用了Cortex-M系列的處理器。3,發(fā)射端核心部分發(fā)射端核心部分采用STM32F407VGT6處理器,STM32F407VGT6屬于先進(jìn)的,Cortex-M4F內(nèi)核,F(xiàn)PU浮

5、點運算能力,增強(qiáng)的DSP處理指令;更多的存儲空間,高達(dá)1M字節(jié)的片上閃存高達(dá)196K字節(jié)的內(nèi)嵌SRAM;靈活的外部存儲器接口;極致的運行速度,以168MHz高速運行時可達(dá)到1.25DMIPS/MHz的處理能力。片上資源有LCD并行接口,8080/6800模式;時鐘,復(fù)位和電源管理1.8 V至3.6 V供電和I / O的POR,PDR,PVD和BOR4至26 MHz晶體振蕩器內(nèi)部16 MHz工廠調(diào)整的RC(精度為1)32 kHz振蕩器作為RTC與校準(zhǔn)內(nèi)部32 kHz RC與校準(zhǔn)睡眠,停機(jī)和待機(jī)模式VBAT供應(yīng)RTC,20×32位的備份寄存器+可選的4 KB備份SRAM;3個12位,2.

6、4MSPS一個A/D轉(zhuǎn)換器:多達(dá)24通道,三重交叉模式下的性能高達(dá)7.2 MSPS;2個12位D / A轉(zhuǎn)換器;通用DMA:具有FIFO和突發(fā)支持的16路DMA控制器;多達(dá)17個定時器:12個16位定時器,和2個頻率高達(dá)168MHz的32位定時器,每個定時器都帶有4個輸入捕獲/輸出比較/PWM,或脈沖計數(shù)器與正交(增量)編碼器輸入;高級連接功能USB 2.0全速器件/主機(jī)/ OTG控制器,帶有片上物理層USB的2.0 high-speed/full-speed設(shè)備/主機(jī)/ OTG控制器的專用DMA,片上全速PHY和ULPI10/100以太網(wǎng)MAC專用DMA:支持IEEE 1588v2的硬件,M

7、II/RMII;14位parallel-照相機(jī)接口:速度高達(dá)54MB/S。4,通用DMA:具有F?6?7?6?7IFO和突發(fā)支持的16路DMA控制器2個12位D / A轉(zhuǎn)換器.LCD并行接口,8080/6800模式該處理器是由ARM專門開發(fā)的最新嵌入式處理器,用以滿足需要有效且易于使用的控制和信號處理功能混合的數(shù)字信號控制市場。高效的信號處理功能與 Cortex-M 處理器系列的低功耗、低成本和易于使用的優(yōu)點的組合,旨在滿足專門面向電動機(jī)控制、汽車、電源管理、嵌入式音頻和工業(yè)自動化市場的新興類別的靈活解決方案。該處理器是由ARM專門開發(fā)的最新嵌入式處理器,用以滿足需要有效且易于使用的控制和信號

8、處理功能混合的數(shù)字信號控制市場。高效的信號處理功能與 Cortex-M 處理器系列的低功耗、低成本和易于使用的優(yōu)點的組合,旨在滿足專門面向電動機(jī)控制、汽車、電源管理、嵌入式音頻和工業(yè)自動化市場的新興類別的靈活解決方案。該處理器是由ARM專門開發(fā)的最新嵌入式處理器,用以滿足需要有效且易于使用的控制和信號處理功能混合的數(shù)字信號控制市場。高效的信號處理功能與 Cortex-M 處理器系列的低功耗、低成本和易于使用的優(yōu)點的組合,旨在滿足專門面向電動機(jī)控制、汽車、電源管理、嵌入式音頻和工業(yè)自動化市場的新興類別的靈活解決方案。接收端核心部分接收端核心部分使用STM32F103ZET6處理器,STM32F1

9、03ZET6處理器增強(qiáng)型系列使用高性能的ARM Cortex-M3 32位的RISC內(nèi)核,ARM的Cortex-M3處理器是最新一代的嵌入式ARM處理器,以72MHz主頻運行時可達(dá)到1.20 DMIPS/MHz的處理能力,它為實現(xiàn)MCU的需要提供了低成本的平臺、縮減的管腳數(shù)目、降低的系統(tǒng)功耗,同時提供卓越的計算性能和先進(jìn)的中斷系統(tǒng)響應(yīng)。 片上資源有LQFP144腳LQFP144腳,512K 片內(nèi)FLASH(相當(dāng)于硬盤),64K片內(nèi)RAM(相當(dāng)于內(nèi)存),片內(nèi)FLASH 支持在線編程(IAP);片內(nèi)雙RC晶振,提供8M和32K的頻率;3路共16通道的12位AD輸入,2路共2通道的12位DA輸出;支

10、持片外獨立電壓基準(zhǔn);8個定時器;3個SPI接口;2個IIC接口;2個IIS接口;5個USART通信接口;1個SDIO接口;1個USB微控制器;1個CAN微控制器。所有的I/O口都可作為外部中斷觸發(fā)端。5,無線模塊圖2 NRF24L01+無線模塊原理圖發(fā)送端和接收端的無線模塊硬件原理均一致。NRF24L01+是NORDIC公司最近生產(chǎn)的一款工作在2.4GHz2.5GHz的ISM 頻段的單片無線收發(fā)器,采用FSK調(diào)制,內(nèi)部集成NORDIC自己的Enhanced Short Burst協(xié)議??梢詫崿F(xiàn)點對點或是1對6的無線通信。無線通信速度可以達(dá)到2M(bps)。無線收發(fā)器包括:頻率發(fā)生器、增強(qiáng)型“S

11、chockBurst”模式控制器、功率放大器、晶體振蕩器、調(diào)制器和解調(diào)器。輸出功率頻道選擇和協(xié)議的設(shè)置可以通過SPI接口進(jìn)行設(shè)置。幾乎可以連接到各種單片機(jī)芯片,并完成無線數(shù)據(jù)傳送工作。6,發(fā)送端圖像采集部分圖3 OV7670攝像頭圖3是OV7670攝像頭與處理器的連接圖。OV7670圖像傳感器,體積小、工作電壓低,提供單片VGA攝像頭和影像處理器的所有功能。通過SCCB 總線控制,可以輸出整幀、子采樣、取窗口等方式的各種分辨率8位影響數(shù)據(jù)。該產(chǎn)品VGA圖像最高達(dá)到30幀/秒。OV7670/7171共有656x488即320128個像素,其中640x480個有效(即307200)。7,SCCB總

12、線,SCCB是歐姆尼圖像技術(shù)公司(OmniVision)開發(fā)的一種總線,并廣泛的應(yīng)用于OV系列圖像傳感器上。SCCB是一種3線的總線,它由SCCB_E、SIO_C、SIO_D組成。在為了減少引腳的芯片上縮減為2根線,SIO_C和SIO_D。2線的SCCB總線只能是一個主器件對一個從器件控制,但3線SCCB接口可以對多個從器件控制。2線的SCCB總線需要主機(jī)具備如下條件中的一個或多個:一、主機(jī)必須能夠使SIO_D處于第三態(tài),即高阻態(tài)。二、主機(jī)必須能夠驅(qū)動SIO_D比正常識別電壓更高或更低。圖4 SCCB時序圖SIO_E:輸出(主機(jī)發(fā)出,單向),低電平有效,總線空閑時主機(jī)驅(qū)動此引腳為1,驅(qū)動為0時

13、表示開始傳輸或者掛起模式(在表面沒有該引腳的芯片中,該引腳默認(rèn)為可用的,并且保持高電平)。它標(biāo)志這數(shù)據(jù)傳輸?shù)拈_始和結(jié)束,高電平向低電平轉(zhuǎn)變表示開始傳輸,低電平向高電平轉(zhuǎn)變表示結(jié)束傳輸。在數(shù)據(jù)傳輸過程中,SIO_E必須保持為0。SIO_C:輸出(主機(jī)發(fā)出,單向),總線空閑時主機(jī)驅(qū)動此引腳為1;當(dāng)驅(qū)動SIO_E為0時,主機(jī)驅(qū)動此引腳為0或1;當(dāng)掛起時主機(jī)驅(qū)動SIO_C為0; 它表明每一個傳輸位;SIO_C為1時表示一個傳輸位;SIO_D只能在SIO_C為0時發(fā)生變化。 SIO_D:I/O口,雙向傳輸線,既可以由主機(jī)驅(qū)動也可以由從機(jī)驅(qū)動。當(dāng)總線空閑時保持浮動,狀態(tài)不固定(0、1或三態(tài)高阻)。當(dāng)系統(tǒng)掛

14、起時驅(qū)動該引腳為0。為了不讓該引腳產(chǎn)生未知的狀態(tài),主機(jī)和從機(jī)有職責(zé)保持該引腳的電平。SIO_C為1表示傳輸一位數(shù)據(jù),SIO_D只能在SIO_C為0時發(fā)生變化。然而,在開始傳輸和結(jié)束傳輸時卻可以存在例外。當(dāng)SIO_E有效且SIO_C變?yōu)?之前,SIO_D可以被驅(qū)動為0。在SIO_E失效前,SIO_C轉(zhuǎn)為1時,SIO_D也能被驅(qū)動為0。8,攝像頭工作時序圖5 攝像頭工作時序圖當(dāng)圖像當(dāng)中一行的數(shù)據(jù)來臨之際,行中斷引腳HREF=0,tPHL過后HREF=1,表示像素數(shù)據(jù)開始輸出,在像素時鐘引腳PLCK=0時改變輸出數(shù)據(jù),PLCK=1是通知處理器數(shù)據(jù)輸出穩(wěn)定,以此反復(fù)輸出一行數(shù)據(jù)。9,LCD顯示部分圖6

15、 發(fā)送端TFT屏電路原理圖圖7 接受端TFT屏電路原理圖發(fā)送端和接收端的顯示屏均使用ILI9325芯片驅(qū)動的顯示屏。在ARM cortex-M系列處理器內(nèi)部,是通過FSMC(靜態(tài)存儲器控制器)來控制ILI9325,ARM cortex-M系列處理器把TFT模塊當(dāng)做一塊NOR FLASH來操作。使用FSMC控制器后,可以把FSMC提供的FSMC_A25:0作為地址線,而把FSMC提供的FSMC_D15:0作為數(shù)據(jù)總線。當(dāng)存儲數(shù)據(jù)設(shè)為16位時,地址各位對應(yīng)FSMC_A24:0,數(shù)據(jù)位對應(yīng)FSMC_D15:0。10,片存儲部分圖8 SD卡存儲部分存儲部分使用SD卡,SD存儲介質(zhì)是一種非易失性外部存儲

16、器,可滿足許多應(yīng)用場合的要求。SD格式是“多媒體卡”(MMC)格式的繼承產(chǎn)品。SD卡存儲器一般工作于3.3V電壓,具有適度的電流要求。SD卡的容量從幾百兆節(jié)到最高的幾十GB不等。容量范圍如此之寬,可為眾多應(yīng)用提供充足的外部存儲空間。三,系統(tǒng)軟件設(shè)計1,無線模塊驅(qū)動程序設(shè)計發(fā)送端和接收端的無線模塊驅(qū)動代碼均由以上兩個文件組成。對nrf24l01的操作方法見圖8。對nrf24l01傳送SPI數(shù)據(jù)設(shè)置nrf24l01為發(fā)送模式,指定發(fā)送速率和發(fā)送個數(shù)初始化處理器SPI接口發(fā)送指定數(shù)據(jù)發(fā)送函數(shù)是否返回0NOYES對nrf24l01傳送SPI數(shù)據(jù)設(shè)置nrf24l01為接收模式,指定接收速率和接收個數(shù)初始

17、化處理器SPI接口接收數(shù)據(jù)接收函數(shù)是否返回0NOYES圖3-1-1 nrf24l01發(fā)送數(shù)據(jù)操作流程圖圖3-1-2 nrf24l01接收數(shù)據(jù)操作流程圖圖8 nrf24l01工作在發(fā)送和接收的操作流程圖對nrf24l01的操作很簡單,不論是發(fā)送還是接收基本步驟都是先初始化處理器SPI接口,然后傳送參數(shù)對nrf24l01進(jìn)行設(shè)置,接下來便可以使用nrf24l01進(jìn)行發(fā)送數(shù)據(jù)(或接收數(shù)據(jù))。為了確保不發(fā)漏(或接漏)數(shù)據(jù),每次發(fā)送(或接收)都通過while()循環(huán)檢查是否發(fā)送(或接收)成功,發(fā)送(或接收)函數(shù)返回0表示無誤,返回1表示還沒成功或還沒完成發(fā)送(或接收)。nrf24l01.c提供用戶使用的

18、函數(shù)有NRF24L01_Init()NRF24L01_Detach()NRF24L01_TxMode()NRF24L01_RxMode()NRF24L01_TxPacket()NRF24L01_RxPacket()NRF24L01_Init()函數(shù)初始化ARM處理器的SPI接口,完成SPI初始化后檢測接口上是否連接好nrf24l01無線模塊。NRF24L01_Detach()函數(shù)用于解除nrf24l01無線模塊對ARM處理器的SPI接口的占用,也有減低系統(tǒng)功耗功能。NRF24L01_TxMode()設(shè)置nrf24l01無線模塊為發(fā)送模式,包括設(shè)置通訊速率,通訊字節(jié)個數(shù),本地地址和接收地址,頻道

19、的自動答應(yīng)允許是否使能,允許接受的頻道號和頻道個數(shù),自動重發(fā)時間和次數(shù),輸出功率頻道選擇。NRF24L01_RxMode()設(shè)置nrf24l01無線模塊為接收模式,包括設(shè)置通訊速率,通訊字節(jié)個數(shù),本地地址和接收地址,頻道的自動答應(yīng)允許是否使能,允許接受的頻道號和頻道個數(shù),自動重發(fā)時間和次數(shù),輸出功率頻道選擇。NRF24L01_TxPacket()發(fā)送具體數(shù)據(jù)包。具體實現(xiàn)代碼:unsigned char NRF24L01_TxPacket(unsigned char* tx_buf, unsigned char len)unsigned char status = 0x00;NRF24L01_C

20、E_LOW();NRF24L01_Write_Buf(RF_WRITE_REG + RX_ADDR_P0, NRF24L01_ADDRESS, NRF24L01_ADR_WIDTH_5B); / 裝載接收端地址NRF24L01_Write_Buf(WR_TX_PLOAD, tx_buf, len);/ 裝載數(shù)據(jù)NRF24L01_CE_HIGH();while(NRF24L01_IRQ() != 0);status = NRF24L01_Read_Reg(RF_READ_REG + STATUS);NRF24L01_Write_Reg(RF_WRITE_REG + STATUS, status)

21、;if(status & MAX_TX)NRF24L01_Write_Reg(FLUSH_TX, 0x00);return MAX_TX;if(status & TX_OK)return TX_OK;return 0xff;/其他原因發(fā)送失敗NRF24L01_RxPacket()接收具體數(shù)據(jù)包。具體實現(xiàn)代碼:unsigned char NRF24L01_RxPacket(unsigned char* rx_buf, unsigned char len) unsigned char revale = 0;unsigned char sta = 0;while(NRF24L01_I

22、RQ() != 0);sta = NRF24L01_Read_Reg(RF_READ_REG+STATUS);/ 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況NRF24L01_Write_Reg(RF_WRITE_REG+STATUS, sta); /接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標(biāo)志if(sta & RX_OK) / 判斷是否接收到數(shù)據(jù)NRF24L01_Read_Buf(RD_RX_PLOAD, rx_buf, len);/ read receive payload from RX_FIFO bufferNRF24L01_Write_Reg(FLU

23、SH_RX, 0x00);revale = RX_OK; /讀取數(shù)據(jù)完成標(biāo)志return revale;2,攝像頭驅(qū)動程序設(shè)計圖像采集端的攝像頭驅(qū)動代碼由以上兩個文件組成。OV7670的操作流程如圖9。初始化處理器SCCB接口和攝像頭接口通過SCCB總線對OV7670寫設(shè)置參數(shù)SCCB傳送的數(shù)據(jù)書否完全到達(dá)OV7670啟動OV7670OV7670采集圖像NOYES圖9 對OV7670操作流程圖ov7670.c提供用戶使用的函數(shù)有OV7670_Init()OV7670_Start()OV7670_Detach()OV7670_ISR()OV7670_Init()初始化ARM處理器攝像頭接口和OV

24、7670模塊,并檢測OV7670模塊是否連接在ARM處理器攝像頭接口上。具體實現(xiàn)代碼:unsigned char OV7670_Init(void)unsigned char i;DCMI_NVIC_Init();DCIM_GPIO_Init();SCCB_Init();OV7670_Reset();delay_ms(5); for(i = 0; i < OV7670_REG_NUM; i+) if(0 = OV7670_WriteReg(OV7670_regi0, OV7670_regi1)return 1; return 0;OV7670_Start()函數(shù)啟動OV7670模塊。此函

25、數(shù)跟具體的硬件操作有關(guān),具體實現(xiàn)代碼:void OV7670_Start(void)LCD_WriteReg(0x0003, 0x1008); LCD_SetCursor(0, 319);LCD_WriteRAM_Prepare();RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);/DCMI中斷 DMA_Cmd(DMA2_Stream1, ENABLE); DCMI_Cmd(ENABLE); DCMI_CaptureCmd(ENABLE); LCD_REG = 0x

26、22;OV7670_Detach()用于解除OV7670模塊對ARM處理器的攝像頭接口的占用,也有減低系統(tǒng)功耗功能。OV7670_ISR()函數(shù)是OV7670模塊中斷服務(wù)函數(shù),每當(dāng)OV7670模塊采集完一幅圖像后便進(jìn)入此函數(shù)進(jìn)行關(guān)中斷。此函數(shù)跟具體的硬件操作有很大關(guān)聯(lián),具體操作步驟和選用處理器有關(guān),具體實現(xiàn)代碼:void OV7670_ISR(void)if(DCMI_GetITStatus(DCMI_IT_FRAME) != RESET)DCMI_ClearITPendingBit(DCMI_IT_FRAME);LCD_SetCursor(0, 319); LCD_WriteRAM_Prep

27、are();3,LCD顯示驅(qū)動程序設(shè)計發(fā)送端和接受端LCD顯示驅(qū)動代碼由以上兩個文件組成。ili9325的操作流程如圖10。通過FSMC初始化ili9325初始化處理器FSMC接口寫ili9325的寄存器地址寫ili9325的寄存器數(shù)據(jù)圖10 ili9325操作流程圖ili932x.c提供用戶使用的函數(shù)有LCD_Initializtion()LCD_SetCursor()LCD_SetWindows()LCD_Clear()LCD_Font()LCD_Dispmd()LCD_GetPoint()LCD_SetPoint()LCD_Initializtion()用于初始化ARM處理器的FSMC接

28、口和LCD模塊,有幾個重要的參數(shù)需要注意:(0x0000,0x0001)開啟內(nèi)部時鐘(0x0002,0x0700)電源開啟(0x0050,0x0000)水平GRAM起始位置(0x0051,0x00ef)水平GRAM終止位置(0x0052,0x0000)垂直GRAM起始位置(0x0053,0x013f)垂直GRAM終止位置第一個參數(shù)是LCD的寄存器地址,第二個值是給對應(yīng)的寄存器寫進(jìn)對應(yīng)的數(shù)值。LCD_SetCursor()函數(shù)是設(shè)置LCD的坐標(biāo)。LCD_SetWindows()函數(shù)是設(shè)置LCD顯示得窗口大小。LCD_Clear()函數(shù)是清除LCD并顯示全屏為一種單一顏色。LCD_Clear()函

29、數(shù)設(shè)置LCD顯示文字的字體。LCD_Dispmd()函數(shù)設(shè)置LCD刷屏的方式。LCD_GetPoint()函數(shù)讀取LCD屏指定像素的RGB值。LCD_SetPoint()函數(shù)是在LCD指定的像素設(shè)置其RGB值。4,文件系統(tǒng)發(fā)送端和接受端SD存儲底層驅(qū)動代碼由以上兩個文件組成。sdio_sd.c提供用戶使用的函數(shù)有SD_Error SD_InitializeCards(void);SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo);SD_Error SD_GetCardStatus(SD_CardStatus *cardstatus);SD_Error

30、SD_EnableWideBusOperation(uint32_t WideMode);SD_Error SD_SelectDeselect(uint32_t addr);SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize);SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);SD_Error SD_WaitReadOp

31、eration(void);SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize);SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);SD_Error SD_WaitWriteOperation(void);SDTransferState SD_GetTransferState(void);SD_Error S

32、D_StopTransfer(void);SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);SD_Error SD_SendStatus(uint32_t *pcardstatus);SD_Error SD_SendSDStatus(uint32_t *psdstatus);SD_Error SD_ProcessIRQSrc(void);void SD_ProcessDMAIRQ(void);由于直接操作SD卡存儲數(shù)據(jù)十分復(fù)雜,因此移植了FAT文件系統(tǒng)來對SD卡進(jìn)行管理操作。FAT文件系統(tǒng)是一種由微軟發(fā)明并擁有部分專利的文檔系統(tǒng),供

33、MS-DOS使用,也是所有非NT內(nèi)核的微軟窗口使用的文件系統(tǒng)。cc936.c文件是拓展了FAT文件系統(tǒng)對中文的支持。diskio.c文件是FAT文件系統(tǒng)調(diào)用底層SD卡驅(qū)動代碼的中間層。ff.c文件是FAT文件系統(tǒng)的核心部分。ffconf.h文件是FAT文件系統(tǒng)的配置文件。fsearch.c文件是FAT文件系統(tǒng)的路徑搜索功能文件。integer.c文件定義了FAT文件系統(tǒng)自己的數(shù)據(jù)類型。四,實時操作系統(tǒng)應(yīng)用1,uC/OSII實時操作系統(tǒng)介紹uC/OS是一種免費公開源代碼、結(jié)構(gòu)小巧、具有可剝奪實時內(nèi)核的實時操作系統(tǒng)。uC/OS-II的前身是uC/OS,最早出自于1992 年美國嵌入式系統(tǒng)專家Jea

34、n J.Labrosse 在嵌入式系統(tǒng)編程雜志的5 月和6 月刊上刊登的文章連載,并把uC/OS 的源碼發(fā)布在該雜志的BBS上。uC/OS和C/OS-II是專門為計算機(jī)的嵌入式應(yīng)用設(shè)計的,絕大部分代碼是用C語言編寫的。CPU硬件相關(guān)部分是用匯編語言編寫的、總量約200行的匯編語言部分被壓縮到最低限度,為的是便于移植到任何一種其它的CPU 上。用戶只要有標(biāo)準(zhǔn)的ANSI的C交叉編譯器,有匯編器、連接器等軟件工具,就可以將uC/OS-II嵌人到開發(fā)的產(chǎn)品中。uC/OS-II 具有執(zhí)行效率高、占用空間小、實時性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點, 最小內(nèi)核可編譯至 2KB 。uC/OS-II 已經(jīng)移植到了幾乎所

35、有知名的CPU 上。其252版本通過了美國航天航空管理局的安全認(rèn)證,可靠性非常高。uC/OS-II目標(biāo)是實現(xiàn)一個基于優(yōu)先級調(diào)度的搶占式的實時內(nèi)核,并在這個內(nèi)核之上提供最基本的系統(tǒng)服務(wù),如信號量,郵箱,消息隊列,內(nèi)存管理,中斷管理等。本課題選用uC/OS-II里最新的2.91版本,該版本最多可以支持256個任務(wù),分別對應(yīng)優(yōu)先級0255,其中0為最高優(yōu)先級。255為最低級,系統(tǒng)保留了4個最高優(yōu)先級的任務(wù)和4個最頂優(yōu)先級的任務(wù),用戶可以使用其他優(yōu)先級。uC/OS-II提供了任務(wù)管理的各種函數(shù)調(diào)用,包括創(chuàng)建任務(wù),刪除任務(wù),改變?nèi)蝿?wù)的優(yōu)先級,任務(wù)掛起和恢復(fù)等。系統(tǒng)初始化時會自動產(chǎn)生兩個任務(wù):一個是空閑任

36、務(wù),它的優(yōu)先級最低,該任務(wù)僅給一個整形變量做累加運算;另一個是系統(tǒng)任務(wù),它的優(yōu)先級為次低,該任務(wù)負(fù)責(zé)統(tǒng)計當(dāng)前CPU的利用率。由于uC/OS-II實時性能優(yōu)異,本課題我選用了該操作系統(tǒng)。2,在uC/OSII運行程序運行任務(wù)0是否完整采集一幅圖像任務(wù)1把一幅完整圖像保存到SD卡任務(wù)2驅(qū)動無線模塊發(fā)送圖像數(shù)據(jù)系統(tǒng)啟動建立任務(wù)0,1,2NONOYESYES驅(qū)動攝像頭采集圖像發(fā)郵箱通0知任務(wù)1圖像是否發(fā)送完成返回任務(wù)0發(fā)郵箱通1知任務(wù)2,圖11 發(fā)送端程序流程圖見圖11,描述了發(fā)送端uC/OS-II的整體運行流程。uC/OS-II啟動后,建立了任務(wù)0,任務(wù)1,任務(wù)2。任務(wù)0負(fù)責(zé)采集圖像和顯示采集圖像,當(dāng)

37、一幅圖像采集完成后,任務(wù)0發(fā)郵箱通知任務(wù)1保存圖像到SD卡,任務(wù)1保存好后CPU返回任務(wù)0,任務(wù)0發(fā)郵箱通知任務(wù)2驅(qū)動無線模塊發(fā)送圖像數(shù)據(jù),每發(fā)送20字節(jié)后等待接收端應(yīng)答信號,再發(fā)送下一組20字節(jié),知道一幅圖像發(fā)送完成。發(fā)送端代碼如下:/*發(fā)送端主函數(shù)*/int main (void) OSInit();/初始化uC/OS-II,實時內(nèi)核OSTaskCreate(App4_Task0,(void *)0, (OS_STK *)&App4_Task0_Stk512 - 1, 14);OSTaskCreate(App4_Task1, (void *)0, (OS_STK *)&Ap

38、p4_Task1_Stk512 - 1, 13);OSTaskCreate(App4_Task2, (void *)0, (OS_STK *)&App4_Task2_Stk512 - 1, 12); OSStart();/啟動操作系統(tǒng) return (0);OS_EVENT *App4_Mbox2;/*定義兩個事件郵箱指針*/* 任務(wù)App4_Task0負(fù)責(zé)攝像頭圖像采集和顯示*/static OS_STK App4_Task0_Stk 512 ;static void App4_Task0 (void *p_arg)char msg1 = 1, msg2 = 2;while(OSTa

39、skDelReq(30) != OS_ERR_TASK_NOT_EXIST)OSTimeDly(10);while(OV7670_Init();OV7670_Start();(void)p_arg; while(OS_TRUE)if (DCMI_GetFlagStatus(DCMI_FLAG_FRAMERI) = SET)DCMI_ClearFlag(DCMI_FLAG_FRAMERI);OV7670_Detach();OSMboxPost(App4_Mbox0, (void *)&msg1);OSMboxPost(App4_Mbox1, (void *)&msg2); OV7

40、670_Start();/* 任務(wù)App4_Task1負(fù)責(zé)圖像無線傳輸*/static OS_STK App4_Task1_Stk 512 ;static void App4_Task1 (void *p_arg)char* msg1;unsigned char err;App4_Mbox0 = OSMboxCreate(void *)0);(void)p_arg; while(OS_TRUE)msg1 = OSMboxPend(App4_Mbox0, 0, &err);if(err = OS_ERR_NONE)if(*msg1 = 1)Image_Transmit();/* 任務(wù)Ap

41、p4_Task2負(fù)責(zé)圖像保存*/static OS_STK App4_Task2_Stk 512 ;static void App4_Task2 (void *p_arg)char* msg2;unsigned char err;unsigned int n = 0;App4_Mbox1 = OSMboxCreate(void *)0);(void)p_arg; while(OS_TRUE)msg2 = OSMboxPend(App4_Mbox1, 0, &err);if(err = OS_ERR_NONE)if(*msg2 = 2)while(GUI_PrtScreen(Photog

42、_pathn+);第一個函數(shù)是主函數(shù),初始化操作系統(tǒng),創(chuàng)建了任務(wù)App4_Task0、任務(wù)App4_Task1、任務(wù)App4_Task2,最后啟動系統(tǒng)。第二個函數(shù)是任務(wù)App4_Task0,初始化攝像頭,啟動攝像頭,并在沒采集一幅圖像后發(fā)送系統(tǒng)郵件給任務(wù)App4_Task1、任務(wù)App4_Task2。第三個函數(shù)是任務(wù)App4_Task1,建立系統(tǒng)郵件0,并在接收到任務(wù)App4_Task0發(fā)來的系統(tǒng)郵件后開始發(fā)送圖像。第四個函數(shù)是任務(wù)App4_Task2,建立系統(tǒng)郵箱1,并在接收到任務(wù)App4_Task0發(fā)來的系統(tǒng)郵件后保存圖像到SD卡中。任務(wù)0把一幅完整圖像保存到SD卡任務(wù)0驅(qū)動無線模塊接收圖

43、像數(shù)據(jù)系統(tǒng)啟動建立任務(wù)0圖像是否接收完成NOYES圖12 接收端程序流程見圖12,描述了接收端uC/OS-II的整體運行流程。uC/OS-II啟動后,建立了任務(wù)0,當(dāng)無線模塊接收到數(shù)據(jù)時,它會通知CPU去讀取數(shù)據(jù),每讀完20字節(jié)就答應(yīng)發(fā)送端一次,然后發(fā)送端再發(fā)送下一組20字節(jié)數(shù)據(jù)。當(dāng)節(jié)后完整的一幅圖像后,任務(wù)0把接收的圖像保存到SD中。接受端代碼如下:/*接收端主函數(shù)*/int main (void) OSInit();/初始化uC/OS-II,實時內(nèi)核OSTaskCreate(OS_TaskCreate, (void *)0, (OS_STK *)&OS_TaskCreate_Stk

44、128 - 1, 1);/啟動實時內(nèi)核前必須創(chuàng)建一個任務(wù) OSStart();/啟動操作系統(tǒng) return (0);/*接受端的任務(wù)App5_Task0完成圖像的接受和保存*/static OS_STK App5_Task0_Stk 1024 ;static void App5_Task0 (void *p_arg)unsigned int n = 0;while(OSTaskDelReq(30) != OS_ERR_TASK_NOT_EXIST)OSTimeDly(10);while(NRF24L01_Init(); NRF24L01_RxMode(NRF24L01_PLOAD_WIDTH_

45、20B, NRF24L01_Speed_2Mbps);(void)p_arg; while(OS_TRUE)Image_Receive();while(GUI_PrtScreen(Photog_pathn+);第一個函數(shù)是主函數(shù),初始化操作系統(tǒng),創(chuàng)建了任務(wù)App4_Task0、任務(wù)App4_Task1、任務(wù)App4_Task2,最后啟動系統(tǒng)。第二個函數(shù)是任務(wù)App5_Task0,初始化無線模塊后便開始等待數(shù)據(jù),當(dāng)有數(shù)據(jù)來臨便開始接收數(shù)據(jù),保存數(shù)據(jù)到SD卡。五, 系統(tǒng)實現(xiàn)本設(shè)計的操作系統(tǒng)和軟件程序的開發(fā)設(shè)計選擇在ARM MDK4.5開發(fā)環(huán)境下完成。ARM MDK前身是KeilC51,Keil公司

46、2005年由ARM公司收購,用于調(diào)試ARM7,ARM9,Cortex-M內(nèi)核。由于ARM MDK對ARM cortex-M處理器的良好支撐,對軟件代碼的高性能優(yōu)化和ARM MDK友好的人機(jī)交互界面和易于使用,ARM MDK被我選擇作為主要的開發(fā)工具,得到了良好的開發(fā)效率。本人初初接觸ARM時使用的開發(fā)環(huán)境是ADS1.2,由于MDK的編譯器是RVCT,ADS1.2是ARM很早的產(chǎn)品,因此,MDK整體性能要好于ADS1.2。實際使用中,MDK支持的ARM Core比ADS1.2多(ADS1.2支持ARM7、ARM9、ARM10,ARM10已經(jīng)被Inetl買斷成為XSCALE架構(gòu),目前市面上很少有ARM10的產(chǎn)品,可以忽略,可以說ADS1.2只支持ARM7和ARM9,而MDK支持ARM7、ARM9和Coretex-M/R)。MDK的調(diào)試功能也比ADS1.2強(qiáng)。綜上所述,ADS1.2無論從價格和性能都落后MDK。而RTOS原本開頭使用的是現(xiàn)今國產(chǎn)十分優(yōu)秀的開源免費

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論