ST第一款支持CSI接口的MCU?利用STM32CubeMX驱动CSI/DCMIPP的BUG解决
去年末ST推出的STM32N657DK开发板中,它的摄像头比较特殊。

CSI是相机串行接口的简称和之前常用的类似Ov2640等SCCB接口的摄像头相比,CSI 接口支持高速数据传输,数据传输速度比 SCCB 快得多。例如,CSI 总线提供高达 1Gbps 的数据传输速度,而 SCCB 的数据传输速度相对较慢。具有更低的功耗,采用串行传输方式,减少了信号线的数量,从而降低了功耗。具有更低的功耗,因为它们采用串行传输方式,减少了信号线的数量,从而降低了功耗。
而STM32N6是ST的MCU中第一款支持CSI的单片机,在此之前CSI接口为STM32MP系列独有。

这里我要吐槽一下CubeMX在N6中的各种Bug。首先是RIF的BUG,作为防止用户异常访问的防火墙机制,在N6推出时,CubeMX中并没有直接的RIF选项,需要在搜索框中搜索RIF才可以打开RIF配置,否则在使用摄像头和LCD显示屏的时候就会触发内容保护。

新版本的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了。

导入上述几个文件(包括几个.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的内存保护。


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!