用了三天的时间,终于搞定了程序的移植。也是第一次移植stm32程序。
最终的移植成功版本,改了SCCB通信、FIFO读写时序、寄存器配置、引脚修改的一些地方。
一、移植过程中SCCB通信遇到的问题
1.由于野火的OV7725摄像头内置上拉电阻,所以在配置时SDA和SDL都被设置成了Mode_OD (开漏模式),但是战舰带的OV7670摄像头并没有内置上拉电阻,所以不能用开漏模式,否则不能正常输出高电平,SDA线也不会被主机拉高。
于是参考了战舰的例程。战舰对SCL线设置为了PP(推挽输出模式),SDA线的输出则需要切换。如下:
#define SCCB_ SDA_ IN()  {GPI0G->CRH &= 0XFFOFFFFF; GPIOG->CRH |=0X00800000; }
#define SCCB_ SDA_ OUT() {GPI0G->CRH &= 0XFFOFFFFF; GPIOG->CRH |=0X00300000; }
在战舰的例程上进行修改时,由于需要修改一些IO口,所以需要把这句改掉。我尝试用这样的手法修改:
#define SCCB_ SDA_ IN do{    GPIO_InitTypeDefGPIO_InitStructure;\GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\GPIO_InitStructure.GPIO_Pin = macOV7725_SIO_D_GPIO_PIN;\GPIO_InitStructure.GPIO Mode = GPIO_Mode_IPU;\GPIO_Init(mac0V7725_SIO_D_GPIO_ PORT, &GPIO_ InitStructure); \GPIO_SetBits(macOV7725_SIO_D_GPIO_PORT, macOV7725_SIO_D_GPIO_PIN);\}while(0);
发现并不可行。查询网络,原因可能是在运行中途修改管脚模式时,由于32的LCKK:锁密钥,并不能直接修改管脚工作模式。我们选择对底层寄存器进行操作。。
于是乎这样改:
#define SCCB_SDA_IN  {GPIOC->CRL &= 0XOFFFFFFF;GPIOC->CRL = 0X80000000; }
#define SCCB_SDA_OUT {GPIOC->CRL &= 0XOFFFFFFF;GPIOC->CRL = 0X30000000; }
*注:SDA为PC7口。
2. 还有需要修改的地方就是:在需要读取SDA电平状态的时候,要用SCCB_SDA_IN 这个语句把替换掉SDA_H,而不是先SDA_H 然后再SCCB_SDA_IN 。否则不能正确读取到SDA线的电平。
3.最后一步,器件ID:
#define 0V7670_ID  0x73
在这一段代码用到:
if(Sensor_IDCode == 0V7670_ID)
{for( i = 0; i < 0V7670_REG_NUM ; i++ ){if( 0 == SCCB_ WriteByte(Sensor_Config[i].Address, Sensor_Config[i].Value) )//DEBUG("write reg faild", Sensor_Config[i].Address);return ERROR;}
}
二、FIFO读数据时序的修改
1.由于每个人选择的数据口可能不同,有的是0-7位,有的是8-15位,所以我这里给出了两种不同的读取时序。
H_MY_READ_FIFO_PIXEL(YUV)是当数据位选择的是8-15位时候用的;
L_MY_READ_FIFO_PIXEL(YUV)是当数据位选择的是0-7位时候用的。
*注:因为我要的二值化的图像,所以只读取了YUV 分量中的Y分量。
#define H_MY_READ_FIFO_PIXEL(YUV) do{\YUV = 0;\FIFO_RCLK_L();\YUV = (macOV7670_DATA_GPI0_PORT->IDR >> 8) & 0xff;\FIFO_RCLK_H();\FIFO_RCLK_L();\FIFO_RCLK_H();\}while(0)
#define L_MY_READ_FIFO_PIXEL(YUV) do{\ YUV = 0;\FIFO_RCLK_L();\YUV = (mac0V7670_DATA_GPIO_PORT->IDR) & 0xff;\FIFO_RCLK_H();\FIFO_RCLK_L();\FIFO_RCLK_H();\}while(0)

下面这段代码是读取RGB565的:

#define READ_FIFO_PIXEL(RGB565)   do{\RGB565=0;\FIFO_RCLK_L();\RGB565 = (mac0V7670_DATA_GPIO_PORT->IDR) & 0xff00;\FIFO_RCLK_H();\FIFO_RCLK_L();\RGB565 = (mac0V7670_DATA_GPI0_PORT->IDR >>8) & 0x00ff;\FIFO_RCLK_H();\}while(0)
三、寄存器的配置
1. 我用的YUV,没有给每位寄存器重定义。所以要结合Datasheet自行查看。
    /*以下为 YUV参数设置*/
    {0x12, 0x10},
    {0x3a, 0x14},
    {0x3d, 0x80},
    //0         0       :      Y U Y V (3a:14 3d:80)
    //0         1       :      Y V Y U  (3a:14 3d:81)
    //1         0       :      U Y V Y (3a:18 3d:80)
    //1         1       :      V Y U Y (3a:18 3d:81)
    {0x67, 0x11},        //手工设置 U
    {0x68, 0xFF},        //手工设置 V
    {0x40, 0xC0},        //YUV输出
    //输出窗口设置
    {0x32, 0x80}, //HREF
    {0x17, 0x16},  //HSTART      
    {0x18, 0x04},//HSTOP
    {0x19, 0x02},//VSTRT
    {0x1a, 0x7a},//0x7a, VSTOP
     {0x03, 0x0a},//0x0a, VREF
    {0x0c, 0x0c},
    {0x15, 0x00},
    {0x3e, 0x00},//10
    {0x70, 0x00},
    {0x71, 0x01},
    {0x72, 0x11},
    {0x73, 0x09},//
    {0xa2, 0x02},//15
    {0x11, 0x00},//时钟分频设置,0,不分频.
    {0x7a, 0x20},
    {0x7b, 0x1c},
    {0x7c, 0x28},
    {0x7d, 0x3c},//20
    {0x7e, 0x55},
    {0x7f, 0x68},
    {0x80, 0x76},
    {0x81, 0x80},
    {0x82, 0x88},
    {0x83, 0x8f},
    {0x84, 0x96},
    {0x85, 0xa3},
    {0x86, 0xaf},
    {0x87, 0xc4},//30
    {0x88, 0xd7},
    {0x89, 0xe8},
    {0x13, 0xe0},
    {0x00, 0x00},//AGC
    {0x10, 0x00},
    {0x0d, 0x00}, 
    {0x14, 0x20},//0x38, limit the max gain
    {0xa5, 0x05},
    {0xab, 0x07},
    {0x24, 0x75},//40
    {0x25, 0x63},
    {0x26, 0xA5},
    {0x9f, 0x78},
    {0xa0, 0x68},
    {0xa1, 0x03},//0x0b,
    {0xa6, 0xdf},//0xd8,
    {0xa7, 0xdf},//0xd8,
    {0xa8, 0xf0},
    {0xa9, 0x90},
    {0xaa, 0x94},//50
    {0x13, 0xe5},
    {0x0e, 0x61},
    {0x0f, 0x4b},
    {0x16, 0x02},
    {0x1e, 0x27},//图像输出镜像控制.0x07,
    {0x21, 0x02},
    {0x22, 0x91},
    {0x29, 0x07},
    {0x33, 0x0b},
    {0x35, 0x0b},//60
    {0x37, 0x1d},
    {0x38, 0x71},
    {0x39, 0x2a},
    {0x3c, 0x78},
    {0x4d, 0x40},
    {0x4e, 0x20},
    {0x69, 0x5d},
    {0x6b, 0x40},//PLL*4=48Mhz
    {0x74, 0x19},
    {0x8d, 0x4f},
    {0x8e, 0x00},//70
    {0x8f, 0x00},
    {0x90, 0x00},
    {0x91, 0x00},
    {0x92, 0x00},//0x19,//0x66
    {0x96, 0x00},
    {0x9a, 0x80},
    {0xb0, 0x84},
    {0xb1, 0x0c},
    {0xb2, 0x0e},
    {0xb3, 0x82},//80
    {0xb8, 0x0a},
    {0x43, 0x14},
    {0x44, 0xf0},
    {0x45, 0x34},
    {0x46, 0x58},
    {0x47, 0x28},
    {0x48, 0x3a},
    {0x59, 0x88},
    {0x5a, 0x88},
    {0x5b, 0x44},//90
    {0x5c, 0x67},
    {0x5d, 0x49},
    {0x5e, 0x0e},
    {0x64, 0x04},
    {0x65, 0x20},
    {0x66, 0x05},
    {0x94, 0x04},
    {0x95, 0x08},
    {0x6c, 0x0a},
    {0x6d, 0x55},
    {0x4f, 0x80},
    {0x50, 0x80},
    {0x51, 0x00},
    {0x52, 0x22},
    {0x53, 0x5e},
    {0x54, 0x80},
    //{0x54, 0x40},//110
    {0x09, 0x03},//驱动能力最大
    {0x6e, 0x11},//100
    {0x6f, 0x9f},//0x9e for advance AWB
    {0x55, 0x00},//亮度
    {0x56, 0x40},//对比度
    {0x57, 0x80},//0x40

2.RGB565的配置:

/*以下为OV7670 QVGA RGB565参数  */
    {0x3a, 0x04},//
    {0x40, 0x10},
    {0x12, 0x14},
    {0x32, 0x80},
    {0x17, 0x16},
    {0x18, 0x04},//5
    {0x19, 0x02},
    {0x1a, 0x7b},//0x7a,
    {0x03, 0x06},//0x0a,
    {0x0c, 0x0c},
    {0x15, 0x02},
    {0x3e, 0x00},//10
    {0x70, 0x00},
    {0x71, 0x01},
    {0x72, 0x11},
    {0x73, 0x09},//
    {0xa2, 0x02},//15
    {0x11, 0x00},
    {0x7a, 0x20},
    {0x7b, 0x1c},
    {0x7c, 0x28},
    {0x7d, 0x3c},//20
    {0x7e, 0x55},
    {0x7f, 0x68},
    {0x80, 0x76},
    {0x81, 0x80},
    {0x82, 0x88},
    {0x83, 0x8f},
    {0x84, 0x96},
    {0x85, 0xa3},
    {0x86, 0xaf},
    {0x87, 0xc4},//30
    {0x88, 0xd7},
    {0x89, 0xe8},
    {0x13, 0xe0},
    {0x00, 0x00},//AGC
    {0x10, 0x00},
    {0x0d, 0x00},
    {0x14, 0x30},//0x38, limit the max gain
    {0xa5, 0x05},
    {0xab, 0x07},
    {0x24, 0x75},//40
    {0x25, 0x63},
    {0x26, 0xA5},
    {0x9f, 0x78},
    {0xa0, 0x68},
    {0xa1, 0x03},//0x0b,
    {0xa6, 0xdf},//0xd8,
    {0xa7, 0xdf},//0xd8,
    {0xa8, 0xf0},
    {0xa9, 0x90},
    {0xaa, 0x94},//50
    {0x13, 0xf5},
    {0x0e, 0x61},
    {0x0f, 0x4b},
    {0x16, 0x02},
    {0x1e, 0x07},//0x07,
    {0x21, 0x02},
    {0x22, 0x91},
    {0x29, 0x07},
    {0x33, 0x0b},
    {0x35, 0x0b},//60
    {0x37, 0x1d},
    {0x38, 0x71},
    {0x39, 0x2a},
    {0x3c, 0x78},
    {0x4d, 0x40},
    {0x4e, 0x20},
    {0x69, 0x5d},
    {0x6b, 0x40},//PLL
    {0x74, 0x19},
    {0x8d, 0x4f},
    {0x8e, 0x00},//70
    {0x8f, 0x00},
    {0x90, 0x00},
    {0x91, 0x00},
    {0x92, 0x00},//0x19,//0x66
    {0x96, 0x00},
    {0x9a, 0x80},
    {0xb0, 0x84},
    {0xb1, 0x0c},
    {0xb2, 0x0e},
    {0xb3, 0x82},//80
    {0xb8, 0x0a},
    {0x43, 0x14},
    {0x44, 0xf0},
    {0x45, 0x34},
    {0x46, 0x58},
    {0x47, 0x28},
    {0x48, 0x3a},
    {0x59, 0x88},
    {0x5a, 0x88},
    {0x5b, 0x44},//90
    {0x5c, 0x67},
    {0x5d, 0x49},
    {0x5e, 0x0e},
    {0x64, 0x04},
    {0x65, 0x20},
    {0x66, 0x05},
    {0x94, 0x04},
    {0x95, 0x08},
    {0x6c, 0x0a},
    {0x6d, 0x55},
    {0x4f, 0x80},
    {0x50, 0x80},
    {0x51, 0x00},
    {0x52, 0x22},
    {0x53, 0x5e},
    {0x54, 0x80},
    //{0x54, 0x40},//110
    {0x6e, 0x11},//100
    {0x6f, 0x9f},//0x9e for advance AWB
    {0x55, 0x00},//亮度
    {0x56, 0x45},//对比度
    {0x57, 0x80},//0x40
四、移植过程中引脚的修改
1.外部中断的修改
我需要修改的引脚有FIFO-OE    /    FIFO-RCLK    /    FIIFO-RRST    /    SCL    /    SDA    /    VSYNC    /    WRST
其他的不用多说,VSYNC需要修改的地方还是蛮多的~(我用的外部中断口是PB13)
#define macOV7670_VSYNC_SCK_APBxClock_FUN      RCC_APB2PeriphClockCmd
#define mac0V7670_VSYNC_GPIO_CLK                RCC_APB2Periph_GPIOB
#define mac0V7670_VSYNC_GPIO_AFIO               RCC_APB2Periph_AFIO
#define macOV7670_VSYNC_GPIO_PORT               GPIOB
#define mac0V7670_VSYNC_GPIO_PIN                GPIO_Pin_13
#define macOV7670_VSYNC_EXTI_SOURCE_PORT        GPIO_PortSourceGPIOB
#define mac0V7670_VSYNC_EXTI_SOURCE_PIN         GPIO_PinSource13
#define macOV7670_VSYNC_EXTI_LINE               EXTI_Line13
#define macOV7670_VSYNC_EXTI_IRQ                EXTI15_10_IRQn
#define macOV7670_VSYNC_EXTI_INT_FUNCTION       EXTI15_10_IRQHandler
其中需要注意的是:macOV7670_VSYNC_EXTI_IRQ这个,Pin13口需要用这个,具体用哪个要查书。
2. AFIO时钟的开启
当你需要的外部中断不是32自带的外部中断引脚时候,必须开启AFIO时钟。
当把GPIO用作EXTI外部中断或使用重映射功能的时候,必须开启AFIO时钟,而在使用默认复用功能的时候,就不必开启AFIO时钟了。
#define mac0V7670_VSYNC_GPIO_AFIO RCC_APB2Periph_AFIO
/**************************************
*函数名: VSYNC_ GPIO Configuration
*描述: 0V7670 GPIO配置
”输入:无
*输出:无
*注意:无
***************************************/
static void VSYNC_GPIO_Configuration(void)
{GPI0_InitTypeDef GPIO_InitStructure;macOV7670_VSYNC_SCK_APBxClock_FUN ( mac0V7670 VSYNC_GPIO_CLK | macOV7670_VSYNC_GPI0_AFIO, ENABLE );    /*PB13---VSYNC*/GPI0_InitStructure.GPIO_Pin = mac0V7670_VSYNC_GPI0_PIN;GPI0_InitStructure.GPIO_Mode = GPIO_ Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_Init(mac0V7670_VSYNC_GPIO_PORT, &GPIO_InitStructure);
}

关于【野火】OV7725例程移植【OV7670】总结相关推荐

  1. harmonyos能否移植到MCU,HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验

    HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验 硬件平台 基于正点原子战舰V3开发板 MCU:STM32F103ZET6 片上SRAM大小:64KBytes 片上FLASH大小 ...

  2. lora 移植到android_LoRa---官方例程移植

    SX1278芯片上移植Semtech官方PING-PONG例程 移植环境:keil5.20 硬件平台:stm32f051+sx1278 2.准备文件: SX12xxDrivers-V2.1.0文件夹下 ...

  3. STM32F407开发板的HTTP模式IAP远程升级之官方例程移植

    版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/wbdxz/article/details/82859237 关于远程升级的模板建立,可以参考下面的博文 ST ...

  4. 基于CubeMX-STM32F302_uCOSII例程移植

    基于CubeMX-STM32F302_uCOSII例程移植 1.说明 STM32F302的内核为Cortex-M4的,所以我们以官方的F4例程为基础移植. 2.准备 2.1.软件 1.官方例程源码:M ...

  5. 移植野火ucos例程stm32F103ZET6到C8T6上时,遇到内存溢出的问题,以及解决方法

    1.更改完单片机型号后,编译工程后,出现内存溢出错误, .\Objects\ISO-STM32.axf: Error: L6406E: No space in execution regions wi ...

  6. 正点原子STM32F4探索者开发板HAL库触摸屏例程移植到STM32CubeMX+CLion

    前言 本次移植我们将在移植好的TFT LCD屏幕例程的基础上进行修改 正文 我们打开STM32CubeMX文件,并配置好一个1us的定时器,我这里使用的是定时器6 我这里的系统时钟频率是168M,定时 ...

  7. 基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程移植到自己做的板子上

    原程序是运行在小梅哥AC620开发板上的:基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程_ZLK1214的专栏-CSDN博客_小梅哥ac620[开发板]开发板型号:小梅哥AC620 ...

  8. 设备接入ONENET(3)STM32 + ESP8266(MQTT协议)接入云 :官方例程移植笔记(HAL+LL库)

    重要提示:由于OneNET版本迭代,导致鉴权方式可能变更,若程序无法连接,请参考官方手册或再OneNET论坛搜索相关内容 移植本意应该是指通过修改,使得运行原先在另一个平台可运行的程序. STM32C ...

  9. seetaface2例程移植至Qt

    参考博客:https://blog.csdn.net/sinat_33896833/article/details/100183581 这篇博客写的很好,感谢博主的分享.我简要的说明几点我遇到的问题( ...

  10. 关于正点原子STM32的MDK例程移植到IAR中遇到的错误解决方法 __use_no_semihosting

    在移植过程中,估计大部分人应该都又遇到这类问题,主要是usart.c和sys.c这两个文件. 现贴出修改之前和修改之后的代码: usart.c: 之前的代码: #include "sys.h ...

最新文章

  1. 【PHP高效搜索专题(1)】sphinxCoreseek的介绍与安装
  2. webpack如何将css文件分离的,【Webpack小书】Webpack中如何将CSS样式抽取到独立文件中? - Tim的资源站...
  3. mac mysql start 失败_mac mysql 启动出错,请教解决办法
  4. samba客户端的总结与归纳
  5. windows下安装vundle
  6. 工业以太网交换机出现温度过高如何处理?
  7. sql语句中的in用法示例_PHP中的循环语句和示例
  8. 熊猫“大虾”-03/07/2011开始修炼
  9. 入门机器学习(六)--课后作业解析-logistics回归(python实现)
  10. mysql ---- 多表查询
  11. bzoj 1664 (贪心)
  12. 奥鹏19春计算机应用基础,19春西南交《计算机应用基础》在线作业二(答案)-...
  13. Javascript 高级程序设计笔记 (cha5 引用类型)
  14. mac 设置mysql登录快捷键_史上最详细的苹果Macbook快捷键使用
  15. 2015——那年、匆匆
  16. 关于vscode中出现gopls was not able to find modules in your workspace报错的解决方案
  17. 计算机网络基础知识及面试总结-这应该是最全的了
  18. 7-3 干支纪年法 (100 分)
  19. 排名趋于稳定后,最新的博主排名(TOP10)
  20. 如何实现水泥窑分散点信号集中控制?

热门文章

  1. bzoj 4484 [Jsoi2015]最小表示
  2. 从七桥问题开始:全面介绍图论及其应用
  3. WPS制作的电子签名有法律效力吗
  4. python全栈开发包括那些_什么是全栈工程师?有哪些知识?
  5. 打工就是 “演戏”,你可以认真,但别太当真
  6. CHUA 返回的矢量的长度为 3,但初始条件矢量的长度为 4。CHUA 返回的矢量和初始条件矢量的元素数目必须相同。
  7. 华为p20nfc怎么复制门禁卡_华为荣耀手机的NFC功能怎么用?怎么刷门禁卡
  8. 蓝桥杯2020第二场JAVA C真题
  9. Navicat15导入DMP数据文件
  10. 美国 android手机号码,格式编辑文本为美国电话号码1(xxx)-xxxx你在android中键入?...