喬 亮,王建軍
(1.中國人民解放軍94362部隊,山東 青島266100;2.昆明理工大學(xué)機電工程學(xué)院,云南 昆明650500)
攝像頭作為一種圖像采集傳感器,被廣泛運用在工業(yè)機器人、車載導(dǎo)航儀等智能儀器上面,控制系統(tǒng)通過其采集周圍環(huán)境的圖像信號以便于控制系統(tǒng)控制儀器做出相應(yīng)的判斷。攝像頭分為模擬攝像頭和數(shù)字攝像頭2種。由于數(shù)字攝像頭數(shù)據(jù)量過大,單片機用傳統(tǒng)方法采集會占用大量的CPU資源,這將導(dǎo)致單片機的控制效果大為減弱。此外,數(shù)字攝像頭圖像信號輸出非???,單片機在處理過程中采集很有可能丟失數(shù)據(jù),從而影響整個控制系統(tǒng)的性能。
DMA(direct memory access)技術(shù)是指一種高速的數(shù)據(jù)傳輸操作,允許在外部設(shè)備和存儲器之間直接讀寫數(shù)據(jù),既不通過CPU,也不需要CPU干預(yù)。整個數(shù)據(jù)傳輸操作在DMA控制器的控制下進行。CPU只需在開始時刻配置DMA內(nèi)部寄存器參數(shù),且在每次數(shù)據(jù)傳輸開始和結(jié)束時做一點處理,而在傳輸過程中不用CPU干預(yù)。因此,利用DMA技術(shù)直接將圖像數(shù)據(jù)寫入單片機內(nèi)存空間,CPU需要圖像信息時只需從內(nèi)存空間中調(diào)用。這樣將大大地解放CPU資源,單片機CPU可以有更多的時間處理其他外部事件。從而極大地提高了控制系統(tǒng)的工作效率。
MK60的DMA模塊主要由通道復(fù)用管理模塊和DMA控制模塊組成,通道復(fù)用管理模塊主要負責(zé)將MK60的16個DMA通道分配給63個DMA請求源[1-3];DMA管理模塊主要負責(zé)屬性配置和一些基本功能的管理。MK60的DMA模塊有63個DMA請求源。當DMA模塊被使能之后,只要1個DMA請求信號產(chǎn)生,DMA模塊就不斷地從源地址內(nèi)存空間中取出數(shù)據(jù),將其送入目的地址內(nèi)存空間。要將數(shù)據(jù)準確地送入預(yù)期的地址,就需要對DMA模塊進行正確的初始化配置。DMA模塊配置過程主要對DMA通道選擇、DMA請求源、DMA周期觸發(fā)功能、每次讀入字節(jié)數(shù)、源地址數(shù)據(jù)寬度、目的地址數(shù)據(jù)寬度、目的地址、源地址、主循環(huán)計數(shù)、副循環(huán)計數(shù)、源地址偏移、目的地址偏移以及DMA中斷等進行相關(guān)配置[1]。DMA通道選擇主要是從16個DMA通道中選擇1個作為當前數(shù)據(jù)的傳輸通道;DMA請求源是為當前所選DMA通道配置請求源,即當所配置的請求信號(上升沿或下降沿)產(chǎn)生時開始傳輸數(shù)據(jù);DMA周期觸發(fā)功能主要是決定DMA傳輸是定時觸發(fā)還是外部事件觸發(fā);每次讀入字節(jié)是配置DMA每次傳輸?shù)淖止?jié)數(shù);源地址數(shù)據(jù)寬度是指源地址內(nèi)存中所存儲的數(shù)據(jù)寬度(8位、16位、32位等);目的地址數(shù)據(jù)寬度是指目的地址內(nèi)存中所存儲的數(shù)據(jù)寬度(8位、16位、32位等);目的地址是指數(shù)據(jù)要被傳入的內(nèi)存地址;源地址是指數(shù)據(jù)取出的內(nèi)存地址;主循環(huán)計數(shù)和副循環(huán)計數(shù)相當于2層循環(huán)嵌套,其每執(zhí)行1次循環(huán)體完成1次DMA傳輸;源地址偏移和目的地址偏指每完成1次DMA傳輸后,源地址和目的地址的偏移量[2]。
對于OV7620攝像頭采集只需要關(guān)注場中斷信號VSYN、行中斷信號HREF和像素中斷信號PCLK。OV7620同步信號時序圖如圖1所示。像素同步信號PCLK為讀取有效像素值提供同步信號,高電平時輸出有效圖像數(shù)據(jù),若當前圖像窗口大小為320×240,則在VSYN 2個正脈沖之間有240個HREF的正脈沖,即240行;在每個HREF正脈沖期間有320個PCLK正脈沖,每個PCLK正脈沖下對應(yīng)1個點的圖像數(shù)據(jù),即每行320個像素。這就是VSYN、HREF、PCLK 3個同步信號之間的關(guān)系。
圖1 OV7620時序圖
MK60與OV7620攝像頭接線如圖2所示。由圖2可知,使用MK60的PORTA19作為場開始信號VSYN的檢測端口,使用PORTB6作為行開始信號的檢測端口,采用PORTE0作為像素同步信號的檢測端口。PORTD0~PORTD7作為8位圖像灰度數(shù)據(jù)接收端口。根據(jù)1.2節(jié)所述,要采集1場完整的圖像,就必須從檢測到場信號開始讀取圖像數(shù)據(jù),而1場圖像是由多行組成且每行又有多個像素點,要正確采集1場圖像,就必須要將采集到的數(shù)據(jù)對齊,但是DMA只負責(zé)數(shù)據(jù)的傳輸[3],因此,必須根據(jù)攝像頭的特征對DMA進行正確的初始化后,才能夠采集到正確的圖像。一種可以實現(xiàn)圖像采集的DMA初始化過程如圖3所示。
圖2 MK60與OV7620攝像頭接線圖
由圖3可知,DMA模塊通道選擇為CH0[4],攝像頭的像素同步信號PCLK與PORTE連接,當1個像素點數(shù)據(jù)產(chǎn)生后,PCLK產(chǎn)生上升沿跳變被PORTE捕捉到之后產(chǎn)生DMA請求,DMA得到請求之后開始傳輸當前像素點的灰度數(shù)據(jù)。由于DMA采集像素點由PCLK產(chǎn)生信號,因此禁止其周期觸發(fā)功能而采用外部觸發(fā)功能[4-5]。
圖3 DMA初始化流程
設(shè)定主循環(huán)計數(shù)為每1行的像素點個數(shù),即當行中斷產(chǎn)生之后DMA通道要傳輸?shù)臄?shù)據(jù)個數(shù),因此要設(shè)定為攝像頭每1行的數(shù)據(jù)點個數(shù)。次循環(huán)計數(shù)設(shè)為1,由于1個像素點數(shù)據(jù)為8位的數(shù)據(jù)寬度,DMA 1次可以傳輸完畢,不需要多次次循環(huán)。由于攝像頭的每1個灰度數(shù)據(jù)都從Y0~Y7接口送入 MK60的 GPIOD_PDIR寄存器[6],每次讀取源地址不變,所以設(shè)定源地址為GPIO_PDIR寄存器的首地址、源地址偏移量設(shè)定為0。目的地址為存儲圖像數(shù)據(jù)數(shù)組的首地址,由于1幅圖像有多個像素點組成的二維圖像,要采集到1場圖像,就要將每1個像素點的數(shù)據(jù)存入到1個數(shù)組里面,因此在每個像素點數(shù)據(jù)通過DMA傳輸完成之后,源地址必須偏移。而對于OV7620來說,1個像素點數(shù)據(jù)為8位數(shù)據(jù)寬度,因此源地址偏移量設(shè)定為1個字節(jié)[4]。
由圖1可知,場開始信號VSYN的下降沿與行開始信號HERF更接近,捕捉VSYN的下降沿更便于圖像對齊。而對于OV7620來說,每1個有效像素點是像素同步信號PCLK高電平時的數(shù)據(jù),而行開始信號HERF的上升沿與像素同步信號PCLK的上升沿對齊,因此捕捉HERF的上升沿便于圖像對齊,捕捉PCLK的上升沿之后,才能夠產(chǎn)生DMA請求來傳輸數(shù)據(jù)。所以根據(jù)圖2的接線圖來初始化MK60的端口,MK60端口初始化流程如圖4所示。其初始化過程為:使能PORTA端口時鐘,將其引腳功能定為GPIO功能,由于PORTA19用來捕捉VSYN的下降沿跳變,因此初始化為輸入、高電平狀態(tài);使能PORTB端口時鐘,將其引腳復(fù)用功能定義為GPIO功能,由于PORTB6用于捕捉HERF上升沿信號,因此初始化為輸入、低電平狀態(tài);使能PORTE端口時鐘,將其引腳復(fù)用功能定義為GPIO功能,由于PORTE0用來捕捉PCLK上升沿信號,因此初始化為輸入、高電平狀態(tài)。由于PORTD0~PORTD7用來采集攝像頭的數(shù)據(jù),因此初始化為GPIO功能、輸入,初始化為低電平[7]。
圖4 端口初始化流程
為了能夠準確地捕捉到場開始信號VSYN和行開始信號HREF,采用外部事件觸發(fā)端口中斷方式,PORTA19采集到VSYN產(chǎn)生的中斷信號之后,進入PORTA中斷服務(wù)函數(shù)。PORTA中斷服務(wù)函數(shù)流程如圖5所示。PORTA中斷產(chǎn)生后,在PORTA中斷服務(wù)函數(shù)中要重新加載DMA目的地址(圖像數(shù)組首地址),使攝像頭的第1個數(shù)據(jù)存入圖像數(shù)組第1個元素。由于當PORTA中斷產(chǎn)生之后代表場開始信號,而1場圖像有很多行組成,緊隨PORTA產(chǎn)生中斷之后產(chǎn)生的行開始信號HREF為該場圖像的第1行,因此要在程序進入場中斷之后立馬使能PORTB中斷,來捕捉行開始信號,此后每1個行開始信號都會進入PORTB中斷服務(wù)函數(shù)。
PORTB中斷服務(wù)函數(shù)流程如圖6所示。由于每1行有很多個像素點,在行開始信號HERF產(chǎn)生(進入行中斷)之后,代表此后每1個PCLK高電平時輸出的數(shù)據(jù)為該行相應(yīng)點的像素數(shù)據(jù),因此,在進入PORTB中斷服務(wù)函數(shù)之后立即使能DMA通道CH0請求,即每產(chǎn)生1個PCLK(PORTE0)上升沿信號DMA都進行1次數(shù)據(jù)傳輸,將相應(yīng)點的灰度數(shù)據(jù)送入到與之對應(yīng)的圖像數(shù)組元素中存儲。每1行采集完之后行采集計數(shù)自增1,當采集行數(shù)為1場圖像行數(shù)時,將場采集完成標志位置1,關(guān)場中斷回到主函數(shù)將采集到的圖像通過UART串口模塊[8]發(fā)送給上位機顯示,當串口發(fā)完1場圖像之后開PORTA中斷,開始采集新的1場圖像數(shù)據(jù)。
圖5 PORTA中斷服務(wù)流程
圖6 PORTB中斷服務(wù)流程
主函數(shù)流程如圖7所示。在MK60系統(tǒng)上電之后關(guān)閉系統(tǒng)總中斷,對端口進行初始化配置、對DMA模塊初始化配置,開PORTA中斷,開總中斷之后進入死循環(huán)函數(shù),等待圖像采集完成標志位置1,如果標志位置1說明1場圖像采集完成。為了避免下1場圖像對當前圖像產(chǎn)生干擾,要暫時關(guān)閉PORTA中斷,調(diào)用UART串口將采集到的圖像發(fā)送給上位機。當前圖形發(fā)送完成之后,開PORTA中斷采集新的圖像數(shù)據(jù)。
圖7 攝像頭數(shù)據(jù)采集系統(tǒng)流程
MK60通過其內(nèi)嵌的DMA模塊采集到的數(shù)據(jù),通過串口將數(shù)據(jù)發(fā)送給上位機,獲得的圖像如圖8所示。圖像效果較好,驗證了采集過程的正確性。
圖8 MK60采集到的圖像
攝像頭是一種應(yīng)用非常廣泛的傳感器,其圖像采集在工程測試、環(huán)境監(jiān)控等方面有著重要的意義。通過內(nèi)嵌有DMA模塊的MK60單片機,設(shè)計了一種DMA圖像采集系統(tǒng),該系統(tǒng)CPU基本不用干預(yù)就能完成攝像頭的圖像采集,使得CPU有更多時間去處理其他外部事件,從而極大地提高了單片機的工作能力和效率,對于工業(yè)應(yīng)用有一定應(yīng)用前景。
[1] Freescale.K60sub-family reference manual——K60 P144M100SF2V2RM rev.2[Z].2012.
[2] ARM.Cortex-M4technical reference manual revision r0p0[Z].2011.
[3] Freescale.K60sub-family data sheet rev.6[Z].2011.
[4] Freescale.Kinetis peripheral module quick reference rev.0[Z].2010.
[5] Freescale.K60sub-family reference manual rev.6[Z].2011.
[6] Yiu J.ARM Cortex-M3權(quán)威指南[M].宋巖,譯.北京:北京航空航天大學(xué)出版社,2009.
[7] 王宜懷,吳瑾,蔣銀珍.嵌入式系統(tǒng)原理與實踐——ARM Cortex-M4Kinetis微控制器[M].北京:電子工業(yè)出版社,2012.
[8] 楊東軒,王嵩.ARM Cortex-M4自學(xué)筆記——基于 Kinetis K60[M].北京:北京航空航天大學(xué)出版社,2013.