# OV2640摄像头驱动 **Repository Path**: Yang_LN/ov2640-camera-driver ## Basic Information - **Project Name**: OV2640摄像头驱动 - **Description**: 鹿小班H734核心板的OV2640显摄像头驱动移植,适用于CubeMX生成的代码,要配合ST7789驱动使用 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-16 - **Last Updated**: 2026-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OV2640摄像头驱动 #### 介绍 鹿小班H734核心板的OV2640显摄像头驱动移植,适用于CubeMX生成的代码,要配合[ST7789的驱动](https://gitee.com/Yang_LN/1.54-inch-lcd-display-driver)使用 MX中参数配置与[OV5640摄像头驱动](https://gitee.com/Yang_LN/ov5640-camera-driver)完全一致 ## 注意 发现驱动移植到目前最新版本6.18时,发现有时候在配置时钟时HPRE分频后的频率只能写120,而不能写到最高240,会导致挂载在AHB2上的DCMI外设通信出问题,可以强制改分频器HPRE为/2,后面的D1~3PPRE为/2,让HPRE之后的频率强制配置成240生成代码,不管红色报错 ## 使用说明 参考LXB示例程序修改 OV系列摄像头使用[[SCCB通信协议]]配置寄存器 使用[[DCMI(Digital camera interface)]]并行数据协议接收数据 ### 一、配置DCMI外设 #### 模式 选择Slave 8bits External Synchro 选择好后MX会自动配置共11个引脚建立通信 ==并根据原理图进行引脚重映射== - 模式配置 - 像素时钟极性 ==上升沿有效== - 帧同步VS信号极性 低电平有效 - 行同步HS信号极性 低电平有效 - 捕获频率 每一帧都进行捕获 - JPEG模式 禁用 - 接口捕获配置 - 字节选择模式 接口捕获所有接收到的字节 - 列选择模式 接口捕获所有接收到的行 #### GPIO配置 进入DCMI配置界面的GPIO配置 向下拉更改引脚的最大输出速度为==非常高== #### NVIC配置 进入DCMI配置界面的NVIC配置 ==打开DCMI通用中断== #### DMA配置 进入DCMI配置界面的DMA配置 - DMA请求来自DCMI - ==选择DMA2的数据流7== - 外设到寄存器 - 优先级低 - ==循环模式== - 外设地址不自增 - 存储器地址自增 - 使能Fifo - 阈值:全Fifo模式,4×32bit大小 - 数据宽度都是一字32位 - Burst Size单次传输 自动使能DMA2_Stream7中断,不必配置 ### 二、配置GPIO引脚 1. 配置SCCB通信引脚 参考原理图配置对应引脚,并==命名== - SCCB_SCL - ==开漏输出== - 不带上下拉 - 速度等级低 - ==初始高电平== - SCCB_SDA - ==开漏输出== - 不带上下拉 - 速度等级低 - ==初始高电平== 2. 配置掉电控制引脚PWDN - 推挽输出 - GPIO Pull-up/Pull-down==上拉== - 速度等级低 ### 三、配置内核CORTEX_M7 这里没有要保持默认的参数,都要进行配置 在System Core中找到CORTEX_M7标签 首先先关掉默认配置Speculation default mode 1. 使能ICache和DCache 2. [[内存保护单元MPU(Memory Protection Unit)]]控制设置模式为 - Background Region Privileged accesses only + MPU Disabled during hard fault, NMl and FAULTMASK handlers - 把鼠标悬停在选项卡上面显示`MPU_PRIVILEGED_DEFAULT` 3. 使能MPU Region 4. 设置MPU的区域基地址为==0x30000000==,要对应程序中的Camera_Buffer地址 - 一般定义为宏`#define Camera_Buffer 0x30000000 // 摄像头图像缓冲区` 5. 设置MPU的区域大小为512KB 6. 设置Sub Region Disable(禁用子区域)为0x00,不禁用任何区域 7. 设置TEX field level(TEX字段级别)为level0 8. 设置Access Permission(访问权限)为`ALL ACCESS PERMITTED`完全访问 9. 使能Instruction Access (指令访问) 10. 使能Shareability Permission(分享权限) 11. 使能Cacheability Permission(缓存权限) 12. 使能Bufferability Permission(缓冲权限) ### (调试可选)配置串口 选择默认USART1默认的PA9、PA10引脚,参数默认即可 不配置也可 ### 程序初始化 在程序生成完的DMA、DCMI初始化函数后依次调用这些函数 ```C /* USER CODE BEGIN 2 */ SPI_LCD_Init(); DCMI_OV2640_Init(); OV2640_DMA_Transmit_Continuous(Camera_Buffer, OV2640_BufferSize); /* USER CODE END 2 */ ``` 想要让LCD液晶屏持续显示拍摄的画面,在死循环中这样写 ```C /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if (DCMI_FrameState == 1) // 采集到了一帧图像 { DCMI_FrameState = 0; // 清零标志位 LCD_CopyBuffer(0,0,Display_Width,Display_Height, (uint16_t *)Camera_Buffer); // 将图像数据复制到屏幕 } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } ```