三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

基于 RA8P1 的实时摄像头预览工程

基于 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


感谢阅读,欢迎指正。

← 返回列表