STM32H750XB_RT-THREAD/46-DCMI—OV5640摄像头实验/User/camera/bsp_ov5640.c
2025-07-21 14:34:29 +08:00

1119 lines
21 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file bsp_sdram.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief OV5640摄像头驱动
******************************************************************************
* @attention
*
* 实验平台:秉火 STM32 H743 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :http://firestm32.taobao.com
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "./camera/bsp_ov5640.h"
#include "./i2c/bsp_i2c.h"
#include "./delay/core_delay.h"
DCMI_HandleTypeDef DCMI_Handle;
DMA_HandleTypeDef DMA_Handle_dcmi;
/** @addtogroup DCMI_Camera
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define TIMEOUT 2
ImageFormat_TypeDef ImageFormat;
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
unsigned short RGB565_Init[][2]=
{
//15fps VGA RGB565 output
// 24MHz input clock, 24MHz PCLK
0x3103, 0x11, // system clock from pad, bit[1]
0x3008, 0x82, // software reset, bit[7]
// delay 5ms
0x3008, 0x42, // software power down, bit[6]
0x3103, 0x03, // system clock from PLL, bit[1]
0x3017, 0xff, // FREX, Vsync, HREF, PCLK, D[9:6] output enable
0x3018, 0xff, // D[5:0], GPIO[1:0] output enable
0x3034, 0x1a, // MIPI 10-bit
0x3037, 0x13, // PLL root divider, bit[4], PLL pre-divider, bit[3:0]
0x3108, 0x01, // PCLK root divider, bit[5:4], SCLK2x root divider, bit[3:2]
// SCLK root divider, bit[1:0]
0x3630, 0x36,
0x3631, 0x0e,
0x3632, 0xe2,
0x3633, 0x12,
0x3621, 0xe0,
0x3704, 0xa0,
0x3703, 0x5a,
0x3715, 0x78,
0x3717, 0x01,
0x370b, 0x60,
0x3705, 0x1a,
0x3905, 0x02,
0x3906, 0x10,
0x3901, 0x0a,
0x3731, 0x12,
0x3600, 0x08, // VCM control
0x3601, 0x33, // VCM control
0x302d, 0x60, // system control
0x3620, 0x52,
0x371b, 0x20,
0x471c, 0x50,
0x3a13, 0x43, // pre-gain = 1.047x
0x3a18, 0x00, // gain ceiling
0x3a19, 0xf8, // gain ceiling = 15.5x
0x3635, 0x13,
0x3636, 0x03,
0x3634, 0x40,
0x3622, 0x01,
// 50/60Hz detection 50/60Hz 灯光条纹过滤
0x3c01, 0x34, // Band auto, bit[7]
0x3c04, 0x28, // threshold low sum
0x3c05, 0x98, // threshold high sum
0x3c06, 0x00, // light meter 1 threshold[15:8]
0x3c07, 0x08, // light meter 1 threshold[7:0]
0x3c08, 0x00, // light meter 2 threshold[15:8]
0x3c09, 0x1c, // light meter 2 threshold[7:0]
0x3c0a, 0x9c, // sample number[15:8]
0x3c0b, 0x40, // sample number[7:0]
0x3810, 0x00, // Timing Hoffset[11:8]
0x3811, 0x10, // Timing Hoffset[7:0]
0x3812, 0x00, // Timing Voffset[10:8]
0x3708, 0x64,
0x4001, 0x02, // BLC start from line 2
0x4005, 0x1a, // BLC always update
0x3000, 0x00, // enable blocks
0x3004, 0xff, // enable clocks
0x300e, 0x58, // MIPI power down, DVP enable
0x302e, 0x00,
0x4300, 0x6f, // RGB565
0x501f, 0x01, // RGB565
0x440e, 0x00,
0x5000, 0xa7, // Lenc on, raw gamma on, BPC on, WPC on, CIP on
// AEC target 自动曝光控制
0x3a0f, 0x30, // stable range in high
0x3a10, 0x28, // stable range in low
0x3a1b, 0x30, // stable range out high
0x3a1e, 0x26, // stable range out low
0x3a11, 0x60, // fast zone high
0x3a1f, 0x14, // fast zone low
// Lens correction for ? 镜头补偿
0x5800, 0x23,
0x5801, 0x14,
0x5802, 0x0f,
0x5803, 0x0f,
0x5804, 0x12,
0x5805, 0x26,
0x5806, 0x0c,
0x5807, 0x08,
0x5808, 0x05,
0x5809, 0x05,
0x580a, 0x08,
0x580b, 0x0d,
0x580c, 0x08,
0x580d, 0x03,
0x580e, 0x00,
0x580f, 0x00,
0x5810, 0x03,
0x5811, 0x09,
0x5812, 0x07,
0x5813, 0x03,
0x5814, 0x00,
0x5815, 0x01,
0x5816, 0x03,
0x5817, 0x08,
0x5818, 0x0d,
0x5819, 0x08,
0x581a, 0x05,
0x581b, 0x06,
0x581c, 0x08,
0x581d, 0x0e,
0x581e, 0x29,
0x581f, 0x17,
0x5820, 0x11,
0x5821, 0x11,
0x5822, 0x15,
0x5823, 0x28,
0x5824, 0x46,
0x5825, 0x26,
0x5826, 0x08,
0x5827, 0x26,
0x5828, 0x64,
0x5829, 0x26,
0x582a, 0x24,
0x582b, 0x22,
0x582c, 0x24,
0x582d, 0x24,
0x582e, 0x06,
0x582f, 0x22,
0x5830, 0x40,
0x5831, 0x42,
0x5832, 0x24,
0x5833, 0x26,
0x5834, 0x24,
0x5835, 0x22,
0x5836, 0x22,
0x5837, 0x26,
0x5838, 0x44,
0x5839, 0x24,
0x583a, 0x26,
0x583b, 0x28,
0x583c, 0x42,
0x583d, 0xce, // lenc BR offset
// AWB 自动白平衡
0x5180, 0xff, // AWB B block
0x5181, 0xf2, // AWB control
0x5182, 0x00, // [7:4] max local counter, [3:0] max fast counter
0x5183, 0x14, // AWB advanced
0x5184, 0x25,
0x5185, 0x24,
0x5186, 0x09,
0x5187, 0x09,
0x5188, 0x09,
0x5189, 0x75,
0x518a, 0x54,
0x518b, 0xe0,
0x518c, 0xb2,
0x518d, 0x42,
0x518e, 0x3d,
0x518f, 0x56,
0x5190, 0x46,
0x5191, 0xf8, // AWB top limit
0x5192, 0x04, // AWB bottom limit
0x5193, 0x70, // red limit
0x5194, 0xf0, // green limit
0x5195, 0xf0, // blue limit
0x5196, 0x03, // AWB control
0x5197, 0x01, // local limit
0x5198, 0x04,
0x5199, 0x12,
0x519a, 0x04,
0x519b, 0x00,
0x519c, 0x06,
0x519d, 0x82,
0x519e, 0x38, // AWB control
// Gamma 伽玛曲线
0x5480, 0x01, // Gamma bias plus on, bit[0]
0x5481, 0x08,
0x5482, 0x14,
0x5483, 0x28,
0x5484, 0x51,
0x5485, 0x65,
0x5486, 0x71,
0x5487, 0x7d,
0x5488, 0x87,
0x5489, 0x91,
0x548a, 0x9a,
0x548b, 0xaa,
0x548c, 0xb8,
0x548d, 0xcd,
0x548e, 0xdd,
0x548f, 0xea,
0x5490, 0x1d,
// color matrix 色彩矩阵
0x5381, 0x1e, // CMX1 for Y
0x5382, 0x5b, // CMX2 for Y
0x5383, 0x08, // CMX3 for Y
0x5384, 0x0a, // CMX4 for U
0x5385, 0x7e, // CMX5 for U
0x5386, 0x88, // CMX6 for U
0x5387, 0x7c, // CMX7 for V
0x5388, 0x6c, // CMX8 for V
0x5389, 0x10, // CMX9 for V
0x538a, 0x01, // sign[9]
0x538b, 0x98, // sign[8:1]
// UV adjust UV 色彩饱和度调整
0x5580, 0x06, // saturation on, bit[1]
0x5583, 0x40,
0x5584, 0x10,
0x5589, 0x10,
0x558a, 0x00,
0x558b, 0xf8,
0x501d, 0x40, // enable manual offset of contrast
// CIP 锐化和降噪
0x5300, 0x08, // CIP sharpen MT threshold 1
0x5301, 0x30, // CIP sharpen MT threshold 2
0x5302, 0x10, // CIP sharpen MT offset 1
0x5303, 0x00, // CIP sharpen MT offset 2
0x5304, 0x08, // CIP DNS threshold 1
0x5305, 0x30, // CIP DNS threshold 2
0x5306, 0x08, // CIP DNS offset 1
0x5307, 0x16, // CIP DNS offset 2
0x5309, 0x08, // CIP sharpen TH threshold 1
0x530a, 0x30, // CIP sharpen TH threshold 2
0x530b, 0x04, // CIP sharpen TH offset 1
0x530c, 0x06, // CIP sharpen TH offset 2
0x5025, 0x00,
0x3008, 0x02, // wake up from standby, bit[6]
// 0x503d, 0x80,//测试彩条
// 0x4741, 0x00,
};
unsigned short RGB565_QVGA[][2]=
{
// input clock 24Mhz, PCLK 45.6Mhz
0x3035, 0x41, // PLL
0x3036, 0x72, // PLL
0x3c07, 0x08, // light meter 1 threshold[7:0]
0x3820, 0x42, // flip
0x3821, 0x00, // mirror
0x3814, 0x31, // timing X inc
0x3815, 0x31, // timing Y inc
0x3800, 0x00, // HS
0x3801, 0x00, // HS
0x3802, 0x00, // VS
0x3803, 0xbe, // VS
0x3804, 0x0a, // HW (HE)
0x3805, 0x3f, // HW (HE)
0x3806, 0x06, // VH (VE)
0x3807, 0xe4, // VH (VE)
0x3808, 0x01, // DVPHO = 320
0x3809, 0x40, // DVP HO
0x380a, 0x00, // DVPVO = 240
0x380b, 0xf0, // DVPVO
0x3810, 0x00, // H offset = 16
0x3811, 0x10, // H offset
0x3812, 0x00, // V offset = 4
0x3813, 0x04, // V offset
0x380c, 0x07, // HTS
0x380d, 0x69, // HTS
0x380e, 0x03, // VTS
0x380f, 0x21, // VTS
0x3618, 0x00,
0x3612, 0x29,
0x3709, 0x52,
0x370c, 0x03,
0x3a02, 0x09, // 60Hz max exposure, night mode 5fps
0x3a03, 0x63, // 60Hz max exposure
0x3a14, 0x09, // 50Hz max exposure, night mode 5fps
0x3a15, 0x63, // 50Hz max exposure
0x4004, 0x02, // BLC line number
0x3002, 0x1c, // reset JFIFO, SFIFO, JPG
0x3006, 0xc3, // disable clock of JPEG2x, JPEG
0x4713, 0x03, // JPEG mode 3
0x4407, 0x04, // Quantization sacle
0x460b, 0x35,
0x460c, 0x22,
0x4837, 0x22, // MIPI global timing
0x3824, 0x02, // PCLK manual divider
0x5001, 0xa3, // SDE on, CMX on, AWB on
0x3503, 0x00, // AEC/AGC on// /* Initialize OV5640 */
};
unsigned short RGB565_VGA[][2]=
{
// input clock 24Mhz, PCLK 45.6Mhz
0x3035, 0x41, // PLL
0x3036, 0x72, // PLL
0x3c07, 0x08, // light meter 1 threshold[7:0]
0x3820, 0x42, // flip
0x3821, 0x00, // mirror
0x3814, 0x31, // timing X inc
0x3815, 0x31, // timing Y inc
0x3800, 0x00, // HS
0x3801, 0x00, // HS
0x3802, 0x00, // VS
0x3803, 0xbe, // VS
0x3804, 0x0a, // HW (HE)
0x3805, 0x3f, // HW (HE)
0x3806, 0x06, // VH (VE)
0x3807, 0xe4, // VH (VE)
0x3808, 0x02, // DVPHO = 640
0x3809, 0x80, // DVP HO
0x380a, 0x01, // DVPVO = 480
0x380b, 0xe0, // DVPVO
0x3810, 0x00, // H offset = 16
0x3811, 0x10, // H offset
0x3812, 0x00, // V offset = 4
0x3813, 0x04, // V offset
0x380c, 0x07, // HTS
0x380d, 0x69, // HTS
0x380e, 0x03, // VTS
0x380f, 0x21, // VTS
// 0x3813, 0x06, // timing V offset
0x3618, 0x00,
0x3612, 0x29,
0x3709, 0x52,
0x370c, 0x03,
0x3a02, 0x09, // 60Hz max exposure, night mode 5fps
0x3a03, 0x63, // 60Hz max exposure
0x3a14, 0x09, // 50Hz max exposure, night mode 5fps
0x3a15, 0x63, // 50Hz max exposure
0x4004, 0x02, // BLC line number
0x3002, 0x1c, // reset JFIFO, SFIFO, JPG
0x3006, 0xc3, // disable clock of JPEG2x, JPEG
0x4713, 0x03, // JPEG mode 3
0x4407, 0x04, // Quantization sacle
0x460b, 0x35,
0x460c, 0x22,
0x4837, 0x22, // MIPI global timing
0x3824, 0x02, // PCLK manual divider
0x5001, 0xa3, // SDE on, CMX on, AWB on
0x3503, 0x00, // AEC/AGC on// /* Initialize OV5640 */
};
unsigned short RGB565_WVGA[][2]=
{
// 800x480 15fps, night mode 5fps
// input clock 24Mhz, PCLK 45.6Mhz
0x3035, 0x41, // PLL
0x3036, 0x72, // PLL
0x3c07, 0x08, // light meter 1 threshold[7:0]
0x3820, 0x42, // flip
0x3821, 0x00, // mirror
0x3814, 0x31, // timing X inc
0x3815, 0x31, // timing Y inc
0x3800, 0x00, // HS
0x3801, 0x00, // HS
0x3802, 0x00, // VS
0x3803, 0xbe, // VS
0x3804, 0x0a, // HW (HE)
0x3805, 0x3f, // HW (HE)
0x3806, 0x06, // VH (VE)
0x3807, 0xe4, // VH (VE)
0x3808, 0x03, // DVPHO
0x3809, 0x20, // DVPHO
0x380a, 0x01, // DVPVO
0x380b, 0xe0, // DVPVO
0x380c, 0x07, // HTS
0x380d, 0x69, // HTS
0x380e, 0x03, // VTS
0x380f, 0x21, // VTS
0x3813, 0x06, // timing V offset
0x3618, 0x00,
0x3612, 0x29,
0x3709, 0x52,
0x370c, 0x03,
0x3a02, 0x09, // 60Hz max exposure, night mode 5fps
0x3a03, 0x63, // 60Hz max exposure
// banding filters are calculated automatically in camera driver
//0x3a08, 0x00, // B50 step
//0x3a09, 0x78, // B50 step
//0x3a0a, 0x00, // B60 step
//0x3a0b, 0x64, // B60 step
//0x3a0e, 0x06, // 50Hz max band
//0x3a0d, 0x08, // 60Hz max band
0x3a14, 0x09, // 50Hz max exposure, night mode 5fps
0x3a15, 0x63, // 50Hz max exposure
0x4004, 0x02, // BLC line number
0x3002, 0x1c, // reset JFIFO, SFIFO, JPG
0x3006, 0xc3, // disable clock of JPEG2x, JPEG
0x4713, 0x03, // JPEG mode 3
0x4407, 0x04, // Quantization sacle
0x460b, 0x35,
0x460c, 0x22,
0x4837, 0x22, // MIPI global timing
0x3824, 0x02, // PCLK manual divider
0x5001, 0xa3, // SDE on, CMX on, AWB on
0x3503, 0x00, // AEC/AGC on// /* Initialize OV5640 */
// 0x503d, 0x80,//测试彩条
// 0x4741, 0x00,
};
/**
* @brief 初始化控制摄像头使用的GPIO(I2C/DCMI)
* @param None
* @retval None
*/
void OV5640_HW_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/***DCMI引脚配置***/
/* 使能DCMI时钟 */
DCMI_PWDN_GPIO_CLK_ENABLE();
DCMI_RST_GPIO_CLK_ENABLE();
DCMI_VSYNC_GPIO_CLK_ENABLE();
DCMI_HSYNC_GPIO_CLK_ENABLE();
DCMI_PIXCLK_GPIO_CLK_ENABLE();
DCMI_D0_GPIO_CLK_ENABLE();
DCMI_D1_GPIO_CLK_ENABLE();
DCMI_D2_GPIO_CLK_ENABLE();
DCMI_D3_GPIO_CLK_ENABLE();
DCMI_D4_GPIO_CLK_ENABLE();
DCMI_D5_GPIO_CLK_ENABLE();
DCMI_D6_GPIO_CLK_ENABLE();
DCMI_D7_GPIO_CLK_ENABLE();
/*控制/同步信号线*/
GPIO_InitStructure.Pin = DCMI_VSYNC_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStructure.Pull = GPIO_PULLUP ;
GPIO_InitStructure.Alternate = DCMI_VSYNC_AF;
HAL_GPIO_Init(DCMI_VSYNC_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_HSYNC_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_VSYNC_AF;
HAL_GPIO_Init(DCMI_HSYNC_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_PIXCLK_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_PIXCLK_AF;
HAL_GPIO_Init(DCMI_PIXCLK_GPIO_PORT, &GPIO_InitStructure);
/*数据信号*/
GPIO_InitStructure.Pin = DCMI_D0_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_D0_AF;
HAL_GPIO_Init(DCMI_D0_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_D1_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_D1_AF;
HAL_GPIO_Init(DCMI_D1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_D2_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_D2_AF;
HAL_GPIO_Init(DCMI_D2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_D3_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_D3_AF;
HAL_GPIO_Init(DCMI_D3_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_D4_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_D4_AF;
HAL_GPIO_Init(DCMI_D4_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_D5_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_D5_AF;
HAL_GPIO_Init(DCMI_D5_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_D6_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_D6_AF;
HAL_GPIO_Init(DCMI_D6_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_D7_GPIO_PIN;
GPIO_InitStructure.Alternate = DCMI_D7_AF;
HAL_GPIO_Init(DCMI_D7_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_PWDN_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(DCMI_PWDN_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = DCMI_RST_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(DCMI_RST_GPIO_PORT, &GPIO_InitStructure);
HAL_GPIO_WritePin(DCMI_RST_GPIO_PORT,DCMI_RST_GPIO_PIN,GPIO_PIN_RESET);
/*PWDN引脚高电平关闭电源低电平供电*/
HAL_GPIO_WritePin(DCMI_PWDN_GPIO_PORT,DCMI_PWDN_GPIO_PIN,GPIO_PIN_SET);
HAL_GPIO_WritePin(DCMI_PWDN_GPIO_PORT,DCMI_PWDN_GPIO_PIN,GPIO_PIN_RESET);
Delay(10);
HAL_GPIO_WritePin(DCMI_RST_GPIO_PORT,DCMI_RST_GPIO_PIN,GPIO_PIN_SET);
//必须延时50ms,模块才会正常工作
Delay(50);
}
/**
* @brief Resets the OV5640 camera.
* @param None
* @retval None
*/
void OV5640_Reset(void)
{
/*OV5640软件复位*/
OV5640_WriteReg(0x3008, 0x80);
}
/**
* @brief 读取摄像头的ID.
* @param OV5640ID: 存储ID的结构体
* @retval None
*/
void OV5640_ReadID(OV5640_IDTypeDef *OV5640ID)
{
/*读取寄存芯片ID*/
OV5640ID->PIDH = OV5640_ReadReg(OV5640_SENSOR_PIDH);
OV5640ID->PIDL = OV5640_ReadReg(OV5640_SENSOR_PIDL);
}
/**
* @brief 配置 DCMI/DMA 以捕获摄像头数据
* @param None
* @retval None
*/
void OV5640_Init(void)
{
/*** 配置DCMI接口 ***/
/* 使能DCMI时钟 */
__HAL_RCC_DCMI_CLK_ENABLE();
/* DCMI 配置*/
//DCMI外设寄存器基地址
DCMI_Handle.Instance = DCMI;
//连续采集模式
DCMI_Handle.Init.SynchroMode = DCMI_MODE_CONTINUOUS;
//连续采集模式
DCMI_Handle.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
//像素时钟上升沿有效
DCMI_Handle.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
//VSP高电平有效
DCMI_Handle.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
//HSP低电平有效
DCMI_Handle.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
//全采集
DCMI_Handle.Init.CaptureRate = DCMI_CR_ALL_FRAME;
//8位数据宽度
DCMI_Handle.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
HAL_DCMI_Init(&DCMI_Handle);
/* 配置中断 */
HAL_NVIC_SetPriority(DCMI_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DCMI_IRQn);
//dma_memory 以16位数据为单位 dma_bufsize以32位数据为单位(即像素个数/2)
OV5640_DMA_Config(LCD_FB_START_ADDRESS,LCD_GetXSize()*LCD_GetYSize()/2);
}
/**
* @brief 配置 DCMI/DMA 以捕获摄像头数据
* @param DMA_Memory0BaseAddr:本次传输的目的首地址
* @param DMA_BufferSize本次传输的数据量(单位为字,即4字节)
*/
void OV5640_DMA_Config(uint32_t DMA_Memory0BaseAddr,uint32_t DMA_BufferSize)
{
/* 配置DMA从DCMI中获取数据*/
/* 使能DMA*/
__HAL_RCC_DMA2_CLK_ENABLE();
DMA_Handle_dcmi.Instance = DMA2_Stream1;
DMA_Handle_dcmi.Init.Request = DMA_REQUEST_DCMI;
DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY;
DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE;
DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE; //寄存器地址自增
DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; //循环模式
DMA_Handle_dcmi.Init.Priority = DMA_PRIORITY_HIGH;
DMA_Handle_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
DMA_Handle_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
DMA_Handle_dcmi.Init.MemBurst = DMA_MBURST_INC4;
DMA_Handle_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;
/*DMA中断配置 */
__HAL_LINKDMA(&DCMI_Handle, DMA_Handle, DMA_Handle_dcmi);
HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
HAL_DMA_Init(&DMA_Handle_dcmi);
//使能DCMI采集数据
HAL_DCMI_Start_DMA(&DCMI_Handle, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Memory0BaseAddr,DMA_BufferSize);
}
unsigned short sensor_reg[(sizeof(RGB565_Init)/4)];
/**
* @brief Configures the OV5640 camera in BMP mode.
* @param BMP ImageSize: BMP image size
* @retval None
*/
void OV5640_RGB565Config(void)
{
uint32_t i;
/*摄像头复位*/
OV5640_Reset();
/* 写入寄存器配置 */
/* Initialize OV5640 Set to output RGB565 */
for(i=0; i<(sizeof(RGB565_Init)/4); i++)
{
OV5640_WriteReg(RGB565_Init[i][0], RGB565_Init[i][1]);
HAL_Delay(10);
sensor_reg[i] = OV5640_ReadReg(RGB565_Init[i][0]);
if(RGB565_Init[i][1] != sensor_reg[i])
CAMERA_DEBUG("sensor_reg[0x%x]:%x-%x\n",RGB565_Init[i][0],RGB565_Init[i][1],sensor_reg[i]);
}
// Delay(500);
if(img_width == 320)
ImageFormat=BMP_320x240;
else if(img_width == 640)
ImageFormat=BMP_640x480;
else if(img_width == 800)
ImageFormat=BMP_800x480;
switch(ImageFormat)
{
case BMP_320x240:
{
for(i=0; i<(sizeof(RGB565_QVGA)/4); i++)
{
OV5640_WriteReg(RGB565_QVGA[i][0], RGB565_QVGA[i][1]);
}
break;
}
case BMP_640x480:
{
for(i=0; i<(sizeof(RGB565_VGA)/4); i++)
{
OV5640_WriteReg(RGB565_VGA[i][0], RGB565_VGA[i][1]);
}
break;
}
case BMP_800x480:
{
for(i=0; i<(sizeof(RGB565_WVGA)/4); i++)
{
OV5640_WriteReg(RGB565_WVGA[i][0], RGB565_WVGA[i][1]);
sensor_reg[i] = OV5640_ReadReg(RGB565_WVGA[i][0]);
if(RGB565_WVGA[i][1] != sensor_reg[i])
CAMERA_DEBUG("sensor_reg[0x%x]:%x-%x\n",RGB565_Init[i][0],RGB565_Init[i][1],sensor_reg[i]);
}
printf("OK\r\n");
break;
}
default:
{
for(i=0; i<(sizeof(RGB565_WVGA)/4); i++)
{
OV5640_WriteReg(RGB565_WVGA[i][0], RGB565_WVGA[i][1]);
}
break;
}
}
OV5640_ReadReg(RGB565_WVGA[i][0]);
}
extern uint8_t fps;
/**
* @brief Line event callback.
* @param None
* @retval None
*/
void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
{
// SCB_InvalidateDCache_by_Addr((uint32_t*)LCD_FB_START_ADDRESS,LCD_GetXSize()*LCD_GetYSize()/2);
fps++; //帧率计数
OV5640_DMA_Config(LCD_FB_START_ADDRESS,LCD_GetXSize()*LCD_GetYSize()/2);
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/