首页 > 其他分享 >ESP32-S3模组上跑通esp32-camera(15)

ESP32-S3模组上跑通esp32-camera(15)

时间:2024-11-14 10:51:19浏览次数:3  
标签:15 PIN pin S3 esp32 cam gpio GPIO config

接前一篇文章:ESP32-S3模组上跑通esp32-camera(14)

 

本文内容参考:

esp32-camera入门(基于ESP-IDF)_esp32 camera-CSDN博客

OV5640手册解读-CSDN博客

ESP32_CAM CameraWebServer例程源码解析笔记(一)_void startcameraserver();-CSDN博客

esp32-cam驱动程序阅读 - 哔哩哔哩

特此致谢!

 

一、OV5640初始化

2. 相机初始化及图像传感器配置

上一回讲解到cam_init函数中的ll_cam_set_pin函数,讲解了其整体功能,本回对其进行详细解析。为了便于理解和回顾,再次贴出cam_init和ll_cam_set_pin函数代码。cam_init函数在components\esp32-camera\driver\cam_hal.c中,如下:

​esp_err_t cam_init(const camera_config_t *config)
{
    CAM_CHECK(NULL != config, "config pointer is invalid", ESP_ERR_INVALID_ARG);
 
    esp_err_t ret = ESP_OK;
    cam_obj = (cam_obj_t *)heap_caps_calloc(1, sizeof(cam_obj_t), MALLOC_CAP_DMA);
    CAM_CHECK(NULL != cam_obj, "lcd_cam object malloc error", ESP_ERR_NO_MEM);
 
    cam_obj->swap_data = 0;
    cam_obj->vsync_pin = config->pin_vsync;
    cam_obj->vsync_invert = true;
 
    ll_cam_set_pin(cam_obj, config);
    ret = ll_cam_config(cam_obj, config);
    CAM_CHECK_GOTO(ret == ESP_OK, "ll_cam initialize failed", err);
 
#if CAMERA_DBG_PIN_ENABLE
    PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[DBG_PIN_NUM], PIN_FUNC_GPIO);
    gpio_set_direction(DBG_PIN_NUM, GPIO_MODE_OUTPUT);
    gpio_set_pull_mode(DBG_PIN_NUM, GPIO_FLOATING);
#endif
 
    ESP_LOGI(TAG, "cam init ok");
    return ESP_OK;
 
err:
    free(cam_obj);
    cam_obj = NULL;
    return ESP_FAIL;
}

ll_cam_set_pin函数在components\esp32-camera\target\esp32s3\ll_cam.c中,代码如下:

esp_err_t ll_cam_set_pin(cam_obj_t *cam, const camera_config_t *config)
{
    PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[config->pin_pclk], PIN_FUNC_GPIO);
    gpio_set_direction(config->pin_pclk, GPIO_MODE_INPUT);
    gpio_set_pull_mode(config->pin_pclk, GPIO_FLOATING);
    gpio_matrix_in(config->pin_pclk, CAM_PCLK_IDX, false);
 
    PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[config->pin_vsync], PIN_FUNC_GPIO);
    gpio_set_direction(config->pin_vsync, GPIO_MODE_INPUT);
    gpio_set_pull_mode(config->pin_vsync, GPIO_FLOATING);
    gpio_matrix_in(config->pin_vsync, CAM_V_SYNC_IDX, cam->vsync_invert);
 
    PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[config->pin_href], PIN_FUNC_GPIO);
    gpio_set_direction(config->pin_href, GPIO_MODE_INPUT);
    gpio_set_pull_mode(config->pin_href, GPIO_FLOATING);
    gpio_matrix_in(config->pin_href, CAM_H_ENABLE_IDX, false);
 
    int data_pins[8] = {
        config->pin_d0, config->pin_d1, config->pin_d2, config->pin_d3, config->pin_d4, config->pin_d5, config->pin_d6, config->pin_d7,
    };
    for (int i = 0; i < 8; i++) {
        PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[data_pins[i]], PIN_FUNC_GPIO);
        gpio_set_direction(data_pins[i], GPIO_MODE_INPUT);
        gpio_set_pull_mode(data_pins[i], GPIO_FLOATING);
        gpio_matrix_in(data_pins[i], CAM_DATA_IN0_IDX + i, false);
    }
    if (config->pin_xclk >= 0) { 
        PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[config->pin_xclk], PIN_FUNC_GPIO);
        gpio_set_direction(config->pin_xclk, GPIO_MODE_OUTPUT);
        gpio_set_pull_mode(config->pin_xclk, GPIO_FLOATING);
        gpio_matrix_out(config->pin_xclk, CAM_CLK_IDX, false, false);
    }
 
    return ESP_OK;
}

上一回讲了,ll_cam_set_pin函数的整体功能是:依次对于pin_pclk、pin_vsync、pin_href、pin_d0~d7、pin_xclk(如果使能)所对应的GPIO引脚进行设置。本回一段一段来看具体代码。

 1)pin_pclk

代码片段如下:

    PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[config->pin_pclk], PIN_FUNC_GPIO);
    gpio_set_direction(config->pin_pclk, GPIO_MODE_INPUT);
    gpio_set_pull_mode(config->pin_pclk, GPIO_FLOATING);
    gpio_matrix_in(config->pin_pclk, CAM_PCLK_IDX, false);

设置与OV5640的PCLK相连接的GPIO引脚为GPIO、输入模式(OV5640的输出就是ESP32-S3的输入),上下拉模式设置为GPIO_FLOATING。

4d80729e93554e13874d562a346623a3.png

26c1a99cd087487eaca89aca8457ba66.png

 2)pin_vsync

代码片段如下:

    PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[config->pin_vsync], PIN_FUNC_GPIO);
    gpio_set_direction(config->pin_vsync, GPIO_MODE_INPUT);
    gpio_set_pull_mode(config->pin_vsync, GPIO_FLOATING);
    gpio_matrix_in(config->pin_vsync, CAM_V_SYNC_IDX, cam->vsync_invert);

设置与OV5640的VSYNC相连接的GPIO引脚为GPIO、输入模式(OV5640的输出就是ESP32-S3的输入),上下拉模式设置为GPIO_FLOATING。

d8b3f224aaaa4fb286e70b737a237bbb.png

26c1a99cd087487eaca89aca8457ba66.png

3)pin_href

代码片段如下:

    PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[config->pin_href], PIN_FUNC_GPIO);
    gpio_set_direction(config->pin_href, GPIO_MODE_INPUT);
    gpio_set_pull_mode(config->pin_href, GPIO_FLOATING);
    gpio_matrix_in(config->pin_href, CAM_H_ENABLE_IDX, false);

设置与OV5640的HREF相连接的GPIO引脚为GPIO、输入模式(OV5640的输出就是ESP32-S3的输入),上下拉模式设置为GPIO_FLOATING。

 0c9d3e89e07041d8b2dd150294b7e4dd.png 

26c1a99cd087487eaca89aca8457ba66.png

4)pin_d0~pin_d7

代码片段如下:

    int data_pins[8] = {
        config->pin_d0, config->pin_d1, config->pin_d2, config->pin_d3, config->pin_d4, config->pin_d5, config->pin_d6, config->pin_d7,
    };
    for (int i = 0; i < 8; i++) {
        PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[data_pins[i]], PIN_FUNC_GPIO);
        gpio_set_direction(data_pins[i], GPIO_MODE_INPUT);
        gpio_set_pull_mode(data_pins[i], GPIO_FLOATING);
        gpio_matrix_in(data_pins[i], CAM_DATA_IN0_IDX + i, false);
    }

设置与OV5640的D[9:0](D[7:0])相连接的GPIO引脚为GPIO、输入模式(OV5640的输出就是ESP32-S3的输入),上下拉模式设置为GPIO_FLOATING。

5)pin_xclk

代码片段如下:

    if (config->pin_xclk >= 0) { 
        PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[config->pin_xclk], PIN_FUNC_GPIO);
        gpio_set_direction(config->pin_xclk, GPIO_MODE_OUTPUT);
        gpio_set_pull_mode(config->pin_xclk, GPIO_FLOATING);
        gpio_matrix_out(config->pin_xclk, CAM_CLK_IDX, false, false);
    }

设置与OV5640的XCLK相连接的GPIO引脚为GPIO、输出模式(OV5640的输入就是ESP32-S3的输出),上下拉模式设置为GPIO_FLOATING。

注意,这个pin_xclk是可选的,如果之前在static camera_config_t camera_config中设置了其值为-1,则此处并不会进入判断体进行设置。

  • XCLK引脚

摄像头的外部时钟引脚。

 8ee2ca0f368a48de8990635f707712ec.png 

 

至此,ll_cam_set_pin函数解析完了。下一回回到cam_init函数中,继续解析后续代码。

 

标签:15,PIN,pin,S3,esp32,cam,gpio,GPIO,config
From: https://blog.csdn.net/phmatthaus/article/details/143652297

相关文章

  • java 实训第15天 Java 多线程
    Java多线程一、定义   java程序本身就是多线程的。   二、相关概念   1、操作系统   内核实现其他资源的管理和调度。   2、进程   一个进程就是操作系统中运行的一个应用程序,每个进程都有进程ID标志唯一性   3、线程   线程是计算......
  • 11.15
      实验16:命令模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解命令模式的动机,掌握该模式的结构;2、能够利用命令模式解决实际问题。 [实验任务一]:多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列......
  • 【嵌入式】ESP32开发(一)ESP-IDF概述
    文章目录1前言2IDF环境配置3在VSCode中使用IDF3.1使用ESP-IDF例程3.2底部按钮的作用【重要!】3.3高级用法4ESP-IDF框架分析5从零开始创建一个项目5.1组件(component)6主要参考资料7遇到的一些问题与解决办法8对于ESP-IDF开发的一些感受......
  • 代码随想录算法训练营day45| 115.不同的子序列 583. 两个字符串的删除操作 72.
    学习资料:https://programmercarl.com/0115.不同的子序列.html#算法公开课动态规划系列之编辑距离问题学习记录:115.不同的子序列(当遇到相同字母时,可以选择也可以不选;刚开始没看懂;dp[i][j]是对应i-1结尾和j-1结尾,这样的目的是方便第一行和第一列初始化)点击查看代码classSolut......
  • 【ESP32】DIY一个电子测光仪
    这里写目录标题0前言1开箱2过程2.1下载固件2.2烧录固件2.3编程环境Thonny2.4点灯大师2.5TFT屏幕2.6BH1750传感器成果展示0前言开发板:ESP32-S3-5691开发环境:circuitpython+thony1开箱2过程2.1下载固件使用circuitpython的方式开发,需要先安装......
  • WebXR:增强现实(AR)基础理论_2024-07-26_15-35-39.Tex
    WebXR:增强现实(AR)基础理论WebXR:增强现实(AR)基础理论WebXR简介WebXR的历史与发展WebXR是WebXRDeviceAPI的简称,它是一个由Web标准组织W3C开发的API,旨在为Web开发者提供一个统一的接口,用于创建虚拟现实(VR)和增强现实(AR)体验。WebXR的历史可以追溯到2016年,当......
  • WebXR与WebGL集成开发教程_2024-07-26_15-03-25.Tex
    WebXR与WebGL集成开发教程WebXR简介WebXR的由来与优势WebXR是WebXRDeviceAPI的简称,它是一个用于在Web浏览器中创建沉浸式虚拟现实(VR)和增强现实(AR)体验的API。WebXR的设计旨在提供一个统一的接口,让开发者能够更容易地在不同的设备和平台上创建和部署XR(扩......
  • WebXR:虚拟现实(VR)基础理论_2024-07-26_15-18-02.Tex
    WebXR:虚拟现实(VR)基础理论WebXR:虚拟现实(VR)基础理论WebXR简介WebXR的历史与发展WebXR是WebXRDeviceAPI的简称,它是一个用于在网页上创建沉浸式虚拟现实(VR)和增强现实(AR)体验的API。WebXR的目标是简化开发者在不同设备和平台上创建XR体验的过程,提供一个......
  • [题解]P3119 [USACO15JAN] Grass Cownoisseur G
    P3119[USACO15JAN]GrassCownoisseurG显然我们可以先跑强连通分量,由\(x\)个点缩成的新点\(u\)权值为\(v[u]=x\)。下文中的节点\(1\)均表示缩点后节点\(1\)所在的节点。我们在缩点后的DAG上跑拓扑排序,预处理出\(fa[i]\)和\(fb[i]\),分别表示“\(1\)到\(i\)路径的点权和”,“\(i......
  • 大模型--Megatron TP张量并行-15
    目录1.参考2.介绍3.权重的切分3.1按行切分权重3.2按列切分权重4.MLP层5.Self-Attention层6.Embedding层7.Cross-entropy层8.张量模型并行+数据并行1.参考https://zhuanlan.zhihu.com/p/6222122282.介绍流水线并行数据并行(DP,DDP和ZeRO)介绍最重要,也是目前基于Tr......