Skip to content

原子的OV5640_HDMI例程,纯寄存器点亮

minichao9901 edited this page May 12, 2024 · 1 revision

用ILA抓寄存器序列

  • 这一步略过,其它文章里都讲了

c代码如下,结果正确

//****************************************Copyright (c)***********************************//
//原子哥在线教学平台:www.yuanzige.com
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com
//关注微信公众平台微信号:"正点原子",免费获取ZYNQ & FPGA & STM32 & LINUX资料。
//版权所有,盗版必究。
//Copyright(C) 正点原子 2018-2028
//All rights reserved
//----------------------------------------------------------------------------------------
// File name:           main.c
// Last modified Date:  2019/07/07 15:59:46
// Last Version:        V1.0
// Descriptions:        OV5640摄像头驱动HDMI示例
//----------------------------------------------------------------------------------------
// Created by:          正点原子
// Created date:        2019/07/07 15:59:52
// Version:             V1.0
// Descriptions:        The original version
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//

/***************************** Include Files *********************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "display_ctrl_hdmi/display_ctrl.h"
#include "vdma_api/vdma_api.h"
#include "emio_sccb_cfg/emio_sccb_cfg.h"
#include "ov5640/ov5640_init.h"

//宏定义
#define DYNCLK_BASEADDR  XPAR_AXI_DYNCLK_0_BASEADDR  //动态时钟基地址
#define VDMA_ID          XPAR_AXIVDMA_0_DEVICE_ID    //VDMA器件ID
#define DISP_VTC_ID      XPAR_VTC_0_DEVICE_ID        //VTC器件ID

//全局变量
//frame buffer的起始地址
unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR
										+ 0x1000000);
XAxiVdma     vdma;
DisplayCtrl  dispCtrl;
VideoMode    vd_mode;

void init()
{
	Xil_Out32(0x43000000,0x4);
	Xil_Out32(0x43000030,0x4);
	Xil_Out32(0x43000030,0x0001008a);
	Xil_Out32(0x430000a4,0x00000f00);
	Xil_Out32(0x430000a8,0x00000f00);
	Xil_Out32(0x430000ac,0x1100000);
	Xil_Out32(0x430000b0,0x013a3000);
	Xil_Out32(0x430000b4,0x1646000);
	Xil_Out32(0x43000000,0x0001008a);
	Xil_Out32(0x43000054,0x00000f00);
	Xil_Out32(0x43000058,0x00000f00);
	Xil_Out32(0x4300005c,0x1100000);
	Xil_Out32(0x43000060,0x013a3000);
	Xil_Out32(0x43000064,0x1646000);
	Xil_Out32(0x43000030,0x0001408a);
	Xil_Out32(0x43000000,0x0001408a);
	Xil_Out32(0x43000000,0x0001408a);
	Xil_Out32(0x43000030,0x0001408b);
	Xil_Out32(0x430000a0,0x000002d0);
	Xil_Out32(0x43000000,0x0001408b);
	Xil_Out32(0x43000050,0x000002d0);
	//usleep(1000);

	Xil_Out32(0x43c10008,0x800083);
	Xil_Out32(0x43c1000c,0x800411);
	Xil_Out32(0x43c10010,0x0);
	Xil_Out32(0x43c10014,0x82);
	Xil_Out32(0x43c10018,0xd2cfa401);
	Xil_Out32(0x43c1001c,0x006300ff);
	Xil_Out32(0x43c10000,0x1);
	usleep(1000);  /*must*/
	Xil_Out32(0x43c10008,0x41);
	Xil_Out32(0x43c1000c,0x0000069a);
	Xil_Out32(0x43c10010,0x0);
	Xil_Out32(0x43c10014,0x000020c4);
	Xil_Out32(0x43c10018,0xcfafa401);
	Xil_Out32(0x43c1001c,0x00a300ff);
	Xil_Out32(0x43c10000,0x0);
	Xil_Out32(0x43c10000,0x1);
	usleep(1000);  /*must*/


	Xil_Out32(0x43c00000,0x2);
	Xil_Out32(0x43c0006c,0x0000007f);
	Xil_Out32(0x43c00070,0x672);
	Xil_Out32(0x43c00074,0x02ee02ee);
	Xil_Out32(0x43c00060,0x02d00500);
	Xil_Out32(0x43c00094,0x02d00000);
	Xil_Out32(0x43c00078,0x0596056e);
	Xil_Out32(0x43c00080,0x02d902d4);
	Xil_Out32(0x43c0008c,0x02d902d4);
	Xil_Out32(0x43c00068,0x2);
	Xil_Out32(0x43c0007c,0x5000500);
	Xil_Out32(0x43c00084,0x056e056e);
	Xil_Out32(0x43c00088,0x5000500);
	Xil_Out32(0x43c00090,0x056e056e);
	Xil_Out32(0x43c0007c,0x5000500);
	Xil_Out32(0x43c00084,0x056e056e);
	Xil_Out32(0x43c00088,0x5000500);
	Xil_Out32(0x43c00090,0x056e056e);
	Xil_Out32(0x43c00000,0x03f7ef02);
	Xil_Out32(0x43c00000,0x03f7ef06);
	//usleep(1000);
}


int main(void)
{
	u32 status;
	u16 cmos_h_pixel;                    //ov5640 DVP 输出水平像素点数
	u16 cmos_v_pixel;                    //ov5640 DVP 输出垂直像素点数
	u16 total_h_pixel;                   //ov5640 水平总像素大小
	u16 total_v_pixel;                   //ov5640 垂直总像素大小

	cmos_h_pixel = 1280;                 //设置OV5640输出分辨率为1280*720
	cmos_v_pixel = 720;
	total_h_pixel = 2570;
	total_v_pixel = 980;

	emio_init();                         //初始化EMIO
	status = ov5640_init( cmos_h_pixel,  //初始化ov5640
						  cmos_v_pixel,
						 total_h_pixel,
						 total_v_pixel);
	if(status == 0)
		xil_printf("OV5640 detected successful!\r\n");
	else
		xil_printf("OV5640 detected failed!\r\n");


	if(0){
		vd_mode = VMODE_1280x720;

		//配置VDMA
		run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
								frame_buffer_addr,0,0,BOTH);
		//初始化Display controller
		DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
		//设置VideoMode
		DisplaySetMode(&dispCtrl, &vd_mode);
		DisplayStart(&dispCtrl);
	}

	if(1){
		init();
	}

    return 0;
}
 

效果

e1e0e51a78c26eb3ae40073ea17f1327 85ce5b814aef4b6102b22868d014d371

Clone this wiki locally