本帖最后由 吴伟镖 于 2013-9-25 09:57 编辑
先上传代码,这是我用OV7670摄像头+野火
开发板的液晶显示屏做的移植但发现VSYNC检测不到信号,导致进入不到中断,我检测了摄像头初始化正常的,我中断函数写的也是正常的。请教各位大神什么问题呢
//主函数
#include "
STM32f10x.h"
#include "lcd_botton.h"
#include "fifo.h"
#include "sensor.h"
#include "Sys
tick.h"
unsigned char i;
static volatile ErrorStatus HSEStartUpStatus = SUCCESS;
static vu32 TimingDelay = 0;
static vu32 SELStatus = 0;
extern unsigned int a, bn,c_data;
unsigned int kkk=0,s=0;
unsigned int M=0,N=0;
int main (void)
{
SystemInit();
SysTick_Init();
LCD_Init();
FIFO_Set_GPIO_Config();
FIFO_GPIO_INPUT();
FIFO_CS_L();//准备读数据
FIFO_WE_H();
while(1!=Sensor_init()){}//初始化CMOS Sensor
LCD_open_windows(0, 0, 320, 240);
bn=0;
////////////////////////////////////////
FIFO_RRST_L();
FIFO_RD_L();
FIFO_RD_H();
FIFO_RD_L();
FIFO_RRST_H();
FIFO_RD_H();
Delay_us(5000);
////////////////////////////////////////
while(1)
{
if(bn==2)
{
FIFO_RRST_L();
FIFO_RD_L();
FIFO_RD_H();
FIFO_RD_L();
FIFO_RRST_H();
FIFO_RD_H();
for(a=0;a<9600;a++)
{
FIFO_RD_L();
c_data=GPIOB->IDR&0xff00;//读高位
FIFO_RD_H();
FIFO_RD_L();
c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
FIFO_RD_H();
// LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
LCD_WR_Data(c_data);
FIFO_RD_L();
c_data=GPIOB->IDR&0xff00;//读高位
FIFO_RD_H();
FIFO_RD_L();
c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
FIFO_RD_H();
// LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
LCD_WR_Data(c_data);
FIFO_RD_L();
c_data=GPIOB->IDR&0xff00;//读高位
FIFO_RD_H();
FIFO_RD_L();
c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
FIFO_RD_H();
// LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
LCD_WR_Data(c_data);
FIFO_RD_L();
c_data=GPIOB->IDR&0xff00;//读高位
FIFO_RD_H();
FIFO_RD_L();
c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
FIFO_RD_H();
// LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
LCD_WR_Data(c_data);
FIFO_RD_L();
c_data=GPIOB->IDR&0xff00;//读高位
FIFO_RD_H();
FIFO_RD_L();
c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
FIFO_RD_H();
// LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
LCD_WR_Data(c_data);
FIFO_RD_L();
c_data=GPIOB->IDR&0xff00;//读高位
FIFO_RD_H();
FIFO_RD_L();
c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
FIFO_RD_H();
// LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
LCD_WR_Data(c_data);
FIFO_RD_L();
c_data=GPIOB->IDR&0xff00;//读高位
FIFO_RD_H();
FIFO_RD_L();
c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
FIFO_RD_H();
// LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
LCD_WR_Data(c_data);
FIFO_RD_L(); ;
c_data=GPIOB->IDR&0xff00;//读高位
FIFO_RD_H();
FIFO_RD_L();
c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
FIFO_RD_H();
// LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
LCD_WR_Data(c_data);
}
bn=0;
}
}
}
////////////////////////////////////////////////////////////////////////sensor。c/////////////////////////////////////////////////////
#include "sensor.h"
#include "sensor_confi.h"
/////////////////////////////
//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_IN_FLOATING;////浮空
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_us(10000);
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
[0],OV7670_reg[1]))
{
return 0;//错误返回
}
}
Sensor_EXTI_Config();
Sensor_Interrupts_Config();
}
return 0x01; //ok
}
////////////////////////////////SCCB文件//////////////////////////////////////////////////////////////
#include "sccb.h"
/*
-----------------------------------------------
功能: 初始化模拟SCCB接口
参数: 无
返回值: 无
-----------------------------------------------
*/
void SCCB_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, 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(GPIOD, &GPIO_InitStructure);
}
void SCCB_SID_GPIO_OUTPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, 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(GPIOD, &GPIO_InitStructure);
}
void SCCB_SID_GPIO_INPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCCB_SID_BIT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉 若无外部上拉电阻 必须内部有上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &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);
}
//////////////////////////中断函数、、、、、、、、、、、、、、、、、、、、、
#include "stm32f10x_it.h"
#include "SysTick.h"
#include "sensor.h"
#include "fifo.h"
unsigned int bn=0,c=0,a=0,c_data=0;
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_LINE_VSYNC_CMOS) != RESET)
{
if(bn==0)
{
bn=1;
FIFO_WE_H(); //拉高使FIFO写允许
// FIFO_WE_H();
FIFO_WE_H();
}
else if(bn==1)
{
FIFO_WE_L();
bn=2;
}
EXTI_ClearITPendingBit(EXTI_LINE_VSYNC_CMOS);
}
}
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
-
-
OV7670(3.2TFT).zip
下载积分: 积分 -1 分
4.86 MB, 下载次数: 61, 下载积分: 积分 -1 分
我的连线原理图和代码发给你
OV7670(3.2TFT).rar 下载积分: 积分 -1 分
7.19 MB, 下载次数: 119, 下载积分: 积分 -1 分
一周热门 更多>