标题:
STM32驱动摄像头ov7670源程序
[打印本页]
作者:
51hei学习技术中
时间:
2016-10-11 18:27
标题:
STM32驱动摄像头ov7670源程序
0.png
(54.96 KB, 下载次数: 131)
下载附件
2016-10-11 18:24 上传
本摄像头ov7670驱动程序已经通过本人的验证可以正常运行,不同的stm32开发板只需要修改引脚即可使用,所有内容打包下载:
stm32驱动摄像头ov7670源程序.7z
(380.01 KB, 下载次数: 637)
2024-11-14 15:20 上传
点击文件名下载附件
下载积分: 黑币 -5
下面是部分源码预览:
/*
wangguanfu@163.com
未经过本人许可禁止任何商业用途
*/
#include "Sensor.h"
#include "delay.h"
#include "Sensor_config.h"
#include "stm32f10x.h"
extern const char OV7670_reg[OV7670_REG_NUM][2];
////////////////////////////
//功能:提供时钟
//guanfu_wang
/*
void XCLK_init_ON(void)//没有用到的函数
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_MCOConfig(RCC_MCO_HSE );//hsi
}
*/
/////////////////////////////
//VSYNC GPIO INIT
//guanfu_wang
void Sensor_GPIO_Init(void)//
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable GPIOC clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = Sensor_VSYNC_BIT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;////上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//////////////////////////////////////////////////
////函数功能:中断配制
//guanfu_wang
void Sensor_Interrupts_Config(void)//VSYNC 中断
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the EXTI9_5 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
////////////////////////////////////////////////////////////////////////
void Sensor_EXTI_Config(void)//VSYNC 中断
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PORT_SOURCE_VSYNC_CMOS, GPIO_PIN_SOURCE_VSYNC_CMOS);
EXTI_InitStructure.EXTI_Line = EXTI_LINE_VSYNC_CMOS;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_GenerateSWInterrupt(EXTI_LINE_VSYNC_CMOS);
}
///////////////////////////////////////////////////////////////////////////
//功能:写OV7660寄存器
//返回:1-成功 0-失败
//guanfu_wang
unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
{
startSCCB();//发送SCCB 总线开始传输命令
if(0==SCCBwriteByte(0x42))//写地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(20);
if(0==SCCBwriteByte(regID))//积存器ID
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(20);
if(0==SCCBwriteByte(regDat))//写数据到积存器
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
stopSCCB();//发送SCCB 总线停止传输命令
return(1);//成功返回
}
////////////////////////////
//功能:读OV7660寄存器
//返回:1-成功 0-失败
//guanfu_wang
unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
{
//通过写操作设置寄存器地址
startSCCB();
if(0==SCCBwriteByte(0x42))//写地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(20);
if(0==SCCBwriteByte(regID))//积存器ID
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
stopSCCB();//发送SCCB 总线停止传输命令
delay_us(20);
//设置寄存器地址后,才是读
startSCCB();
if(0==SCCBwriteByte(0x43))//读地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(20);
*regDat=SCCBreadByte();//返回读到的值
noAck();//发送NACK命令
stopSCCB();//发送SCCB 总线停止传输命令
return(1);//成功返回
}
/* Sensor_init() */
//返回1成功,返回0失败
//guanfu_wang
unsigned char Sensor_init(void)
{
unsigned char temp;
unsigned int i=0;
// XCLK_init_ON();//开启MCO功能 提供时钟给CMOS传感器
//uchar ovidmsb=0,ovidlsb=0;
Sensor_GPIO_Init();
SCCB_GPIO_Config();//io init..
temp=0x80;
if(0==wr_Sensor_Reg(0x12, temp)) //Reset SCCB
{
return 0 ;//错误返回
}
Delay(1);
if(0==rd_Sensor_Reg(0x0b, &temp))//读ID
{
return 0 ;//错误返回
}
if(temp==0x73)//OV7670
{
for(i=0;i<OV7670_REG_NUM;i++)
{
if( 0==wr_Sensor_Reg(OV7670_reg[i][0],OV7670_reg[i][1]))
{
return 0;//错误返回
}
}
Sensor_EXTI_Config();
Sensor_Interrupts_Config();
}
return 0x01; //ok
}
///////////////////
复制代码
/*
wangguanfu@163.com
未经过本人许可禁止任何商业用途
*/
#include "sccb.h"
#include "delay.h"
#include "stm32f10x.h"
/*
-----------------------------------------------
功能: 初始化模拟SCCB接口
参数: 无
返回值: 无
-----------------------------------------------
*/
void SCCB_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCCB_SIC_BIT|SCCB_SID_BIT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SCCB_SID_GPIO_OUTPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCCB_SID_BIT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SCCB_SID_GPIO_INPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCCB_SID_BIT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉 若无外部上拉电阻 必须内部有上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
-----------------------------------------------
功能: start命令,SCCB的起始信号
参数: 无
返回值: 无
-----------------------------------------------
*/
void startSCCB(void)
{
SCCB_SID_H(); //数据线高电平
delay_us(50);
SCCB_SIC_H(); //在时钟线高的时候数据线由高至低
delay_us(50);
SCCB_SID_L();
delay_us(50);
SCCB_SIC_L(); //数据线恢复低电平,单操作函数必要
delay_us(50);
}
/*
-----------------------------------------------
功能: stop命令,SCCB的停止信号
参数: 无
返回值: 无
-----------------------------------------------
*/
void stopSCCB(void)
{
SCCB_SID_L();
delay_us(50);
SCCB_SIC_H();
delay_us(50);
SCCB_SID_H();
delay_us(50);
}
/*
-----------------------------------------------
功能: noAck,用于连续读取中的最后一个结束周期
参数: 无
返回值: 无
-----------------------------------------------
*/
void noAck(void)
{
SCCB_SID_H();
delay_us(50);
SCCB_SIC_H();
delay_us(50);
SCCB_SIC_L();
delay_us(50);
SCCB_SID_L();
delay_us(50);
}
/*
-----------------------------------------------
功能: 写入一个字节的数据到SCCB
参数: 写入数据
返回值: 发送成功返回1,发送失败返回0
-----------------------------------------------
*/
unsigned char SCCBwriteByte(unsigned char m_data)
{
unsigned char j,tem;
for(j=0;j<8;j++) //循环8次发送数据
{
if((m_data<<j)&0x80)
{
SCCB_SID_H();
}
else
{
SCCB_SID_L();
}
delay_us(50);
SCCB_SIC_H();
delay_us(50);
SCCB_SIC_L();
delay_us(2);
}
//delay_us(50);
SCCB_SID_IN;/*设置SDA为输入*/
delay_us(10);
SCCB_SIC_H();
delay_us(80);
if(SCCB_SID_STATE){tem=0;} //SDA=1发送失败,返回0}
else {tem=1;} //SDA=0发送成功,返回1
SCCB_SIC_L();
delay_us(50);
SCCB_SID_OUT;/*设置SDA为输出*/
return (tem);
}
/*
-----------------------------------------------
功能: 一个字节数据读取并且返回
参数: 无
返回值: 读取到的数据
-----------------------------------------------
*/
unsigned char SCCBreadByte(void)
{
unsigned char read,j;
read=0x00;
SCCB_SID_IN;/*设置SDA为输入*/
delay_us(50);
for(j=8;j>0;j--) //循环8次接收数据
{
//delay_us(100);
SCCB_SIC_H();
delay_us(50);
read=read<<1;
if(SCCB_SID_STATE)
{
read=read+1;
}
SCCB_SIC_L();
delay_us(50);
}
SCCB_SID_OUT;/*设置SDA为输出*/
return(read);
}
复制代码
作者:
我叫蔡大炮
时间:
2017-3-10 16:50
这个资料来的太及时了!!
作者:
simonliu009
时间:
2017-3-29 15:59
这个资料很好,关于摄像头的资料不多
作者:
liangzz
时间:
2017-5-17 16:54
不错,谢谢分享了!!!!!
作者:
MAPPLE
时间:
2017-7-14 10:22
我想看看 但是积分不够
作者:
xiaoxin...
时间:
2017-8-3 19:24
同积分不够
作者:
麦兜堡
时间:
2017-8-5 03:52
SBBC.C中 SCCB_SID_L()的GPIOB->BRR这个是什么寄存器,在32手册上无法找到,只在串口中才有BRR这个寄存器
作者:
_少年放肆的梦
时间:
2017-8-5 12:08
谢谢楼主
作者:
学海无涯回头吧
时间:
2017-8-6 09:40
好像学习啊
作者:
yangkun666
时间:
2017-8-7 13:54
感谢,不过积分不够啊
作者:
张维_1
时间:
2017-9-26 09:09
国内就少开源的精神
作者:
一个人丶一座城
时间:
2017-9-28 14:01
厉害了,值得学习!
作者:
Jason9090
时间:
2017-9-28 21:08
这个资料很好,关于摄像头的资料不多
作者:
zqh_11
时间:
2017-10-19 19:18
非常好
作者:
zjy007
时间:
2017-10-20 15:14
这是不是正点原子的资料a
作者:
iBoxmm
时间:
2017-11-29 13:01
好啊,非常有用
作者:
南瓜
时间:
2018-1-23 10:34
楼主你好,你用的摄像头是自带FIFO的OV7670吗?
作者:
zhouwen
时间:
2018-2-18 19:20
引脚是如何连接的呢?
作者:
cnc2020
时间:
2018-2-19 00:18
good job!!!
作者:
taylorzlin
时间:
2018-2-23 11:38
想看,积分不够
作者:
quyidy
时间:
2018-2-24 20:55
赚赚积分! 想看!
作者:
WANGxxx
时间:
2018-4-28 21:20
可不可以给个引脚连接?
1371177469@qq.com
作者:
1172044205
时间:
2018-11-17 09:40
楼主这个摄像头引脚是几个,有直接以VCC GND RX TX 连出的串口摄像头的吗?直接以串口形式输出
作者:
gjgygwc
时间:
2018-12-21 19:37
楼主用的摄像头带有fifo吗
作者:
zsm100
时间:
2018-12-28 10:46
刚好要用这东西
作者:
jiangkeqin_sy
时间:
2019-1-23 08:42
这个资料很好,关于摄像头的资料不多
作者:
vince2008
时间:
2019-5-12 23:42
谢谢,学习了
作者:
形象代言人o
时间:
2019-5-13 11:11
感谢楼主的热心分享
作者:
离落城
时间:
2019-5-16 16:21
资料已下载。等配件回来试试
作者:
055441
时间:
2019-7-18 16:52
绝世好帖
作者:
m182892
时间:
2019-7-19 16:22
有原理图就好了。
作者:
zyluglugl
时间:
2023-11-12 14:42
太感谢了,这个是基于普通IO接收的吗?
作者:
yang9622
时间:
2025-1-8 16:24
这个资料很好,关于摄像头的资料不多。
作者:
playplay
时间:
2025-3-8 08:44
新手前来学习,感谢分享!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1