ESP32 项目实践

闲着没事,看着B站的大佬们捣鼓各种玩意,看着心动,就也下了决心,开始学习下ESP32,准备复刻一些好玩的东西。
上月买了ESP32-CAM的开发板,ST7789驱动的1.14寸(240*135)液晶屏,开始折腾,准备做个小相机。

开始比较顺利,很快就跑通了项目两个例程。

1.esp32-web-camera
2.lv_port_esp32

之后想使用TFT 1.14寸的液晶屏做取景器,展示ov2640的图像,因为遇到了各种问题,所以尝试了方式

1.OV2640通过设置图像窗口直接输出(RGB565)240*135的图像

发现样例程序中输出的窗口并不是任意尺寸的,而是是一组枚举值,然后只好修改了几个文件后,硬是增加了240*135这样一个配置,勉强跑起来,但还是报错了,提示FB-SIZE: XXXXXX != XXXXXX。之后尝试了240*130,错误依旧,在240*128收敛,不再报错。

经过多次跟踪调试,发现OV2640在RGB565模式下,样例使用了DMA进行数据传输,但因为DMA缓存有限,一帧数据无法通过一次DMA传输完成,所以会通过多次DMA来完成,但对于非标准的尺寸,会丢失最后一次DMA数据,导致在一帧结束时,预计接受到的数据长度和实际接收到的数据长度不一致,所以提示错误,但该问题真正的原因并不知晓。

2.通过OV2640直接输出RGB565的1600*1200,然后自行按比例,进行缩放
该方式性能成问题,基本只有fps只能到2-3帧,随后测试,即使到400*296,也只能有几来帧的水平,对此表示了深深的诧异。

3.通过OV2640直接输出JPEG的1600*1200,然后通过jpg2rgb565,进行格式转化和缩放
该方式性能依然成问题,而且是不是的出现看门狗报错。

不得已,只好去研究样例的摄像头驱动代码(仅针对RGB565)
大致看明白,
1.初始化摄像头,根据摄像头的图像格式和窗口大小,计算并分配合适的DMA的大小
2.DMA完成时,会触发中断,将数据拷贝到fb缓冲区(为何要进行这部拷贝,是因为ESP32的DMA是2字节的,但OV2640的数据是单字节的)
3.摄像头的VSYNC信号,会触发帧中断,驱动会进行帧数据检查,看是否完整,如果不完整,会提示错误,在(1)中240*135出错提示,就来自这里。
4.完成一帧数据后,会将该帧数据send到队列中,供帧数据消费任务使用。

细节的地方,还是有许多没有看明白
1.DMA中断,代码中使用了I2S0全局变量,对变量进行设置就能实现中断,是合原理?
2.对于代码中采样模式,代表什么含义,完全摸不着头脑。
3.在不同CPU下,对DMA的处理方式也不相同,例如在ESP32S2中就没有采样方式的区别?