尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

TFT预览Camera Demo实战:从OV2640到ST7789的显示链路详解

TFT预览Camera Demo实战:从OV2640到ST7789的显示链路详解 我做过不少带屏的嵌入式项目但说实话像这种专门为了测屏而单独搭建的Camera demo工程很多人一开始会觉得小题大做。实际踩过坑才知道TFT预览这种功能看着简单里面全是细节——从摄像头模组的输出格式到MCU的DMA搬运再到屏幕的初始化时序和刷新策略任何一环没对出来的画面就是花屏、条纹、颜色发紫或者直接黑屏。这篇文章我想完整聊聊这个Camera demo project for testing TFT preview项目的搭建过程。我会从整体设计思路、关键配置、实际调试中遇到的问题这几个维度来展开把这个demo从立项到跑通的全过程拆开给你看。不管你是刚接触嵌入式显示还是被屏驱和摄像头驱动折腾得头疼的老手这篇文章里应该都有你能直接拿走用的东西。1. 项目整体设计与思路拆解这个demo项目的目标非常聚焦验证摄像头采集的画面能否在TFT屏幕上正确、流畅地显示出来。注意这里用的是testing说明这个工程的核心定位是验证和测试而不是直接做成最终产品。这意味着代码结构、调试接口、参数配置都要为快速定位问题服务。1.1 为什么需要独立的TFT预览测试工程很多项目习惯直接在正式产品的应用代码里调屏、调摄像头我一开始也这么干后来发现这是给自己挖坑。正式工程里往往带了GUI框架、业务逻辑、通信协议栈屏幕显示异常时你很难判断是摄像头配置错了还是GUI刷新逻辑有问题又或者是主板EMC干扰导致的数据错乱。单独拆一个demo工程出来好处非常明显环境隔离只保留摄像头、TFT屏、必要的电源和时钟配置问题出现时排查范围被压缩到最小。参数可快速迭代摄像头分辨率和TFT分辨率往往不一致需要反复测试缩放、裁剪、色彩格式转换的参数。在demo工程里改这些编译烧录几秒钟完成而大工程一次完整编译可能得等好几分钟。硬件验证前置PCB贴片回来后第一件事不是跑产品代码而是用这种demo工程验证摄像头通路和屏幕通路是否正常。相当于给硬件板卡做上电自检。这个工程从定位上就注定了它要有别于正式项目代码可以粗暴一点、冗余一点但日志和调试接口一定得齐全。1.2 数据链路全景图整个预览链路的本质是图像数据从CIS图像传感器到TFT屏幕的搬运过程。全链路拆开来看是这么几条线摄像头CIS模组RAW/RGB数据输出 → 主控DCMI/DVP接口并行采集 → DMA搬运到内存帧缓冲 → 图像格式处理缩放/裁剪/RGB转换 → SPI/RGB/LVDS接口 → TFT屏幕显示这里有个很容易被忽略的点摄像头输出的数据格式和屏需要的数据格式往往不相同。比如我常用的OV2640摄像头可以输出RGB565、RGB555、YUV422、JPEG等多种格式而TFT屏的控制芯片如ST7789、ILI9341接受的是RGB565或者RGB888的并行/串行数据。如果你在初始化摄像头时把输出格式设成了YUV422又没有做格式转换就直接丢给屏幕出来的画面会是奇怪的偏色或者灰度异常。在这个demo里我采用的是摄像头输出RGB565 主控直接转发到屏的架构。这是最省事、也最容易验证问题的方式——省掉了格式转换的开销帧率也能跑得更高。1.3 方案选型的取舍分析做这种测试demo工具选型上我建议遵循能用就行但必须能调速的策略。主控的选择上目前做的这个项目用的是国产HC32L072系列MCU。这颗芯片虽然主打低功耗但片上的DCMI接口Digital Camera Interface和DMA通道对这类应用完全够用。如果你用的是STM32F4/F7或者国产替代道理是相通的关键是确认以下几点是否有DCMI/DVP摄像头接口如果没有摄像头数据得用GPIO模拟并口采集帧率和稳定性都会打折扣。DMA通道是否足够摄像头数据进来是一个字节一个字节或者一个字一个字地进来没有DMA的话CPU中断会被打爆整个主循环就别想干别的了。RAM是否够放帧缓冲一个QVGA320x240的RGB565帧大小是320×240×2 150KB。这个尺寸放在MCU内部RAM里是有点压力的所以通常的做法是切割成多块缓存区域或者用DMA双缓冲机制。有些项目里会用外部SRAM或者SDRAM做帧缓冲但在这个测试demo里我建议不要引入外部存储器。原因很简单外部存储器的初始化、时序配置本身就增加变量一旦预览出问题你还要额外排查存储器这块反而违背了独立demo的初衷。屏幕驱动方式的选择也值得一提。这个demo用的是SPI接口的TFT彩屏控制芯片是ST7789。SPI接口的优势是占用引脚少走线方便适合验证缺点是刷新率上限受限于SPI时钟频率。如果是屏大的话比如320x240以上SPI方式刷新一帧需要的时间会比较可观最好还是上RGB并口或者RGBSPI混合模式。但测试预览用SPI屏完全够用关键是逻辑要跑通。2. 核心环节解析从寄存器配置到图像搬运这一部分是这个demo的体力活也是硬骨头。屏幕初始化、摄像头初始化、DMA搬运这三个环节任何一个配置错了现象都会很“精彩”。我按顺序拆开来讲。2.1 TFT屏幕初始化时序比命令更重要TFT屏的驱动芯片大多数是兼容的ST7789和ILI9341的初始化序列在网上能搜到一堆demo代码。但如果你直接抄过来用会发现屏幕可能白屏、黑屏、或者颜色错乱。这是因为每块屏的硬件设计偏置电压、背光电路、上下电时序不完全一样初始化序列里的某些寄存器需要微调。初始化时最容易出问题的是以下几个环节硬件复位时序。TFT屏通常有一个RST引脚需要主控给它一个复位脉冲。很多人图省事直接把RST引脚接高电平然后靠驱动芯片的上电自复位。这在稳压电源纹波大或者上电斜率不陡的板子上很容易导致屏初始化失败。这个demo里我保留RST引脚的GPIO控制上电后先拉低至少5ms再拉高等120ms左右再开始发命令。这个等待时间不是玄学是芯片数据手册里明确写的上电稳定时间。SPI时钟极性和相位。ST7789这类芯片支持SPI Mode 0和Mode 3但不同批次的屏模组可能只对其中一种模式响应正常。我在第一次调试时就遇到过用Mode 0初始化屏幕无反应切到Mode 3后一切正常。所以如果屏初始化后没反应第一时间检查SPI的CPOL和CPHA配置。初始化序列末尾的窗口设置。这个是花屏的头号原因。TFT屏的显存是一个大的线性空间比如ST7789的显存是240×320×2字节但你的屏可能是240×240或者320×240的裁切尺寸。如果初始化序列里的列地址CASET和行地址RASET设置和屏的实际分辨率不匹配数据就会写偏画面会出现错位、斜切甚至滚屏。这个demo里我用的屏是320x240的RGB接口屏但很多“兼容ST7789”的屏其实是带转接板的实际有效区域得看屏厂的规格书抄代码前一定要确认。自己调屏初始化时有个取巧的方法先把屏幕设成纯色比如全红、全绿、全蓝确认整屏颜色均匀后再去显示图像。纯色无法通过时前面的初始化序列必然有问题纯色通过后图像奇怪问题则出在数据链路或者格式上。2.2 摄像头模组初始化像素时钟与分辨率匹配摄像头这一侧的初始化核心是配置输出分辨率和像素时钟。以OV2640这类经典摄像头为例它通过SCCB接口I2C的一种变体读写寄存器初始化序列非常长通常有几百个寄存器配置。很多demo代码里是把这些配置打包成了一个大的数组上电后一口气写进去。这里要特别提醒一个坑摄像头输出分辨率必须和DCMI接口的配置一致否则采集到的数据就是一个歪的。比如你摄像头配置成800x600输出但DCMI那边的DMA传输长度是按照320x240来配的那么每帧实际只采集了部分数据画面会出现切头去尾的错乱。在demo工程里我建议把摄像头的分辨率固定为和屏幕一致如都配置成QVGA 320x240然后调试DMA配置时先在内存里观测一帧数据看看是否有明显的奇偶行错位。如果发现画面是对半切或者行错位基本可以确定是分辨率不匹配的问题。像素时钟PCLK也需要留意。摄像头输出的PCLK经过DCMI接口采样后数据进入FIFO。如果PCLK过高而DMA响应不及时FIFO会溢出丢数据。表现就是画面出现周期的横条噪声。降低帧率或者降低摄像头输出时钟频率可以有效缓解这个问题。2.3 DMA双缓冲机制画面撕裂的避坑关键TFT预览显示最影响体验的就是画面撕裂tearing。这个现象我最初没重视直到把一块移动的物体放到摄像头前才发现在快速运动时画面中间会有一条明显的错位横线。撕裂的成因很简单摄像头持续不断地把新数据写入显存而屏幕也在持续不断地从显存读数据去刷新。如果二者不同步屏幕刷新到一半时显存中的内容被更新了就会出现上半屏和下半屏来自不同帧的情况。解决撕裂的标准方案是DMA双缓冲内存中开辟两块缓冲区A和B。摄像头采集的数据先写入AA填满后通知主控开始刷新屏幕同时摄像头数据开始写入B。屏幕在刷新A时B正在被摄像头填充A刷新完毕主控切换指针屏幕刷新B摄像头写回A。两块缓冲区交替使用。这样做的好处是屏幕始终在刷一块完整的、已经结束写入的缓冲区不会出现半帧混写的情况。代码里切换缓冲区指针的时机要非常小心。我踩过的坑是DMA中断里直接切换了主控的帧缓冲指针但此时屏幕还在上一帧的刷新过程中导致下一帧数据覆盖了正在刷新的缓冲区。比较稳妥的做法是利用屏幕的TETearing Effect引脚或者VSYNC中断作为帧刷新完成的标志在帧刷新结束后再切换指针。volatile uint8_t frame_ready 0; uint16_t *frame_buffers[2] {(uint16_t *)buf_a, (uint16_t *)buf_b}; uint8_t active_buf_index 0; void DCMI_DMA_IRQHandler(void) { // DMA传输完成中断说明当前buffer已经被摄像头数据填满 active_buf_index ^ 1; frame_ready 1; } // 在屏幕刷完当前帧后切换到新buffer void TFT_Refresh_Task(void) { if (frame_ready) { frame_ready 0; TFT_Show_RGB565_Image(frame_buffers[active_buf_index], 320, 240); } }注意上面的代码是示意真实项目中你是把frame_buffers[active_buf_index]这个地址作为DMA的源地址传给屏幕刷新函数而不是在DMA中断里直接修改屏幕数据源——那个操作应该放在帧同步信号后进行。3. 实操过程demo工程从零到跑通的完整记录3.1 硬件连接与引脚规划做这个demo硬件连接是第一道关卡。我用的HC32L072 OV2640 ST7789 SPI屏的这个组合引脚分配如下信号MCU引脚说明摄像头数据 D[7:0]PA0-PA7DCMI并行数据口摄像头 PCLKPB0像素时钟输入摄像头 VSYNCPB1帧同步信号摄像头 HREFPB2行参考信号摄像头 XCLKPB3主控输出给摄像头的时钟通常用定时器输出24MHz摄像头 SCCB_SCLPB4I2C时钟摄像头 SCCB_SDAPB5I2C数据屏幕 SCLPA9SPI时钟屏幕 SDAPA8SPI数据屏幕 CSPA10片选屏幕 DCPA11数据/命令选择屏幕 RSTPA12复位屏幕 BLPA13背光控制直接拉高也可这种接线方式的好处是摄像头接口集中在A口和B口的低区后续接FPC排线比较规整屏幕的SPI接口独立一组不和摄像头数据口混叠避免信号串扰。配置GPIO时注意摄像头数据口的输入速度要设置为最高档。如果GPIO的输入速度配置过低高频PCLK下的数据采样会出现不稳定画面会有细小的噪点。这个细节在示波器上不一定看得出来但画面上能明显感觉到。我遇到过类似情况改了GPIO速度等级后噪点立刻消失。3.2 摄像头寄存器配置与常见模板摄像头初始化代码每个芯片都不一样但结构是一样的I2C写寄存器→延时→设置输出格式→设置分辨率→启动输出。这里以OV2640输出RGB565 QVGA为例核心寄存器段如下不完整示意为主// 设置输出格式为RGB565 ov2640_write_reg(0xff, 0x00); ov2640_write_reg(0xda, 0x09); // 输出RGB ov2640_write_reg(0xd7, 0x03); // RGB565 ov2640_write_reg(0x33, 0xa2); // 像素时钟分频 // 设置QVGA分辨率 ov2640_write_reg(0xff, 0x01); ov2640_write_reg(0x11, 0x01); // 分频设置 ov2640_write_reg(0x12, 0x00); // QVGA ov2640_write_reg(0x17, 0x11); // 窗口水平 // ... 窗口和裁剪寄存器若干写完寄存器后需要等待一帧时间约33ms才能稳定输出。很多demo代码不等待就直接去采集导致第一帧是半残的——我建议在初始化代码末尾加一个50ms左右的延时之后每次采集到的一帧才是完整的。如果你用的是MTK平台或者高通的摄像头模组寄存器配置流程会更复杂有些还需要加载特定的tuning参数。那种情况下建议先跑通原厂提供的camera tuning demo确认摄像头出图正常再移植到这个TFT预览的项目里。裸试一颗没调好的摄像头你很难分清是数据链路的问题还是镜头/ISP参数的问题。3.3 SPI屏幕刷图如何计算一帧刷新时间SPI屏的刷新时间取决于几个因素SPI时钟频率、像素格式、以及屏幕是否支持显存直写。计算公式很简单一帧数据传输量 宽 × 高 × 每像素字节数 一帧传输时间 数据传输量 × 8 / SPI时钟频率以我用的320x240 RGB565屏幕为例一帧数据量 320 × 240 × 2 153,600 字节 1,228,800 bit如果SPI时钟频率跑40MHz这是ST7789常见的上限实际有些屏可以到62MHz那么一帧时间大约是1,228,800 / 40,000,000 ≈ 30.72 ms这个结果很有意思——刚好和摄像头30fps每帧33ms的周期差不多。也就是说屏幕刷新一帧的时间几乎等于摄像头采集一帧的时间单片机在边采边刷的情况下没多少空闲。这会导致帧率被拖慢到15fps左右因为摄像头采完一帧后要等屏幕刷完才能采下一帧如果用的是同一块内存区。解决思路有两个降低屏幕分辨率显示比如摄像头输出QVGA但屏幕只显示其中一部分区域或者做简单的缩放。提高SPI时钟如果屏支持、走线质量也允许把SPI时钟拉到50-60MHz一帧时间可以压到20ms以内帧率就能跑上去了。这个demo里我只追求画面正确不追求高帧率所以40MHz SPI下能稳定跑到15-20fps就够用了。如果你的项目要求60fps或者30fps的流畅度强烈建议换RGB接口屏或者MIPI DSI屏SPI方式的天花板在这里摆着。3.4 缩放与裁剪策略分辨率不同时的处理测试中发现很多摄像头默认是VGA640x480或者更高分辨率输出但TFT屏只有320x240。直接把大分辨率数据送到小屏上屏幕会显示不了那么多像素只能看到左上角的一块区域。这个demo里我用了一个简单实用的方案配置摄像头直接输出QVGA分辨率绕开缩放问题。如果摄像头不支持直接输出目标分辨率那就得在MCU里做裁剪或者缩放。裁剪的代码比较简单就是DCMI采集时跳过对应的行和列。比如VGA输入的摄像头要显示320x240区域可以在HREF期间只采集前320个像素然后跳过剩余320个像素行方向则只采集前240行跳过其余行。这个操作可以在DMA传输的接收地址上做文章也可以在DMA完成后再进行内存拷贝。软件缩放的思路则要稍微绕一下把源图像的坐标映射到目标图像上按双线性插值或者最邻近插值计算。最邻近插值速度最快但画质粗糙双线性插值画质好但CPU开销大。在MCU上做双线性插值跑VGA分辨率帧率会掉得很厉害所以这个demo我强烈建议优先用摄像头直接出图目标分辨率。这也是为什么选OV2640这类老牌摄像头——它自带scaler功能支持各种分辨率输出对MCU的压力小很多。4. 常见问题与排查技巧实录这个demo调试下来我把遇到的典型问题整理成了速查表基本都是新手容易踩的坑现象可能原因排查方法屏幕白屏/黑屏屏初始化失败RST时序不对SPI模式错误先发纯色指令测试屏是否工作检查SPI mode/CPOL/CPHA延长RST低电平时间屏幕显示纯色正常图像错位摄像头分辨率与DCMI配置不一致窗口寄存器设置错误输出测试图案如彩条观察错位规律检查HREF/VSYNC极性图像偏色严重RGB格式不匹配BGR/RGB顺序反了数据位宽错误ST7789有RGB/BGR控制寄存器检查0x36寄存器设置确认屏是RGB565还是RGB666画面有横条纹/噪声PCLK过高导致FIFO溢出GPIO速度配置过低电源纹波过大降低PCLK检查GPIO速度等级给摄像头加LC滤波电容图像滚动或跳帧VSYNC信号不稳定DMA配置错误用示波器抓VSYNC波形确认周期稳定检查DMA传输长度配置画面撕裂没有使用双缓冲或切换时机不对引入双缓冲机制在VSYNC/TE信号后切换buffer帧率极低5fpsSPI时钟太低每帧都用软件拷贝显存提高SPI时钟改用DMA传输避免CPU逐字节搬运摄像头不出图全黑摄像头时钟未输出SCCB通信失败镜头排线接触不良用示波器确认XCLK有波形I2C scanner检测SCCB设备地址检查FPC排线方向图像有色彩拖影屏幕刷新速度跟不上摄像头帧率匹配问题尝试降低摄像头帧率检查双缓冲是否真的生效4.1 案例一SCCB通信失败摄像头完全无输出这个是我之前在另一个平台STM32F407上帮朋友调试时遇到的。现象是屏幕已经正常显示纯色但摄像头通路一片黑什么数据都采不到。排查过程从源头开始第一步查摄像头的XCLK示波器一量24MHz波形正常。第二步查SCCB读写用示波器钩在SCL和SDA上发初始化代码时完全没有任何波形——这就说明硬件连接或者I2C配置有问题。后来发现是SCCB的SDA引脚没有配置成开漏输出而是推挽输出导致和摄像头模组的上拉电阻冲突总线被拉死。经验教训SCCB/I2C总线引脚务必配置为开漏输出并外加上拉电阻。这个细节特别容易在硬件设计时被忽略因为MCU默认的GPIO模式是推挽很多人忘了改。4.2 案例二图像颜色整体偏蓝/偏紫第一次跑通预览时画面颜色很奇怪整个画面泛蓝紫色像蒙了一层彩色的雾。这个问题的根源不是摄像头而是RGB数据反序。OV2640输出的RGB565格式里数据排列可以是RGB565也可以是BGR565具体由寄存器决定。而ST7789屏的0x36寄存器里也有一个颜色顺序的控制位。如果摄像头输出的是RGB顺序但屏被配置成BGR顺序最终显示就会偏色。排查方法很简单在电脑上看一张纯红色图片用手机对着摄像头拍如果屏幕上显示红色和蓝色被互换了那基本就是RGB/BGR反序的问题。改法有两种改摄像头的输出格式寄存器如OV2640的0xDA寄存器。改屏的0x36寄存器ST7789里的BGR位。两种方式任选其一改完重新烧录颜色就正常了。4.3 案例三画面出现明显的滚屏条纹还有一个比较难排查的问题屏幕图像正常但每隔一段时间会出现从上到下滚动的横条纹像CRT显示器的刷新率不足。排查后发现是DMA搬运和屏幕刷新之间竞争CPU总线导致的。我的代码里DMA从摄像头数据寄存器搬数据到内存和SPI从内存搬数据到屏幕两者抢同一个AHB总线。在总线仲裁时SPI传输优先级设置得不合理导致摄像头数据偶尔被延迟搬运PCLK的FIFO溢出产生一行或几行的数据错乱反映到屏幕上就是滚屏条纹。解决办法把摄像头DCMI的DMA优先级设为最高SPI传输设为普通优先级。总线仲裁优先级调整后滚屏条纹彻底消失。这个问题的排查思路是如果单看数据和画面觉得都正常但不定时出点小瑕疵优先怀疑总线竞争和DMA优先级。4.4 案例四SPI屏刷新出现雪花噪点屏幕显示的内容是对的但画面上方经常出现一些随机离散的噪点有时候整块区域都花了。排查后发现是屏幕的SPI数据线和摄像头的PCLK离得太近在PCB板上平行走线长度超过了5cm信号串扰导致采样错误。解决措施是在板子上把SPI走线用地线包起来同时在SPI时钟线上串联一个33Ω电阻来抑制振铃。改板后问题消失。这个问题的提示是做这种demo板时摄像头接口和屏接口的走线离得远一点特别要注意高速信号线的包地处理。5. 帧率测量与性能调优心得预览画面能正常显示之后下一步就是量化性能。这个demo的目标虽然是测试TFT preview但帧率和延迟直接影响对屏幕和摄像头整体方案的评估所以必须量化。5.1 用GPIO翻转法测试帧率最简单直接的帧率测量方法不是用任何工具软件而是在代码里把VSYNC中断里翻转一个GPIOvoid EXTI_VSYNC_IRQHandler(void) { GPIO_Toggle(PIN_LED); frame_count; }然后用示波器或者逻辑分析仪测量这个GPIO的翻转频率除以2就是fps。这个方法虽然粗略但非常实用不需要额外搭环境。5.2 整个链路的瓶颈分析在我这个demo配置下实测下来瓶颈非常明显SPI刷屏占了绝大部分的时间。摄像头的QVGA RGB565帧通过DMA搬到内存里的速度很快摄像头PCLK是24MHz一行320像素大概是320×2/24MHz≈26.7μs一帧240行约6.4ms。而SPI刷一帧需要约30ms。也就是说如果不用双缓冲并做帧率控制整个链路会被屏幕拖到大约15fps出头。想提升帧率的话优化SPI传输检查是否有不必要的等待延时。用DMA方式而不是查询方式发数据可以减少CPU等待。压缩图像尺寸预览时不需要全分辨率可以缩小到320x240显示或者用像素抽稀。降低屏幕刷新率如果屏幕不需要实时性那么高可以主动控制在25fps左右。5.3 延迟到底重要不重要这里分享一个容易被忽略的认知在TFT预览测试里帧率fps和延迟latency是两个概念。帧率指的是每秒显示的帧数延迟指的是从摄像头实际捕捉光线到画面显示在屏幕上的时间差。如果屏幕SPI刷新需要30ms即使帧率看起来有15fps实际延迟可能会有40-60ms——因为摄像头采集完成、DMA搬运、SPI排队刷新这些环节都有时间消耗。对测试demo来说如果只是验证能不能出图延迟不用太较真。但如果后续要在这个基础上做跟手性很强的应用比如电子取景器、机器视觉对准延迟就要认真优化。通常做法是减少缓冲的级数一帧尽量只经过一次中间缓存。提高SPI时钟或者换并口屏。使用线程/任务优先级抢占让刷屏任务尽可能不被其他逻辑干扰。6. 这个demo做完之后怎么往产品方向扩展TFT preview demo的价值不仅仅是测试它其实是很多带屏摄像头产品的最小验证原型。做完这个工程后往产品方向扩展时我自己会优先考虑下面几个方向你也可以按这个思路往下走。一是引入图形界面层比如LVGL或者TouchGFX。preview demo里是整屏刷新而产品里通常需要在屏幕上叠加UI控件、拍照按钮、状态栏甚至实现画面缩放预览。此时摄像头画面通常是作为背景或者一块预览窗口存在UI层叠加在上面。这个扩展需要引入图层管理和局部刷新机制DMA双缓冲的结构要改成多图层合成。二是增加图像捕捉和存储。demo跑通了预览下一步大概率是要拍照保存。这里需要把摄像头输出切换到JPEG模式OV2640支持直接输出JPEG然后保存到SD卡或者外部Flash。这个功能在预览demo的基础上改动不大但要注意JPEG模式下DCMI的数据流是变长的一帧数据的长度需要从VSYNC和HREF信号来判断而不是固定字节数。三是接入网络或者上位机。如果是做视觉检测类项目预览屏只是本地调试手段最终图像可能需要通过串口、Wi-Fi或者以太网传到上位机处理。这种情况下demo里的屏显流程和网络发送流程可以共用同一份DMA缓冲数据也就是一帧数据两路消费这个架构在后续做实时视频传输时非常有用。四是摄像头isp参数调优camera tuning。这个demo用默认寄存器配置能出图但画面可能偏暗、色彩饱和度不够、或者白平衡偏色。如果产品对画质有要求就需要对着色卡和灰阶卡逐项调摄像头的曝光、增益、gamma、饱和度等参数。这时候demo工程的价值就体现出来了——因为它足够简单改一个参数、刷一版固件、立刻看效果调参效率比在完整产品工程里高得多。我个人在实际操作中的体会是这种测试专用demo虽然看起来只是一堆临时代码但它才是整个项目能快速推进的基石。很多团队上来就在正式工程里调屏调摄像头结果硬件问题、驱动问题和业务逻辑问题纠缠在一起一个简单的花屏问题可能要排查三四天。花半天时间把demo工程做扎实后面调试全家桶的效率会翻倍。最后再分享一个小技巧这个demo工程建议在编译配置里加入一个#define TEST_MODE开关在屏上预留一个测试图案比如彩条输出函数。每次硬件改版回来后先在TEST_MODE下跑一遍彩条和纯色确认屏通再接摄像头跑预览确认图像通。这样能把屏问题和摄像头问题快速分离开排查速度会快很多。这个项目后续扩展的空间其实很大核心链路打通之后不管是往产品化走、还是往性能调优方向深挖都有清晰的路径。希望这篇拆解能帮你少踩几个坑。
返回列表