基于 RA8P1 的实时摄像头预览工程
本篇在原有触摸屏的基础上装上了摄像头。硬件方面新增 OV5640 摄像头模块,借助 RA8P1 内置的 CEU 图像采集单元接收传感器输出的并行视频流。
一、CEU 图像采集单元是什么
CEU(Capture Engine Unit,图像采集引擎单元)是瑞萨 RA8 系列 MCU 内置的摄像头采集外设,负责接收 CMOS 图像传感器(本工程为 OV5640)输出的并行视频数据流,并配合 DMA 把整帧图像直接搬进内存,CPU 几乎不参与数据搬运。
它的主要特点:
1. 并行接口:8 位数据总线 D0 到 D7,配合 PCLK(像素时钟)、VSYNC(帧同步)、HSYNC(行同步)三根同步信号;
2. 常见图像格式:支持 RGB565、YCbCr422 等,可配置输入顺序、字节交换、同步信号极性、采样边沿;
3. 中断事件:帧结束、CRAM 溢出、VD 或 HD 错误等都会触发回调,便于诊断采集异常;
4. 配合 DMAC:采集一帧后把数据连续写入内存指定地址,本工程每帧为 480x640x2 共 614,400 字节 RGB565。
使用方法与注意事项:
1. 帧缓冲必须放在 DMA 可达的内存,并注意 D-Cache 一致性:DMA 写完后,CPU 读取前要先 invalidate 该段 cache;CPU 写完后,DAVE2D 等外设读取前要先 clean。本工程验证过:CEU 原始帧必须放内部 SRAM 的 .ram_noinit_nocache 段并 32 字节对齐,放在 SDRAM 会出现条纹、分块或错位。
2. captureStart 在上帧未完成时返回 FSP_ERR_INVALID_STATE,实现上要先轮询状态到 IDLE 再启动,并加超时保护;
3. CEU 的同步周期寄存器(CMCYR,写入传感器 HTS 和 VTS 值)必须与传感器输出时序匹配;
4. 传感器寄存器配置走 SCCB 接口(OV5640 的类 I2C 总线)。本工程用 GPIO 位模拟 SCCB,避免占用硬件 IIC 通道,接线也更灵活。
二、新增外设与引脚配置
新增 OV5640 摄像头模块(SCCB 寄存器配置加 CEU 图像采集)与 RTC 时钟,逐项说明:
外设:CEU(r_ceu)
用途:摄像头图像采集,8 位数据总线,采集尺寸 480x640 的 RGB565
引脚:D0 到 D7 与 PCLK、VSYNC、HSYNC 接 P400、P401、P405、P406、P414、P415、P700、P701、P702、P703、P708(CEU 复用脚,详见 e2 studio 引脚配置)
外设:GPIO 位模拟 SCCB
用途:OV5640 寄存器读写,输出与输入切换,5 微秒位延时
引脚:SCL 接 P410,SDA 接 P409
外设:GPIO
用途:OV5640 复位时序,低有效复位与掉电控制
引脚:RESET 接 P709,PWDN 接 P710
外设:RTC(r_rtc)
用途:屏幕时钟显示,日历模式
引脚:无
外设:CEU 中断(CEUI)
用途:帧完成与错误事件回调,优先级 12
引脚:无
FSP 中 CEU 模块的关键配置项:8 位总线、数据同步模式、HSYNC 与 VSYNC 高有效、输入顺序 YCbCr422、字节交换全开、突发长度 x8、采集尺寸 480x640、帧结束与溢出与 VD 错误中断使能。
三、新增功能
1. 实时摄像头预览:OV5640 采集 480x640 竖屏帧,逆时针旋转 90 度并水平镜像,缩放到 240x180 横屏后居中显示(左上角距屏幕边缘 120、70 像素)。采集线程每 50 毫秒出一帧,双缓冲原子发布,UI 线程检测到新帧才刷新画面,画面流畅不闪烁。
2. 触摸交互效果:按下时出现青色圆点(16x16)跟随手指移动,同时显示坐标标签 x:y(90x20,跟随手指偏移,自动限制在屏幕内);抬手后 300 毫秒淡出隐藏。实现只用 LVGL 基础样式(无阴影、无渐变),确保 DAVE2D 硬件加速路径正常工作。
3. 帧率显示:左上角显示预览帧率(每秒统计刷新帧数),方便评估采集到显示的链路实时性。
四、系统架构与内存约定
采集线程(ai_thread):50 毫秒节拍(vTaskDelayUntil),启动即打开 OV5640 与 CEU;每帧依次执行 capture(CEU DMA 写帧)、invalidate cache、旋转缩放进双缓冲、clean cache 后原子发布;失败只跳过本帧,不退出线程。
UI 线程(ui_thread):5 毫秒主循环(lv_tick_inc 加 lv_timer_handler 加页面 tick),驱动 LVGL 刷新与触摸效果动画。
内存约定(板级验证):
数据:CEU 原始帧 s_ai_frame
位置:内部 SRAM 的 .ram_noinit_nocache 段,32 字节对齐
约束:CEU DMA 直接写入,CPU 读取前 invalidate
数据:预览双缓冲
位置:内部 SRAM,32 字节对齐
约束:CPU 写后 clean,DAVE2D 直接读取
五、工程代码结构(新增部分)
src/ai_thread_entry.c:摄像头采集线程(50 毫秒节拍、失败降级)
src/device/camera/:camera_ov5640(驱动加寄存器表)、camera_ceu(CEU 封装)、camera_sccb(GPIO 位模拟 SCCB)
src/application/core/camera_preview 源文件:旋转缩放、双缓冲原子发布
src/application/core/app_clock 源文件:RTC 时钟封装
src/application/ui/ui_page_camera 源文件:主页面(预览加时钟加帧率加触摸效果层)
src/application/ui/ui_touch_effect 源文件:触摸交互效果
src/application/ui/ui_manager 源文件:页面管理(单页面)
通过网盘分享的文件:摄像头.zip
链接: https://pan.baidu.com/s/1KobV8PCxtkaRQK1PFJmh3A?pwd=7z69 提取码: 7z69
感谢阅读,欢迎指正。
