姜艷茹,孟令軍,尚椏朝,李 巖
(中北大學 儀器與電子學院,太原030051)
近年來芯片制造工藝和技術不斷提升,微控制器的性能越來越強、功耗越來越低,進一步促進了嵌入式技術的發展[1]。隨著網絡的迅猛發展,具有網絡功能的嵌入式設備擁有更高的使用價值和更強的通用性。網絡數據傳輸具有傳輸數據保密性高、抗電磁干擾能力極強、傳輸數據容量大、硬件開銷小等自身優勢[2],滿足視頻傳輸的要求,廣泛應用于智能家居、工業控制、安防及城市交通管理等領域。
文獻[3]提出一種基于GPRS 的實時圖像傳輸方法,該系統將傳感器技術、GPRS 技術以及嵌入式技術集成,對硬件設備和服務器終端進行了詳細的概述。該系統雖然效率較高,但是實現的過程比較繁瑣。文獻[4]提出一種基于樹莓派的無線WiFi 傳輸方法,對系統實現的關鍵技術進行分析,在原有的視頻流傳輸方法的基礎上進行了改進,最后對系統測試進行討論。該方法圖像傳輸的實時性好,但是系統設計成本略高。
本文針對上述產生的問題,設計了一款基于STM32 的圖像采集與網絡傳輸系統,以STM32F429為主控芯片,UCOS-II 操作系統為基礎,采用LwIP協議棧作為客戶端與服務器的通信協議,提高系統性能。該設計不僅開發成本低、可以連接網絡,還具有可移植性強和可維護性好的特點,可為網絡圖像傳輸或其他相關系統的開發提供一種參考方式。
本系統的設計思路為以Cortex-M4 為內核的STM32F429 作為控制核心,利用OV2640 作為圖像采集模塊,與STM32F429 的數字攝像頭(DCMI)接口連接接收圖像數據[5],然后通過直接存儲器訪問(DMA)外設傳輸圖像數據到內部SRAM,再利用可變存儲控制器(FMC)外設把數據拷貝到外部SDRAM緩存,以太網(ETH)外設與外部芯片LAN8720A 以RMII 接口連接,進行數據傳輸。通過LwIP 協議棧實現開發板與PC 端間網絡通信,把圖像數據從SDRAM 傳輸到PC 端,PC 端將數據解碼實時顯示出來。系統結構框圖如圖1 所示。

圖1 系統結構框圖Fig.1 System structure block diagram
OV2640 是由OV 公司生產的一款CMOS 類型數字圖像傳感器,該傳感器支持輸出最大為200 萬像素的圖像(1600×1200 分辨率),自帶壓縮引擎,可以直接輸出壓縮后的JPEG 數據,使得在保證圖像質量的前提下,盡可能減少圖像數據的大小[6],減少圖像的傳輸時間。OV2640 攝像頭電路如圖2 所示,24 MHz 有源晶振為OV2640 提供系統時鐘,穩壓芯片為OV2640 提供所需的穩定電壓。

圖2 OV2640 攝像頭電路Fig.2 OV2640 camera circuit
STM32F429 與OV2640 以DCMI 接口連接。STM32F429 首先通過SCCB 接口的SCL 和SDA 配置OV2640 的寄存器進行初始化。數據采集時使用8 根數據線,通過設置DCMI_CR 寄存器的EDM[1:0]=00,使得D[0:7]有效,使用HSYNC 和HREF作為同步信號。當輸出JPEG 格式數據時,PCLK 的數目大大減少,且不連續,數據以0XFF,0XD8 開頭,0XFF,0XD9 結尾[7]。
本系統將SDRAM 作為外部存儲器,將圖像數據暫存到SDRAM,然后通過網絡發送到PC 端。STM32F429 利用FMC 外設來驅動SDRAM 這樣的動態存儲器,連接電路如圖3 所示,主要是地址線和數據線。V

圖3 SDRAM 連接圖Fig.3 SDRAM connection diagram
SDRAM 上電后先進行初始化,初始化完成后,通過映射的地址直接訪問SDRAM,地址范圍為0xC0000000-0xDFFFFFFF。在程序中,定義一個指向上述地址的指針,當需要對該存儲單元讀寫時通過指針直接訪問,FMC 外設會自動完成數據讀寫過程,無需其他操作。
以太網接口電路如圖4 所示,STM32F429 通過RMII 接口與外部芯片LAN8720A 連接,以實現介質訪問控制層與物理層的數據傳輸。LAN8720A 芯片引腳數目少,擁有1.2 V 內置穩壓源,是低功耗10/100 M以太網物理收發器[8]。
RMII 接口方式在保持物理層器件現有特性的前提下減少了PHY 的連接引腳[9],引腳如下。RMII_REF_CLK 為50 MHz 參考時鐘信號,LAN8720A內部集成PLL,可將25 MHz 時鐘源倍頻到50 MHz并指定到該引腳;RMII_CRS_DV 為偵聽載波信號與接收數據有效信號的整合信號,由LAN8720A 驅動;RMII_TXD[1:0]和RMII_RXD[1:0]為發送接收數據線。ETH_MDIO 和ETH_MDC 組成MAC 內核訪問PHY 寄存器的標志接口,向寄存器寫入數據或讀取狀態,最大通信頻率為2.5 MHz。數據幀格式如表1 所示,第一個PADDR 用于指定PHY 地址,第二個RADDR 用于指定PHY 寄存器地址,TA 為狀態轉換域,數據段有16 位,對應PHY 寄存器每個位,先發送或接收到的位對應以太網MAC MII 數據寄存器(ETH_MACMIIDR)寄存器的位15。

圖4 以太網接口電路Fig.4 Ethernet interface circuit

表1 數據幀格式Tab.1 Data frame format
本系統軟件部分以UCOS-II 操作系統為基礎,移植了LwIP 協議棧,在系統的調度下,初始化OV2640,采集圖像數據,使用DMA 雙緩存機制接收圖像數據到SRAM,再通過地址訪問寫入外部SDRAM,利用LwIP 協議棧,實現STM32F429 與PC 端之間網絡通信,把圖像數據上傳到PC 客戶端顯示[10]。UCOS-II操作系統是一個可固化、可移植、可剪裁的占先式實時多任務內核,特別適合于微處理器和控制器[11]。將UCOS-II 操作系統移植進STM32F429,進行裁減配置,使之能夠正常運行。
STM32F429 接收數據時采用DMA 雙緩沖機制。OV2640 攝像頭與DCMI 接口連接,通過數據線D[0:7]傳輸JPEG 數據流,然后通過DMA 進行傳輸。DCMI_CR 寄存器中的CAPTURE 位置1 時,激活DMA 接口。netcam_blk_buf0(內存1)和netcam_blk_buf1(內存2)作為DMA 的兩個緩沖區,大小為NETCAM_BLK_SIZE*4 個字節,交替存儲JPEG 數據流,如圖5 所示。netcam_blk_buf0 和netcam_blk_buf1 所指向的內存,必須是內部內存,程序中利用內存管理為這兩個指針在內部SRAM 中分配內存。

圖5 DMA 雙緩存接收流程Fig.5 DMA double buffer receiving process
考慮到網絡速度可能會跟不上攝像頭的數據輸出速度,導致圖片顯示錯誤。針對此問題,本系統將數據先放在指針數組netcambuf 中,大小為NETCAM_BUF_NUM 個緩沖區,每個緩沖區NETCAM_BLK_SIZE*4 個字節,利用readdpos 和writedpos 記錄當前的讀寫位置,如圖6 所示。netcambuf 利用內存分配函數為其在外部SDRAM 中分配內存。DMA傳輸完成中斷后,在中斷函數中將netcam_blk_buf 里面的數據,存儲到netcambuf 里。然后ETH 外設將netcambuf 里的數據通過RMII 接口的發送數據線傳輸給LAN8720A,最后通過網口傳輸數據到PC 端。

圖6 指針數組cambufFig.6 Pointer array cambuf
UCOS-II 只是一個實時的任務調度及通信內核,缺少對網絡協議的支持,需要將LwIP 移植到UCOS-II 上,使其支持網絡功能[12]。LwIP 是一個小型的網絡協議棧,使用靈活,提供了多種常用的的協議,這些功能可以通過lwippopts.h 中的宏定義來決定功能的啟用或者禁用[13]。LwIP 在UCOS-II 系統中的結構如圖7 所示。應用程序層采用標準netconn接口函數與上層交互;硬件驅動層根據驅動不同實現函數編寫,是移植LwIP 的重點。移植時跟硬件密切相關的為以下三個函數:Low_level_init()函數主要完成實際對硬件的初始化設置;Low_level_output()函數用于發送數據,將LwIP 協議棧Pbuf 緩沖區中的數據拷貝到DMA 發送數據緩存區,通過網卡發送出去;Low_level_input()函數用于接收數據,從網卡中提取數據,將DMA 緩沖區中數據拷貝到Pbuf結構體中,然后將Pbuf 返回[14]。

圖7 LwIP 在UCOS-II 系統中的結構Fig.7 Structure of LwIP in UCOS-II system
本系統采用LwIP 作為STM32F429 與PC 端上位機通訊的協議,移植時,NO_SYS 設置為0,使用UCOS 操作系統,這有利于提高整體性能。同時使用NETCONN 的TCP 接口方式,在頭文件中把LWIP_NETCONN 與LWIP_TCP 設置為1,從而啟動TCP協議。STM32F429 作為服務器,PC 端作為客戶端,傳輸流程如圖8 所示。用戶可以用網線連接路由器,或者直接用網線連接電腦的網口。上位機界面配置好端口和地址點擊連接,連接成功,即可發送數據流到PC 端上位機顯示。

圖8 網絡傳輸流程Fig.8 Network transmission flow chart
本系統的整體運行順序如圖9 所示,系統啟動后,初始化LwIP,包括:初始化LAN8720A、申請內存、添加并打開網卡,然后初始化UCOS 操作系統,創建兩個任務:圖像采集傳輸任務、DHCP 處理任務。

圖9 主程序流程Fig.9 Main program flow chart
圖像采集任務中,初始化OV2640,通過SCCB總線配置內部寄存器使其輸出JPEG 格式的圖像數據,等待主機連接,連接成功,啟動數據傳輸,發送數據到PC 端,之后若是斷開連接,釋放內存,關閉傳輸。DHCP 處理任務中,開啟DHCP 服務,然后等待DHCP 獲取IP 成功,如果DHCP 獲取失敗,將使用靜態IP(固定為:192.168.1.20),端口號固定為:8088,最后將IP 信息打印到串口顯示。然后把任務交由任務管理器,由任務調度管理,這樣便可實現在不同的任務之間來回調度,實現多任務同時進行[15]。
系統連接成功,編譯程序下載到開發版,用網線連接開發板與電腦,電腦端IP 設置為與開發板IP 在同一網段,采用Windows 的ping 指令進行網絡測試,檢測通訊是否正常及丟包率情況,測試結果如圖10 所示,網絡功能正常。網絡測試正常后,在PC 端的上位機界面輸入串口顯示的服務器IP 地址和端口號,點擊啟動,就會顯示采集到的圖像,如圖11 所示。實測最大可以傳輸1600×1200 的圖像,幀率15 fps 左右,傳輸平均速率達到2 Mbit/s,視頻流暢,運行穩定。

圖10 網絡測試結果Fig.10 Network test results

圖11 圖像顯示Fig.11 Image display
本文基于STM32F429、OV2640 及LAN8720A等硬件設計實現了一款圖像采集與網絡傳輸系統,分析了系統的硬件和軟件設計,并通過圖像顯示結果很好的驗證了系統的性能。該系統功耗低、體積小巧、性能穩定可靠、成本低廉,還可以用于構成復雜的傳輸網絡,同時具有良好的可移植性和可維護性,對多種視頻傳輸等更多領域的應用與研究具有很好的價值。