#include "sys.h" #include "ov2640.h" #include "ov2640cfg.h" //#include "timer.h" #include "delay.h" #include "usart.h" #include "sccb.h" #include "stdio.h" //³õʼ»¯OV2640 //ÅäÖÃÍêÒÔºó,ĬÈÏÊä³öÊÇ1600*1200³ß´çµÄͼƬ!! //·µ»ØÖµ:0,³É¹¦ // ÆäËû,´íÎó´úÂë void OV2640_PWDN(uint8_t signal) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, (GPIO_PinState)signal); } void OV2640_RST(uint8_t signal) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, (GPIO_PinState)signal); } uint8_t OV2640_Init(void) { uint16_t i=0; uint16_t reg; //ÉèÖÃIO GPIO_InitTypeDef GPIO_InitStructure; __HAL_RCC_GPIOG_CLK_ENABLE(); //ʹÄÜGPIOBʱÖÓ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13|GPIO_PIN_15, GPIO_PIN_RESET); //GPIOF9,F10³õʼ»¯ÉèÖà GPIO_InitStructure.Pin = GPIO_PIN_13|GPIO_PIN_15; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Speed = GPIO_SPEED_FAST; GPIO_InitStructure.Pull = GPIO_PULLUP;//ÉÏÀ­ HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ» OV2640_PWDN(0); //POWER ON delay_ms(10); OV2640_RST(0); //¸´Î»OV2640 delay_ms(10); OV2640_RST(1); //½áÊø¸´Î» SCCB_Init(); //³õʼ»¯SCCB µÄIO¿Ú SCCB_WR_Reg(OV2640_DSP_RA_DLMT, 0x01); //²Ù×÷sensor¼Ä´æÆ÷ SCCB_WR_Reg(OV2640_SENSOR_COM7, 0x80); //Èí¸´Î»OV2640 delay_ms(50); reg=SCCB_RD_Reg(OV2640_SENSOR_MIDH); //¶ÁÈ¡³§¼ÒID ¸ß°Ëλ reg<<=8; reg|=SCCB_RD_Reg(OV2640_SENSOR_MIDL); //¶ÁÈ¡³§¼ÒID µÍ°Ëλ printf("OV2640_MID = %#X\n" , reg); if(reg!=OV2640_MID) { printf("MID:%d\r\n",reg); return 1; } reg=SCCB_RD_Reg(OV2640_SENSOR_PIDH); //¶ÁÈ¡³§¼ÒID ¸ß°Ëλ reg<<=8; reg|=SCCB_RD_Reg(OV2640_SENSOR_PIDL); //¶ÁÈ¡³§¼ÒID µÍ°Ëλ if(reg!=OV2640_PID) { printf("HID:%d\r\n",reg); return 2; } for(i=0;i>2); //ÉèÖÃVrefµÄstart¸ß8λ SCCB_WR_Reg(0X1A,endy>>2); //ÉèÖÃVrefµÄendµÄ¸ß8λ temp=SCCB_RD_Reg(0X32); //¶ÁÈ¡Href֮ǰµÄÖµ temp&=0XC0; temp|=((endx&0X07)<<3)|(sx&0X07); SCCB_WR_Reg(0X32,temp); //ÉèÖÃHrefµÄstartºÍendµÄ×îµÍ3λ SCCB_WR_Reg(0X17,sx>>3); //ÉèÖÃHrefµÄstart¸ß8λ SCCB_WR_Reg(0X18,endx>>3); //ÉèÖÃHrefµÄendµÄ¸ß8λ } //ÉèÖÃͼÏñÊä³ö´óС //OV2640Êä³öͼÏñµÄ´óС(·Ö±æÂÊ),ÍêÈ«Óɸĺ¯ÊýÈ·¶¨ //width,height:¿í¶È(¶ÔÓ¦:horizontal)ºÍ¸ß¶È(¶ÔÓ¦:vertical),widthºÍheight±ØÐëÊÇ4µÄ±¶Êý //·µ»ØÖµ:0,ÉèÖóɹ¦ // ÆäËû,ÉèÖÃʧ°Ü uint8_t OV2640_OutSize_Set(uint16_t width,uint16_t height) { uint16_t outh; uint16_t outw; uint8_t temp; if(width%4)return 1; if(height%4)return 2; outw=width/4; outh=height/4; SCCB_WR_Reg(0XFF,0X00); SCCB_WR_Reg(0XE0,0X04); SCCB_WR_Reg(0X5A,outw&0XFF); //ÉèÖÃOUTWµÄµÍ°Ëλ SCCB_WR_Reg(0X5B,outh&0XFF); //ÉèÖÃOUTHµÄµÍ°Ëλ temp=(outw>>8)&0X03; temp|=(outh>>6)&0X04; SCCB_WR_Reg(0X5C,temp); //ÉèÖÃOUTH/OUTWµÄ¸ßλ SCCB_WR_Reg(0XE0,0X00); return 0; } //ÉèÖÃͼÏñ¿ª´°´óС //ÓÉ:OV2640_ImageSize_SetÈ·¶¨´«¸ÐÆ÷Êä³ö·Ö±æÂÊ´Ó´óС. //¸Ãº¯ÊýÔòÔÚÕâ¸ö·¶Î§ÉÏÃæ½øÐпª´°,ÓÃÓÚOV2640_OutSize_SetµÄÊä³ö //×¢Òâ:±¾º¯ÊýµÄ¿í¶ÈºÍ¸ß¶È,±ØÐë´óÓÚµÈÓÚOV2640_OutSize_Setº¯ÊýµÄ¿í¶ÈºÍ¸ß¶È // OV2640_OutSize_SetÉèÖõĿí¶ÈºÍ¸ß¶È,¸ù¾Ý±¾º¯ÊýÉèÖõĿí¶ÈºÍ¸ß¶È,ÓÉDSP // ×Ô¶¯¼ÆËãËõ·Å±ÈÀý,Êä³ö¸øÍⲿÉ豸. //width,height:¿í¶È(¶ÔÓ¦:horizontal)ºÍ¸ß¶È(¶ÔÓ¦:vertical),widthºÍheight±ØÐëÊÇ4µÄ±¶Êý //·µ»ØÖµ:0,ÉèÖóɹ¦ // ÆäËû,ÉèÖÃʧ°Ü uint8_t OV2640_ImageWin_Set(uint16_t offx,uint16_t offy,uint16_t width,uint16_t height) { uint16_t hsize; uint16_t vsize; uint8_t temp; if(width%4)return 1; if(height%4)return 2; hsize=width/4; vsize=height/4; SCCB_WR_Reg(0XFF,0X00); SCCB_WR_Reg(0XE0,0X04); SCCB_WR_Reg(0X51,hsize&0XFF); //ÉèÖÃH_SIZEµÄµÍ°Ëλ SCCB_WR_Reg(0X52,vsize&0XFF); //ÉèÖÃV_SIZEµÄµÍ°Ëλ SCCB_WR_Reg(0X53,offx&0XFF); //ÉèÖÃoffxµÄµÍ°Ëλ SCCB_WR_Reg(0X54,offy&0XFF); //ÉèÖÃoffyµÄµÍ°Ëλ temp=(vsize>>1)&0X80; temp|=(offy>>4)&0X70; temp|=(hsize>>5)&0X08; temp|=(offx>>8)&0X07; SCCB_WR_Reg(0X55,temp); //ÉèÖÃH_SIZE/V_SIZE/OFFX,OFFYµÄ¸ßλ SCCB_WR_Reg(0X57,(hsize>>2)&0X80); //ÉèÖÃH_SIZE/V_SIZE/OFFX,OFFYµÄ¸ßλ SCCB_WR_Reg(0XE0,0X00); return 0; } //¸Ãº¯ÊýÉèÖÃͼÏñ³ß´ç´óС,Ò²¾ÍÊÇËùÑ¡¸ñʽµÄÊä³ö·Ö±æÂÊ //UXGA:1600*1200,SVGA:800*600,CIF:352*288 //width,height:ͼÏñ¿í¶ÈºÍͼÏñ¸ß¶È //·µ»ØÖµ:0,ÉèÖóɹ¦ // ÆäËû,ÉèÖÃʧ°Ü uint8_t OV2640_ImageSize_Set(uint16_t width,uint16_t height) { uint8_t temp; SCCB_WR_Reg(0XFF,0X00); SCCB_WR_Reg(0XE0,0X04); SCCB_WR_Reg(0XC0,(width)>>3&0XFF); //ÉèÖÃHSIZEµÄ10:3λ SCCB_WR_Reg(0XC1,(height)>>3&0XFF); //ÉèÖÃVSIZEµÄ10:3λ temp=(width&0X07)<<3; temp|=height&0X07; temp|=(width>>4)&0X80; SCCB_WR_Reg(0X8C,temp); SCCB_WR_Reg(0XE0,0X00); return 0; }