1、前言
去年末ST推出的STM32N657DK開發(fā)板中,它的攝像頭比較特殊。
CSI是相機(jī)串行接口的簡稱和之前常用的類似Ov2640等SCCB接口的攝像頭相比,CSI 接口支持高速數(shù)據(jù)傳輸,數(shù)據(jù)傳輸速度比 SCCB 快得多。例如,CSI 總線提供高達(dá) 1Gbps 的數(shù)據(jù)傳輸速度,而 SCCB 的數(shù)據(jù)傳輸速度相對較慢。具有更低的功耗,采用串行傳輸方式,減少了信號線的數(shù)量,從而降低了功耗。具有更低的功耗,因?yàn)樗鼈儾捎么袀鬏敺绞?,減少了信號線的數(shù)量,從而降低了功耗。
而STM32N6是ST的MCU中第一款支持CSI的單片機(jī),在此之前CSI接口為STM32MP系列獨(dú)有。
2、CubeMX在N6使用中的BUG
這里我要吐槽一下CubeMX在N6中的各種Bug。首先是RIF的BUG,作為防止用戶異常訪問的防火墻機(jī)制,在N6推出時,CubeMX中并沒有直接的RIF選項(xiàng),需要在搜索框中搜索RIF才可以打開RIF配置,否則在使用攝像頭和LCD顯示屏的時候就會觸發(fā)內(nèi)容保護(hù)。
不過今天發(fā)現(xiàn)CubeMX可以更新了,而官方的STM32N6的庫也更新到了1.1版本。
新版本的CubeMX完善了這個Bug,可以直接配置RIF選項(xiàng)。
其次是CSI和DCMIPP的BUG,而這個BUG是妨礙攝像頭使用的最大BUG。
CSI在配置完后,啟動CubeMX生成代碼的時候會發(fā)現(xiàn)CSI的內(nèi)容沒有填充,而DCMIPP的配置則會缺少很多很多的內(nèi)容。
為了解決這個問題,只能從ST的官方庫的例程找到CSI和DCMIPP配置。
直接CV官方的CSI和DCMIPP的配置參數(shù),寫入配置。
然后可能是由于CSI的問題,導(dǎo)致時鐘樹中的IC18是被禁用的。
這里為什么要強(qiáng)調(diào)一下IC18呢,因?yàn)镮C18提供CSI的時鐘源。
CSI的時鐘源只能由IC18提供,這里并不能配置CSI的IC18,這里也有可能是因?yàn)镃SI的BUG導(dǎo)致。
而且DCMIPP的主時鐘應(yīng)該和CSI的主時鐘相同,因此解決的問題還得包括解決CSI的時鐘問題。
官方的例程中對DCMIPP的配置是將其配置為300MHZ,經(jīng)典配置是333MHZ,這點(diǎn)和手冊中描述的一致。
對CSI的時鐘配置是由PLL1引入,將其60分頻。而上面配置DCMIPP的時候PLL1為1200MHZ,因此CSI的主頻是1200/60 = 20MHZ。
當(dāng)然別忘記了開啟CSI的時鐘總線使能,這樣子就能夠解決CubeMX關(guān)于CSI和DCMIPP的BUG了。
3、移植驅(qū)動
解決掉上述問題之后,找到ST的BSP支持包
導(dǎo)入上述幾個文件(包括幾個.h文件)
??IMX335_Probe(IMX335_R2592_1944,?IMX335_RAW_RGGB10);
??if?(HAL_DCMIPP_CSI_PIPE_Start(&hdcmipp,?DCMIPP_PIPE1,?DCMIPP_VIRTUAL_CHANNEL0?,?BUFFER_ADDRESS,?DCMIPP_MODE_CONTINUOUS) !=?HAL_OK)
? {
? ??Error_Handler();
? }
啟動DCMIPP即可,當(dāng)然這里還要啟動LTDC以便于LCD顯示屏啟動還有接觸LTDC和DCMIPP的內(nèi)存保護(hù)。