eefocus_4256949 发表于 2026-8-14 20:49:59

基于 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 错误中断使能。

!(https://www.eefocus.com/forum/data/attachment/forum/202608/14/204911nous9r4pw1rnst1v.png)



## 三、新增功能

1. **实时摄像头预览**:OV5640 采集 480x640 竖屏帧,逆时针旋转 90 度并水平镜像,缩放到 240x180 横屏后居中显示(左上角距屏幕边缘 120、70 像素)。采集线程每 50 毫秒出一帧,双缓冲原子发布,UI 线程检测到新帧才刷新画面,画面流畅不闪烁。
2. **触摸交互效果**:按下时出现青色圆点(16x16)跟随手指移动,同时显示坐标标签 x:y(90x20,跟随手指偏移,自动限制在屏幕内);抬手后 300 毫秒淡出隐藏。实现只用 LVGL 基础样式(无阴影、无渐变),确保 DAVE2D 硬件加速路径正常工作。
3. **时钟与帧率显示**:右上角显示 RTC 时间(时:分:秒,每秒刷新);左上角显示预览帧率(每秒统计刷新帧数),方便评估采集到显示的链路实时性。

!(https://www.eefocus.com/forum/data/attachment/forum/202608/14/204859lzi9tchoc2qhci9b.png)



## 四、系统架构与内存约定

**采集线程(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

感谢阅读,欢迎指正。

页: [1]
查看完整版本: 基于 RA8P1 的实时摄像头预览工程