728x90
CAMERA.h
#define WRITE_SLAVE_ADDR 0x42 #define READ_SLAVE_ADDR 0x43 #define DEVICE_REG_NUM 140 //121 #define I2C_DIR_TR 0x00000001U #define QVGA_RESOLUTION (320*240) void SCCB_write_reg(uint8_t reg_addr, uint8_t data); void CAMERA_Init(void); int SCCB_read_reg(uint8_t reg_addr); void ov7670_capture_snapthot();
CAMERA.c
#include "stm32f4xx.h"
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_dcmi.h"
#include "CAMERA.h"
#include "LCD.h"
extern DCMI_HandleTypeDef hdcmi;
extern I2C_HandleTypeDef hi2c2;
uint8_t SCCB_txBuf[2];
int error=0;
const uint8_t ov7670_reg[DEVICE_REG_NUM][2]=
{
{0x15,0x18},
{0x12, 0x14}, // QVGA, RGB
{0x8C, 0x00}, // RGB444 Disable
{0x40, 0x10 + 0xc0}, // RGB565, 00 - FF
{0x3A, 0x04 + 8}, // UYVY (why?)
{0x3D, 0x80 + 0x00}, // gamma enable, UV auto adjust, UYVY
{0xB0, 0x84}, // important
/* clock related */
{0x0C, 0x04}, // DCW enable
{0x3E, 0x19}, // manual scaling, pclk/=2
{0x70, 0x3A}, // scaling_xsc
{0x71, 0x35}, // scaling_ysc
{0x72, 0x11}, // down sample by 2
{0x73, 0xf1}, // DSP clock /= 2
/* windowing (empirically decided...) */
{0x17, 0x16}, // HSTART
{0x18, 0x04}, // HSTOP
{0x32, 0x80}, // HREF
{0x19, 0x03}, // VSTART = 14 ( = 3 * 4 + 2)
{0x1a, 0x7b}, // VSTOP = 494 ( = 123 * 4 + 2)
{0x03, 0x0a}, // VREF (VSTART_LOW = 2, VSTOP_LOW = 2)
/* color matrix coefficient */
{0x4f, 0xb3},
{0x50, 0xb3},
{0x51, 0x00},
{0x52, 0x3d},
{0x53, 0xa7},
{0x54, 0xe4},
{0x58, 0x9e},
/* 3a */
// {0x13, 0x84},
// {0x14, 0x0a}, // AGC Ceiling = 2x
// {0x5F, 0x2f}, // AWB B Gain Range (empirically decided)
// // without this bright scene becomes yellow (purple). might be because of color matrix
// {0x60, 0x98}, // AWB R Gain Range (empirically decided)
// {0x61, 0x70}, // AWB G Gain Range (empirically decided)
{0x41, 0x38}, // edge enhancement, de-noise, AWG gain enabled
/* gamma curve */
{0x7b, 16},
{0x7c, 30},
{0x7d, 53},
{0x7e, 90},
{0x7f, 105},
{0x80, 118},
{0x81, 130},
{0x82, 140},
{0x83, 150},
{0x84, 160},
{0x85, 180},
{0x86, 195},
{0x87, 215},
{0x88, 230},
{0x89, 244},
{0x7a, 16},
{ 0xa5, 0x05 }, //
{ 0xab, 0x07 }, //
{ 0x24, 0x95 }, //
{ 0x25, 0x33 }, //
{ 0x26, 0xe3 }, //
{ 0x9f, 0x78 }, //
{ 0xa0, 0x68 }, //
{ 0xa1, 0x03 }, //
{ 0xa6, 0xd8 }, //
{ 0xa7, 0xd8 }, //
{ 0xa8, 0xf0 }, //
{ 0xa9, 0x90 }, //
{ 0xaa, 0x94 }, //
{ 0x10, 0x00 },
{ 0x43, 0x0a }, //
{ 0x44, 0xf0 }, //
{ 0x45, 0x34 }, //
{ 0x46, 0x58 },
{ 0x47, 0x28 }, //
{ 0x48, 0x3a }, //
{ 0x59, 0x88 }, //
{ 0x5a, 0x88 }, //
{ 0x5b, 0x44 }, //
{ 0x5c, 0x67 }, //
{ 0x5d, 0x49 }, //
{ 0x5e, 0x0e }, //
{ 0x6c, 0x0a }, //
{ 0x6d, 0x55 }, //
{ 0x6e, 0x11 }, //
{ 0x6f, 0x9f }, //
{ 0x6a, 0x40 }, //
{ 0x01, 0x40 }, //
{ 0x02, 0x60 }, //
{ 0x13, 0xe7 },
/* fps */
// {0x6B, 0x4a}, //PLL x4
// {0x11, 0x80}, // pre-scalar = 1/1
/* others */
{0x1E, 0x03},
// {0x42, 0x08}, // color bar
};
void SCCB_write_reg(uint8_t reg_addr, uint8_t data)
{
SCCB_txBuf[0]=reg_addr;
SCCB_txBuf[1]=data;
if(HAL_I2C_Master_Transmit(&hi2c2,(uint16_t)WRITE_SLAVE_ADDR,(uint8_t*)SCCB_txBuf,2,10000)!=HAL_OK)
{
}
}
void CAMERA_Init(void){
for(int i=0; i<DEVICE_REG_NUM, i++)
{
SCCB_write_reg(ov7670_reg[i][0],ov7670_reg[i][1]);
}
}
void ov7670_capture()
{
if(HAL_DCMI_Start_DMA(&hdcmi,DCMI_MODE_CONTINUOUS,((uint32_t)0x60000002),65535)!=HAL_OK)
error++;
}
300x250
'MCU > STM32' 카테고리의 다른 글
| [STM32F429]FMC(Flexible Memory controller) 구성 및 설정(cube) (0) | 2019.09.04 |
|---|---|
| [STM32F429]FSMC(LCD INTERFACE), DCMI 보충내용 (0) | 2018.10.01 |
| [STM32F429]DCMI(Digital camera interface)와 OV7670 CAMERA-(1) (2) | 2018.09.19 |
| [STM32F429]FSMC(Flexible Static Memory Controller)와 TFT_LCD(4) (1) | 2018.09.06 |
| [STM32F429]FSMC(Flexible Static Memory Controller)와 TFT_LCD(3) (0) | 2018.09.06 |
댓글