⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 STM32F103VET6驱动CMOS摄像头
💻 C
字号:
/**
  ******************************************************************************
  * @file    Project/Template/main.c 
  * @author  MCD Application Team
  * @version V3.0.0
  * @date    04/06/2009
  * @brief   Main program body
  ******************************************************************************
  * @copy
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
  */ 

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "ili9481.h"

#include "OV7670.h"
#include "Usart1.h"	
#include "delay.h"
#include "FIFO.h"


static __IO uint32_t TimingDelay;

extern u32 Txt_Color,Back_Ground;
extern unsigned char VsyncCnt;//场同步标志
/********************************************
**函数名:SysTickDelay
**功能:使用系统时钟的硬延迟
**注意事项:一般地,不要在中断中调用本函数,否则会存在重入问题.另外如果屏蔽了全局中断,则不要使用此函数
********************************************/
void Delay(__IO uint32_t nTime)
{ 
  TimingDelay = nTime;

  while(TimingDelay != 0);
}

/**
  * @brief  Decrements the TimingDelay variable.
  * @param  None
  * @retval : None
  */
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}
//延时ms
void delay_ms(u16 nms)
{	 		  	  
	Delay(1000*nms);  	    
}   
//延时us								   
void delay_us(u32 nus)
{		
	Delay(nus);   
}

void EXTI_Config(void)
{
	EXTI_InitTypeDef EXTI_InitStructure;
	//EXTI_StructInit(&EXTI_InitStructure);
				 	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);	//管脚选择
	
	EXTI_ClearITPendingBit(EXTI_Line13);

	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_Line = EXTI_Line13;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
}


/**
  * @brief  Configures the nested vectored interrupt controller.
  * @param  None
  * @retval : None
  */
void NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure; 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
	
	//EXTI4											
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;	  //通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	  //
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

int main(void)
{   
	u32 i = 0;
	u16 j = 0;
	u16 temp = 0;
	u16 data = 0;
	
	u16 buffer[240] = {0};
	
	u16 t = 0;
	SystemInit();
	if (SysTick_Config(72))
	{ 
	    /* Capture error */ 
	   while (1);
	}
	Usart_Configuration();
	FIFO_PortInit();
	FIFO_WRST_L;						//写指针复位,开始往FIFO写入数据		
	Delay_nUS(100);
	FIFO_WRST_H;
	
	FIFO_RRST_L;						//写指针复位,开始往FIFO写入数据		
	Delay_nUS(100);
	FIFO_RRST_H;

	FSMC_LCD_Init();
	TFT_Init_Config();
	TFT_Clear( 0x87e0 );

	EXTI_Config();
	NVIC_Config();
	while(1)
	{
		if(OV7670_init())
		{
			break;
		}
	}
	TFT_Clear( 0x5678 );
	FIFO_OE_L;
	while(1)
	{
		if(1)//
		{	
			if(VsyncCnt == 2)
			{
											//0地址读数据,硬件已将OE和RE连在一起
				TFT_WriteRAM_Prepare();
				TFTSetXY(0,0);
				t = 0;
				for(i = 0; i < 240; i ++)	//QVGA格式,240行;每行320个点		
				{
					for(j = 0; j < 320; j ++)
					{
						FIFO_RCLK_L;
						__nop();
						__nop();
						FIFO_RCLK_H;
						__nop();
						__nop();
						data = FIFO_DATA_PIN;
						data <<= 8;			//先读高位							

						FIFO_RCLK_L;
						__nop();
						__nop();
						FIFO_RCLK_H;
						__nop();
						__nop();
						//Delay_nUS(1);
						temp = FIFO_DATA_PIN;//再读低位							
						
						data |= temp ;
						
						TFT_WriteData(data);	//显示读到的数据(RGB565)			
					}
				}
				
				FIFO_RRST_L;				//读指针复位						
				
				FIFO_RCLK_L;				//至少需要一个时钟周期的跳变才能复位
				FIFO_RCLK_H;
				FIFO_RCLK_L;				//至少需要一个时钟周期的跳变才能复位
				FIFO_RCLK_H;
				
				FIFO_RRST_H;
				
				FIFO_WEN_L;					//按照手册上说明,复位时WEN要置高,但 
				FIFO_WRST_L;				//MCU的WEN和HREF是做与非逻辑后再输入								
				__nop();					//到AL422B的,所以MCU的WEN置低则输出到422的WEN一定为低
				__nop();					//写指针复位需要一定的延时			
				FIFO_WRST_H;
				VsyncCnt = 0;				//开始下一帧数据采集				
			}
		}
	}    
}

 


#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/**
  * @}
  */


/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -