STM32F429之DCMI 数字相机接口
嵌入式系列文章
參考:《STM32F429_DM00031020_ENV19.pdf》
本文目的:翻譯STM32F429的PRM,深入理解DCMI接口的工作原理,最后將DCMI工作原理轉換成驅動代碼。
DCMI:Digital camera interface,數字攝像頭接口
15.1 介紹
數字攝像頭接口是一種同步并行的接口,可以從外部8位、10位、12位或14位寬的CMOS攝像頭模組獲取高速數據流。支持不同的數據格式:YCbCr4:2:2/RGB565漸進式視頻和壓縮的數據(JPEG)。
這個接口用于黑白相機、X24和X5相機(24倍變焦和5倍變焦?),并且假設所有預處理(如調整大小)都在相機模塊中執行。
15.2 DCMI主要功能
· 8-,10-,12-,或 14-位并行接口;
· 內嵌式或硬線式的行和幀同步;
· 連續或快照模式;
· 裁剪功能;
· 支持下面的數據格式:
– 8/10/12/14位漸進式視頻:黑白單色或原始格式.raw原始格式.raw原始格式.raw
– YCbCr 4:2:2YCbCr 4:2:2YCbCr 4:2:2漸進式視頻(漸進式progressive,翻譯成“逐行掃描”更合適,與interlace隔行掃描相對應)
– RGB 565漸進式視頻
– 壓縮數據:JPEG
15.3 DCMI針腳
全部是輸入引腳。
15.4 DCMI時鐘
DCMI時鐘2個時鐘域:像素時鐘PIXCLK和模塊時鐘HCLK。在信號穩定后,跟隨PIXCLK產生的信號在HCLK的上升沿被采樣。HCLK域會產生一個使能信號,用于指示來自相機的數據已經穩定且能被采樣。PIXCLK的最小周期必須大于2.5倍的HCLK的周期。
備注:
根據STM32的時鐘樹,假設HCLK配置成180MHz,那么PIXCLK最大的頻率不能超過180/2.5=72MHz,對某些相機接口來說,這個頻率最大只能采集720p的圖像。
15.5 DCMI功能概覽
DCMI是一個同步并行接口,可以接收高速(最大可達54MByte/s)數據流。包括高達14根數據線(D13-D0)和一根像素時鐘線。像素時鐘線極性可編程,這樣數據可以在像素時鐘的上升沿或下降沿進行捕獲。
數據被傳送到一個32位的數據寄存器中(DCMI_DR),然后通過通用的DMA通道進行傳輸。圖像緩存由DMA來管理,而不是DCMI接口來管理。
接收到的數據可以組織成行/幀(YUV/RGB/raw模式)或可以是JPEG圖像序列。要使能JPEG圖片接收,必須設置JPEG位(DCMI_CR寄存器的bit3)。
數據流可以使用HSYNC(水平同步)和VSYNC(垂直同步)這種硬線方式,也可以使用內嵌到數據流中的同步碼的方式進行同步。
下圖是DCMI模塊框圖:
下圖是DCMI模塊頂層視圖:
15.5.1 DMA接口
當DCMI_CR寄存器中的CAPTURE位被設置時,DMA接口就會被激活。每次DCMI接收到32位的數據時就會產生一次DMA請求。
15.5.2 DCMI物理接口
接口包含11/13/15/17根輸入線(分別對應8/10/12/14位寬),只支持從設備模式。
接口的位寬取決于DCMI_CR寄存器的EDM[1:0]位。如果位寬小于14,則沒使用的數據引腳則不能被復用為DCMI接口。
數據由PIXCLK進行同步,并且根據極性配置,在像素時鐘的上升或下降沿進行改變。(備注:數據的改變由PIXCLK來驅動,DCMI內的數據采樣是HCLK的上升沿)
HSYNC表示行數據的開始和結束;
VSYNC表示幀數據的開始和結束;
下圖是DCMI 信號的時序圖:
1、圖中捕獲沿是PIXCLK的下降沿,HSYNC和VSYNC的激活狀態是1。
1、HSYNC和VSYNC可以同時改變。
● 8位數據
當DCMI_CR中的EDM[1:0]配置為00,則接口從輸入接口D[0:7]中捕獲8位LSB數據,并把它們存儲為8位數據,而D[13:8]就被忽略。這樣獲取32位的數據需要4個像素時鐘周期。
最先捕獲的數據放在32位數據的低地址處,而第4次捕獲到的數據放在高地址處,如下圖所示:
● 10位數據
當DCMI_CR中的EDM[1:0]配置為01,則DCMI從輸入引腳D[0…9]獲取10位數據存入16位數據的低10位。剩下的高位(DCMI_CR的bit11~15)配置為0。這樣32位數據需要2個像素時鐘周期可填滿。
存放方法同樣是先來的數據存放在低地址處,如下圖所示:
12bit和14位同理。
15.5.3 同步
DCMI接口支持內嵌碼或硬線(HSYNC和VSYNC)同步。在使用內嵌碼同步時,數字攝像頭模塊必須保證0x00和0xFF只用于同步,而不是數據。內嵌碼同步模式僅支持8位并行數據寬度(這樣,DCMI_CR寄存器的EDM[1:0]位必須要清零)。
對于壓縮的數據,DCMI只支持硬線同步模式。這樣VSYNC作為圖像的開始/結束,而HSYNC作為數據有效的信號。下圖是JPEG的時序圖:
● 硬線同步模式
在硬線同步模式下,使用了兩個同步信號(HSYNC和VSYNC)。
根據相機模組,數據會在水平/垂直同步期間傳輸。HSYNC/VSYNC 信號的作用類似于消隱信號,因為在 HSYNC/VSYNC 有效期間接收到的所有數據都將被忽略。(備注:HSYNC/VSYNC有效期間應該是指作為消隱信號時的有效期間)
為了正確地將圖片傳入DMA/RAM的緩存,數據需要在VSYNC信號的同步下進行傳輸。當使用硬線同步模式,且使能捕獲(設置DCMI_CR的CAPTURE位),則數據傳輸由VSYNC的非激活狀態(下一幀的開始)進行同步。
傳輸可以連續地,通過使用DMA將連續的幀傳輸到連續的緩存區或相同/循環的緩存區中。為了允許DMA管理連續的幀,VSIF(垂直同步中斷標志)會在每幀結尾進行激活。
● 內嵌碼同步模式
在這種同步模式下,數據流使用嵌入在數據流中的 32 位代碼進行同步。 這些代碼使用數據中不再使用的 0x00/0xFF 值。 有 4 種類型的代碼,均采用 0xFF0000XY 格式。 嵌入式同步代碼僅在 8 位并行數據寬度捕獲中受支持(在 DCMI_CR 寄存器中,EDM[1:0] 位應編程為“00”)。 對于其他數據寬度,此模式會產生不可預知的結果,不得使用。
注意:相機模塊可以有 8 個這樣的代碼(在交錯模式下)。 出于這個原因,相機接口不支持交錯模式(否則每隔半幀就會被丟棄)。
· 模式2
四個嵌入代碼表示以下事件
– 幀開始:Frame start (FS)
– 幀結束:Frame end (FE)
– 行開始:Line start (LS)
– 行結束:Line end (LE)
四個代碼的 0xFF0000XY 格式的 XY 值是可編程的(參見第 15.8.7 節:DCMI 嵌入式同步代碼寄存器(DCMI_ESCR))。
[備注]:DCMI_ESCR寄存器:
`DCMI_ESCR寄存器
FEC:Frame end delimiter code,幀結束分隔代碼
該字節指定幀結束分隔符的代碼。 代碼由 0xFF、0x00、0x00、FEC 形式的 4 個字節組成。如果 FEC 編程為 0xFF,則所有未使用的代碼 (0xFF0000XY)解釋為幀結束分隔符。
LEC: Line end delimiter code,行結束分隔代碼
該字節指定行尾分隔符的代碼。 該代碼由 0xFF、0x00、0x00、LEC 形式的 4 個字節組成。
LSC: Line start delimiter code,行開始分隔代碼
該字節指定行起始分隔符的代碼。 該代碼由 4 個字節組成,形式為 0xFF、0x00、0x00、LSC。
FSC: Frame start delimiter code,幀起始分隔代碼
如果 FSC 編程為 0xFF,則不會檢測到幀起始分隔符。 但是,FEC 代碼之后第一次出現的 LSC 將被解釋為幀分隔符的開始。
0xFF被編程為“幀結束” ,意味著所有未使用的代碼都被解釋為有效的幀結束代碼。
在此模式下,一旦啟用了相機接口,幀捕獲在第一次出現幀結束 (FE) 代碼后開始,然后是幀開始 (FS) 代碼。
· 模式1
另一種編碼是相機模式 1。此模式與 ITU656 兼容。 這些代碼標志著另一組事件:
– SAV(活動行)- 行開始
– EAV(活動行)- 行結束
– SAV(消隱)- 幀間消隱期間的行尾
– EAV(消隱) - 幀間消隱期間的行尾
通過編寫以下代碼可以支持此模式:
? FS ≤ 0xFF
? FE ≤ 0xFF
? LS ≤ SAV (active)
? LE ≤ EAV (active)
還為幀/行開始和幀/行結束代碼實現了嵌入的非屏蔽碼。 使用它,可以僅將選定的未屏蔽位與編程代碼進行比較。 因此,您可以在嵌入代碼中選擇一個位進行比較并檢測幀/行開始或幀/行結束。 這意味著幀/行開始和幀/行結束可以有不同的代碼,但未屏蔽的位保持相同。
例如:
FS = 0xA5
FS的非屏蔽碼是0x10
在這種情況下,幀起始碼嵌入在幀起始碼的第 4 位。
備注:非屏蔽碼位取0表示屏蔽,1表示未屏蔽,通過屏蔽碼,可以選擇某個位作為同步信號,而被屏蔽的位可以取其他的值。對STM32來說,只關注未屏蔽未,只要未屏蔽位出現同步信號就會進行同步。
15.5.4 捕獲模式
DCMI接口支持2種捕獲模式:快照模式(單幀)和連續抓取。
● 快照模式(單幀)
在這種模式下,可以捕獲到一個單幀(DMCI_CR寄存器中的CM=1)。在DCMI_CR的CAPTURE位被置位,在采樣數據之前,DCMI接口要等待檢測到一個幀啟動信號。在完成第一幀的數據接收后,DCMI會自動除能(CAPTURE位被清零)。如果使能了中斷則此時會產生一個中斷。
當發生超限事件(overrun),則幀被丟棄,并且CAPTURE位被清零。快照模式下的時序圖如下圖所示:
這里HSYNC和VSYNC的激活狀態都是1,這兩個信號可以同時變更狀態。
● 連續抓取模式
在這種模式下(DCMI_CR的CM位為0),一旦DCMI_CR中的CAPTURE位被設置,則抓取程序會在下一個VSYNC信號或內嵌碼模式下的幀開始FS信號到來后啟動。該進程會一直持續直到CAPTURE位被清零。 一旦CAPTURE位被清零,抓取進程會持續到當前幀結束。
在連續抓取模式下,你可以配置DCMI_CR寄存器中的FCRC位來抓取所有圖像、每兩幀抓一幀,或每四幀抓一幀,來減少幀的捕獲率。
注意:在硬線同步模式下(DCMI_CR的ESS=0),IT_VSYNC中斷依然會在CAPTURE=0時產生,所以,為了減少幀率,IT_VSYNC中斷可以用來累計兩次捕獲的幀數,并且和快照模式結合起來用。這在內嵌碼模式下是不允許的。
15.5.5 裁剪功能
使用裁剪功能,DCMI接口可以在接收到的圖片中選取一個矩形窗。起點(左上角)坐標和大小(水平維度是像素時鐘個數,而垂直維度是行數)由兩個32位的寄存器(DCMI_CWSTRT和DCMI_CWSIZE)來指定。窗口的大小水平維度是像素時鐘的個數,垂直維度是行數。
這些寄存器指定了捕獲窗口的起始坐標,一個是行數(在一幀中是從0開始),一個是像素時鐘數(在一行中是從0開始),還指定了窗口的大小,即行數和像素時鐘數。DCMI_CSIZE中的CAPCNT值只能是4的倍數,這樣才能正確地使用DMA進行傳傳輸。
如果VSYNC在DCMI_CSIZE寄存器中的行數到達之前被激活,則捕獲停止且IT_FRAME中斷產生。
15.5.6 JPEG格式
為了允許JPEG格式圖像的接收,需要設置DCMI_CR寄存器中的JPEG位。JPEG圖片不是以行和幀的格式存儲,所以VSYNC作為捕獲的起始信號,而HSYNC作為數據使能信號。一行的數據字節數不一定是4的倍數,所以你需要小心處理這種情況,因為一個DMA請求是每次完成32位數據傳輸才會產生的。如果檢測到了幀結束,但是32位數據沒完全傳輸完,則剩下的數據會是0,而且產生DMA請求。
裁剪功能和內嵌碼同步碼不支持在JPEG格式下使用。
15.5.7 FIFO
一個四字的FIFO用來管理傳輸到AHB總線上的數據率。DCMI接口具備一個簡單的FIFO控制器,每次從AHB接口讀的時候增加讀指針,每次往FIFO中寫數據的時候增加寫指針。這里沒有過載保護以防止數據被寫覆蓋,如果AHB接口不支持該數據傳輸率的話。
一旦產生過載或同步信號的錯誤,則FIFO會被復位,并且DCMI等待新的幀啟動信號。
15.6 數據格式描述
15.6.1 數據格式
支持三種類型的數據:
● 8位的漸進視頻;
● YCbCr 422
● RGB565
壓縮數據:JPEG
對黑白數據、YUV、RGB數據來說,最大輸入尺寸是2048*2048。JPEG格式下沒限制。
對于單色、RGB 和 YCbCr,幀緩沖區以光柵模式存儲。使用32bit的數據寬度。只支持小端模式。下圖是像素光柵掃描順序。
15.6.2 單色格式
特點:
● 光柵格式
● 每個像素8位
下圖展示了這種數據的存儲方式:
15.6.3 RGB格式
特點:
● 光柵格式
● RGB
● 交錯的:一個緩存中RGB交錯,BRGBRGBRG等
● 針對顯示輸出進行了優化
RGB 平面格式與標準 OS 幀緩沖區顯示格式兼容。只支持16BPP(bits per pixel),每32位數據2個像素。24BPP和灰度格式不支持。像素以光柵掃描順序存儲,即像素行從上到下,像素行內從左到右。 像素分量是 R(紅色)、G(綠色)和 B(藍色)。 所有組件都具有相同的空間分辨率(4:4:4 格式)。 一幀存儲在一個單獨的部分中,組件以像素為基礎交錯。下圖是RGB565的存儲格式:
15.6.4 YCbCr格式
特點:
● 光柵格式
● YCbCr 422
● 交錯:一個緩存中,Y,Cb和Cr交錯。
像素分量是 Y(亮度或“亮度”)、Cb 和 Cr(色度或“色度”藍色和紅色)。 每個分量都以 8 位編碼。 亮度和色度存儲在一起(交錯),如下圖 所示。
15.7 DCMI中斷
產生五個中斷。所有中斷都可以被軟件屏蔽。全局中斷(IT_DCMI)是所有單個中斷的邏輯或。下圖是所有中斷的列表。
15.8 寄存器描述
【未完待續】
總結
以上是生活随笔為你收集整理的STM32F429之DCMI 数字相机接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CompoundButton(check
- 下一篇: JAVA连接SQL server2000