1、前言
去年末ST推出的STM32N657DK开发板中,它的摄像头比较特殊。
CSI是相机串行接口的简称和之前常用的类似Ov2640等SCCB接口的摄像头相比,CSI 接口支持高速数据传输,数据传输速度比 SCCB 快得多。例如,CSI 总线提供高达 1Gbps 的数据传输速度,而 SCCB 的数据传输速度相对较慢。具有更低的功耗,采用串行传输方式,减少了信号线的数量,从而降低了功耗。具有更低的功耗,因为它们采用串行传输方式,减少了信号线的数量,从而降低了功耗。
而STM32N6是ST的MCU中第一款支持CSI的单片机,在此之前CSI接口为STM32MP系列独有。
2、CubeMX在N6使用中的BUG
这里我要吐槽一下CubeMX在N6中的各种Bug。首先是RIF的BUG,作为防止用户异常访问的防火墙机制,在N6推出时,CubeMX中并没有直接的RIF选项,需要在搜索框中搜索RIF才可以打开RIF配置,否则在使用摄像头和LCD显示屏的时候就会触发内容保护。
不过今天发现CubeMX可以更新了,而官方的STM32N6的库也更新到了1.1版本。
新版本的CubeMX完善了这个Bug,可以直接配置RIF选项。
其次是CSI和DCMIPP的BUG,而这个BUG是妨碍摄像头使用的最大BUG。
CSI在配置完后,启动CubeMX生成代码的时候会发现CSI的内容没有填充,而DCMIPP的配置则会缺少很多很多的内容。
为了解决这个问题,只能从ST的官方库的例程找到CSI和DCMIPP配置。
直接CV官方的CSI和DCMIPP的配置参数,写入配置。
然后可能是由于CSI的问题,导致时钟树中的IC18是被禁用的。
这里为什么要强调一下IC18呢,因为IC18提供CSI的时钟源。
CSI的时钟源只能由IC18提供,这里并不能配置CSI的IC18,这里也有可能是因为CSI的BUG导致。
而且DCMIPP的主时钟应该和CSI的主时钟相同,因此解决的问题还得包括解决CSI的时钟问题。
官方的例程中对DCMIPP的配置是将其配置为300MHZ,经典配置是333MHZ,这点和手册中描述的一致。
对CSI的时钟配置是由PLL1引入,将其60分频。而上面配置DCMIPP的时候PLL1为1200MHZ,因此CSI的主频是1200/60 = 20MHZ。
当然别忘记了开启CSI的时钟总线使能,这样子就能够解决CubeMX关于CSI和DCMIPP的BUG了。
3、移植驱动
解决掉上述问题之后,找到ST的BSP支持包
导入上述几个文件(包括几个.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即可,当然这里还要启动LTDC以便于LCD显示屏启动还有接触LTDC和DCMIPP的内存保护。
1793
