首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ov7670摄像头连接stm32f4(摄像头无FIFO、采用HAL、st7789LCD屏幕)

ov7670摄像头连接stm32f4(摄像头无FIFO、采用HAL、st7789LCD屏幕)

原创
作者头像
飞进窄门的牛背鹭
发布2025-08-24 15:19:37
发布2025-08-24 15:19:37
3220
举报

参考资料

全流程视频:https://www.you删tu掉be.com/watch?v=oVzuphK4haQ(原视频采用的LCD屏幕为st7725,本文改成st7789,强烈推荐看完再来看这篇文章)

源代码和指引:https://www.micropeta.com/video131

github上点亮ov7670的源码:https://github.com/iwatake2222/DigitalCamera_STM32

LCD st7789点亮代码:https://github.com/Floyd-Fish/ST7789-STM32

引脚选择

ov7670有3V3、GND、SCL、SDA、VS、HS、PLK、XLK、D7、D6、D5、D4、D3、D2、D1、D0、RET、PWDN共十八个引脚

配置如下(各位选择不必和我一致)

3V3——3.3V

GND——GND

SCL——PB10(I2C2_SCL)

SDA——PC12(SDA_SDA)

VS——PB7(DCMI_VSYNC)

HS——PA4(DCMI_HSYNC)

PLK——PA6(DCMI_PLXCLK)

XLK——PA8(RCC_MCO_1)

D7——PB9(DCMI_D7)

D6——PB8(DCMI_D6)

D5——PD3(DCMI_D5)

D4——PC11(DCMI_D4)

D3——PE1(DCMI_D3)

D2——PC8(DCMI_D2)

D1——PC7(DCMI_D1)

D0——PC6(DCMI_D0)

RET——PD11(CAMERA_RESET)

PWDN——GND

LCD st7789配置(我的LCD没有CS引脚,所以要将A5、A7改成上拉输出模式,正常的应该不用)

GND——GND

VCC——3V3

SCL——PA5(SPI1_SCK)

SDA——PA7(SPI1_MOSI)

RES——PC5

DC——PC4

实操

  • 打开STM32CubeIDE或STM32CubeMX,选择你的MCU型号新建一个工程(我使用的是stm32f446vet6),然后选择Debug模式
  • 点击RCC,High Speed Clock (HSE) 栏改成 Crystal/Ceramic Resonator,勾选 Master Clock Output 1
  • 同时在Configuration栏下,选择PA8(RCC_MCO_1)将 Maximum Output Speed 改成 Very High
  • 点击上方的Clock Configuration,将HCLK的频率改成最大值(我的MCU最大是180MHz)
  • 在MCO1这一节点选择MCO1的 Source MUX,可选 PLLCLK 并进行 /4 的分频以使MCO1获得42MHz的频率或选择 HSE 并进行 /1 的分频获得8MHz,或选择 HSI 并进行 /1 的分频获得16MHz。频率越大越好,当然性能开销也更大,我选的是16MHz
  • 回到Pinout&Configuration页面,点击 connectivity,点击 I2C2
  • 在I2C栏改成 I2C,在下方的Configuration栏点击 GPIO Settings 选择 PB10(I2C2_SCL) 和 PC12(SDA_SDA) 都改成上拉模式 Pull-up,Maximum Output Speed 改成 Very High
  • 点击Multimedia,点击 DCMI,在 DCMI 栏改成 Slave 8 bits external Synchro,在下方的Configuration栏点击 Parameter Settings
  • Pixel clock polarity栏改成 Active on rising edge,Vertical syncronisation polarity栏改成 Active High,点击 GPIO Settings 选择其下的所有DCMI系列的针脚,都改成下拉模式 Pull-down,Maximum Output Speed 改成 Very High
  • 点击DMA Settings,点击下方的 Add 按钮,DMA Request 选择 DCMI
  • 点击NVIC Settings,勾选 DCMI global interrupt
  • 设置PD11针脚为 GPIO_Output 并使用标签命名为 CAMERA_RESET
  • 现在配置LCD,在Connectivity拦下点击 SPI1,Mode改成 Half-Duplex Master,在Configuration栏下点击 Parameter Settings,将 prescalar (for Baud rate) 改成 4,其他分频应该也行,保持一个较大的波特率就行了
  • 点击 GPIO Settings,选择PA5(SPI1_SCK)和PA7(SPI1_MOSI)将 Maximum Output Speed 改成 Very High
  • 设置PC5、PC4针脚为 GPIO_Output

代码

根据自己的使用习惯保存并生成代码

  • 接着在这个网页中https://www.micropeta.com/video131复制或下载common.h,ov7670.h,ov7670Config.h,ov7670Reg.h头文件和ov7670.c源文件到工程中
  • 修改一下ov7670Reg.h头文件,改成右边那样
  • https://github.com/Floyd-Fish/ST7789-STM32中复制或下载fonts.h,fonts.c,st7789.h,st7789.c到工程中,并且具体怎么配置st7789,github上作者已经说的很详细了,再不济b站也有一个视频讲解作者的代码 main.c中重要参考代码:
代码语言:C
复制
/* USER CODE BEGIN Includes */
#include "common.h"
#include "ov7670.h"
#include "st7789.h"
#include "fonts.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
#define MAX_PICTURE_BUFF     19200//160*120
uint16_t pBuffer[MAX_PICTURE_BUFF];
/* USER CODE END PV */ 
/* USER CODE BEGIN 2 */  
HAL_Delay(1000);
ST7789_Init();
ST7789_Test();
HAL_Delay(1000); // Test the display
ov7670_init(&hdcmi, &hdma_dcmi, &hi2c2); 
ov7670_config(OV7670_MODE_QVGA_RGB565);  
ov7670_stopCap(); 
/* USER CODE END 2 */ 
/* Infinite loop */ 
/* USER CODE BEGIN WHILE */ 
while (1)
{
    HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, pBuffer, MAX_PICTURE_BUFF/2);   
    HAL_Delay(250); 
    //Wait for DMA to complete    // picture pBuffer size 120*160=19200 is now available, we can transmit    // or display in lcd as shown below    
    int pixel = 0;    
    for( int x = 0; x < 120; x++ )  
    {
        for( int y = 159; y > -1; y-- )     
        {
            ST7789_DrawPixel(x, y, pBuffer[pixel]);  
            pixel++;  
        }
    }
}
/* USER CODE END WHILE */

以下是效果展示图

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
  • 引脚选择
  • 实操
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档