基于EBAZ4205矿板的图像处理:10gamma变换

news2024/9/17 4:10:16

基于EBAZ4205矿板的图像处理:10gamma变换

项目全部文件

会上传项目全部文件,如果没传,可以私信催我一下,最近太忙了

先看效果

在这里插入图片描述

请添加图片描述
我的项目中的gamma的变换系数为2.2,是会让图像整体变暗的,看右图说明我的gamma变换模块生效了。

算法

gamma映射是一种简单的、常见的图像处理方法,它能够拓展图像的低亮度区域的灰度级数,让图像的低亮度区域呈现更多的细节,但同时也会让图像的整体亮度变暗,有利有弊。
算法的公式为: y = A*x^g
其中,x为像素点的像素灰度值输入,y为像素点的像素灰度值变换结果,A为归一化系数,g为gamma变换系数。
下图是不同系数的gamma变换曲线。
在这里插入图片描述

算法的FPGA部署

首先,gamma变换是个指数函数。用FPGA来运算指数函数相当耗时,所以为了提升速度,我们采用查表法,既将某个gamma变换系数下的0~255灰度等级的所有对应变换结果算出来,然后在需要映射时,直接查表即可。

BD

在这里插入图片描述

项目代码

图像处理模块

module video_processor(
    (* X_INTERFACE_IGNORE = "true" *) input         frame_clk,    //cmos 像素时钟
    (* X_INTERFACE_IGNORE = "true" *) input         frame_rst_n,  
    
    //预处理图像
    (* X_INTERFACE_IGNORE = "true" *) input         pre_vsync, //预处理图像场同步信号
    (* X_INTERFACE_IGNORE = "true" *) input [23:0]  pre_data,  //预处理图像数据
    (* X_INTERFACE_IGNORE = "true" *) input         pre_href,  //预处理图像数据有效信号
    (* X_INTERFACE_IGNORE = "true" *) input         pre_frame_ce, //预处理图像时钟使能信号

        
    //处理后图像
    (* X_INTERFACE_IGNORE = "true" *) output        pos_vsync, //处理后图像场同步信号
    (* X_INTERFACE_IGNORE = "true" *) output [23:0] pos_data,  //处理后图像数据
    (* X_INTERFACE_IGNORE = "true" *) output        pos_href, //处理后图像数据有效信号
    (* X_INTERFACE_IGNORE = "true" *) output        pos_frame_ce //处理后图像时钟使能信号  
);

wire [7:0] gray_data ;
wire [7:0] post_gray_data ;

rgb2gray  u_rgb2gray(
    .cmos_frame_clk     (frame_clk      ),
    .cmos_rstn          (frame_rst_n    ),//同步复位
    .cmos_frame_vsync   (pre_vsync      ),
    .cmos_frame_data    (pre_data       ),
    .cmos_frame_href    (pre_href       ),
    .cmos_frame_ce      (pre_frame_ce   ),

    .dataout_frame_vsync(pos_vsync     ),
    .dataout_frame_data (gray_data      ),
    .dataout_frame_href (pos_href      ),
    .dataout_frame_ce   (pos_frame_ce  )
);

assign pos_data = {3{post_gray_data}};
Curve_Gamma_2P2 u_Curve_Gamma_2P2(
    .Pre_Data (gray_data),
    .Post_Data(post_gray_data)
);
endmodule 

色彩转换模块

`timescale 1ns / 1ps
module rgb2gray(
    
(* X_INTERFACE_IGNORE = "true" *)  input           cmos_frame_vsync,
(* X_INTERFACE_IGNORE = "true" *)  input [23:0]    cmos_frame_data,
(* X_INTERFACE_IGNORE = "true" *)  input           cmos_frame_href,

(* X_INTERFACE_IGNORE = "true" *)  input           cmos_frame_clk,
(* X_INTERFACE_IGNORE = "true" *)  input           cmos_rstn,//同步复位
(* X_INTERFACE_IGNORE = "true" *)  input           cmos_frame_ce,

(* X_INTERFACE_IGNORE = "true" *)  output          dataout_frame_vsync,
(* X_INTERFACE_IGNORE = "true" *)  output [7:0]    dataout_frame_data,
// (* X_INTERFACE_IGNORE = "true" *)  output [23:0]    dataout_frame_data,
(* X_INTERFACE_IGNORE = "true" *)  output          dataout_frame_href,
(* X_INTERFACE_IGNORE = "true" *)  output          dataout_frame_ce
    );
    // Y = 0.299R +0.587G + 0.114B
    // Y = (77 *R + 150*G + 29 *B)>>8
    reg [15:0] r_gray1;
    reg [15:0] g_gray1;
    reg [15:0] b_gray1;
    reg [15:0] y1;
    reg [7:0] y2;
    reg [2:0] dataout_frame_vsync_r;
    reg [2:0] dataout_frame_href_r;
    reg [2:0] dataout_frame_ce_r;


    always@(posedge cmos_frame_clk)begin
        if(!cmos_rstn)begin
            r_gray1 <= 8'h00;
            g_gray1 <= 8'h00;
            b_gray1 <= 8'h00;
        end
        else begin
            r_gray1 <= cmos_frame_data[23:16]  * 8'd77 ;
            g_gray1 <= cmos_frame_data[15:8]   * 8'd150;
            b_gray1 <= cmos_frame_data[7:0]    * 8'd29 ;
        end
    end

    always@(posedge cmos_frame_clk)begin
        if(!cmos_rstn)begin
            y1 <= 16'h0000;
        end
        else begin
            y1 <= r_gray1 + g_gray1 + b_gray1;
        end
    end

    always@(posedge cmos_frame_clk)begin
        if(!cmos_rstn)begin
            y2 <= 8'h0000;
        end
        else begin
            y2 <= y1[15:8];
        end
    end

    

    always@(posedge cmos_frame_clk)begin
        if(!cmos_rstn)begin
            dataout_frame_ce_r      <= 3'b000;
            dataout_frame_vsync_r   <= 3'b000;
            dataout_frame_href_r    <= 3'b000;
        end
        else begin
            dataout_frame_ce_r      <= {dataout_frame_ce_r[1:0]     ,cmos_frame_ce};
            dataout_frame_vsync_r   <= {dataout_frame_vsync_r[1:0]  ,cmos_frame_vsync};
            dataout_frame_href_r    <= {dataout_frame_href_r[1:0]   ,cmos_frame_href};
        end
    end
    // assign dataout_frame_data = {y2,y2,y2};
    assign dataout_frame_data = y2;
    assign dataout_frame_ce = dataout_frame_ce_r[2];
    assign dataout_frame_vsync = dataout_frame_vsync_r[2];
    assign dataout_frame_href = dataout_frame_href_r[2];


endmodule

gamma映射模块

//Curve of Gamma = 2.2
module Curve_Gamma_2P2
(
   input		[7:0]	Pre_Data,
   output	reg	[7:0]	Post_Data
);

always@(*)
begin
	case(Pre_Data)
	8'h00 : Post_Data = 8'h00; 
	8'h01 : Post_Data = 8'h00; 
	8'h02 : Post_Data = 8'h00; 
	8'h03 : Post_Data = 8'h00; 
	8'h04 : Post_Data = 8'h00; 
	8'h05 : Post_Data = 8'h00; 
	8'h06 : Post_Data = 8'h00; 
	8'h07 : Post_Data = 8'h00; 
	8'h08 : Post_Data = 8'h00; 
	8'h09 : Post_Data = 8'h00; 
	8'h0A : Post_Data = 8'h00; 
	8'h0B : Post_Data = 8'h00; 
	8'h0C : Post_Data = 8'h00; 
	8'h0D : Post_Data = 8'h00; 
	8'h0E : Post_Data = 8'h00; 
	8'h0F : Post_Data = 8'h01; 
	8'h10 : Post_Data = 8'h01; 
	8'h11 : Post_Data = 8'h01; 
	8'h12 : Post_Data = 8'h01; 
	8'h13 : Post_Data = 8'h01; 
	8'h14 : Post_Data = 8'h01; 
	8'h15 : Post_Data = 8'h01; 
	8'h16 : Post_Data = 8'h01; 
	8'h17 : Post_Data = 8'h01; 
	8'h18 : Post_Data = 8'h01; 
	8'h19 : Post_Data = 8'h02; 
	8'h1A : Post_Data = 8'h02; 
	8'h1B : Post_Data = 8'h02; 
	8'h1C : Post_Data = 8'h02; 
	8'h1D : Post_Data = 8'h02; 
	8'h1E : Post_Data = 8'h02; 
	8'h1F : Post_Data = 8'h02; 
	8'h20 : Post_Data = 8'h03; 
	8'h21 : Post_Data = 8'h03; 
	8'h22 : Post_Data = 8'h03; 
	8'h23 : Post_Data = 8'h03; 
	8'h24 : Post_Data = 8'h03; 
	8'h25 : Post_Data = 8'h04; 
	8'h26 : Post_Data = 8'h04; 
	8'h27 : Post_Data = 8'h04; 
	8'h28 : Post_Data = 8'h04; 
	8'h29 : Post_Data = 8'h05; 
	8'h2A : Post_Data = 8'h05; 
	8'h2B : Post_Data = 8'h05; 
	8'h2C : Post_Data = 8'h05; 
	8'h2D : Post_Data = 8'h06; 
	8'h2E : Post_Data = 8'h06; 
	8'h2F : Post_Data = 8'h06; 
	8'h30 : Post_Data = 8'h06; 
	8'h31 : Post_Data = 8'h07; 
	8'h32 : Post_Data = 8'h07; 
	8'h33 : Post_Data = 8'h07; 
	8'h34 : Post_Data = 8'h08; 
	8'h35 : Post_Data = 8'h08; 
	8'h36 : Post_Data = 8'h08; 
	8'h37 : Post_Data = 8'h09; 
	8'h38 : Post_Data = 8'h09; 
	8'h39 : Post_Data = 8'h09; 
	8'h3A : Post_Data = 8'h0A; 
	8'h3B : Post_Data = 8'h0A; 
	8'h3C : Post_Data = 8'h0B; 
	8'h3D : Post_Data = 8'h0B; 
	8'h3E : Post_Data = 8'h0B; 
	8'h3F : Post_Data = 8'h0C; 
	8'h40 : Post_Data = 8'h0C; 
	8'h41 : Post_Data = 8'h0D; 
	8'h42 : Post_Data = 8'h0D; 
	8'h43 : Post_Data = 8'h0D; 
	8'h44 : Post_Data = 8'h0E; 
	8'h45 : Post_Data = 8'h0E; 
	8'h46 : Post_Data = 8'h0F; 
	8'h47 : Post_Data = 8'h0F; 
	8'h48 : Post_Data = 8'h10; 
	8'h49 : Post_Data = 8'h10; 
	8'h4A : Post_Data = 8'h11; 
	8'h4B : Post_Data = 8'h11; 
	8'h4C : Post_Data = 8'h12; 
	8'h4D : Post_Data = 8'h12; 
	8'h4E : Post_Data = 8'h13; 
	8'h4F : Post_Data = 8'h13; 
	8'h50 : Post_Data = 8'h14; 
	8'h51 : Post_Data = 8'h14; 
	8'h52 : Post_Data = 8'h15; 
	8'h53 : Post_Data = 8'h16; 
	8'h54 : Post_Data = 8'h16; 
	8'h55 : Post_Data = 8'h17; 
	8'h56 : Post_Data = 8'h17; 
	8'h57 : Post_Data = 8'h18; 
	8'h58 : Post_Data = 8'h19; 
	8'h59 : Post_Data = 8'h19; 
	8'h5A : Post_Data = 8'h1A; 
	8'h5B : Post_Data = 8'h1A; 
	8'h5C : Post_Data = 8'h1B; 
	8'h5D : Post_Data = 8'h1C; 
	8'h5E : Post_Data = 8'h1C; 
	8'h5F : Post_Data = 8'h1D; 
	8'h60 : Post_Data = 8'h1E; 
	8'h61 : Post_Data = 8'h1E; 
	8'h62 : Post_Data = 8'h1F; 
	8'h63 : Post_Data = 8'h20; 
	8'h64 : Post_Data = 8'h21; 
	8'h65 : Post_Data = 8'h21; 
	8'h66 : Post_Data = 8'h22; 
	8'h67 : Post_Data = 8'h23; 
	8'h68 : Post_Data = 8'h23; 
	8'h69 : Post_Data = 8'h24; 
	8'h6A : Post_Data = 8'h25; 
	8'h6B : Post_Data = 8'h26; 
	8'h6C : Post_Data = 8'h27; 
	8'h6D : Post_Data = 8'h27; 
	8'h6E : Post_Data = 8'h28; 
	8'h6F : Post_Data = 8'h29; 
	8'h70 : Post_Data = 8'h2A; 
	8'h71 : Post_Data = 8'h2B; 
	8'h72 : Post_Data = 8'h2B; 
	8'h73 : Post_Data = 8'h2C; 
	8'h74 : Post_Data = 8'h2D; 
	8'h75 : Post_Data = 8'h2E; 
	8'h76 : Post_Data = 8'h2F; 
	8'h77 : Post_Data = 8'h30; 
	8'h78 : Post_Data = 8'h31; 
	8'h79 : Post_Data = 8'h31; 
	8'h7A : Post_Data = 8'h32; 
	8'h7B : Post_Data = 8'h33; 
	8'h7C : Post_Data = 8'h34; 
	8'h7D : Post_Data = 8'h35; 
	8'h7E : Post_Data = 8'h36; 
	8'h7F : Post_Data = 8'h37; 
	8'h80 : Post_Data = 8'h38; 
	8'h81 : Post_Data = 8'h39; 
	8'h82 : Post_Data = 8'h3A; 
	8'h83 : Post_Data = 8'h3B; 
	8'h84 : Post_Data = 8'h3C; 
	8'h85 : Post_Data = 8'h3D; 
	8'h86 : Post_Data = 8'h3E; 
	8'h87 : Post_Data = 8'h3F; 
	8'h88 : Post_Data = 8'h40; 
	8'h89 : Post_Data = 8'h41; 
	8'h8A : Post_Data = 8'h42; 
	8'h8B : Post_Data = 8'h43; 
	8'h8C : Post_Data = 8'h44; 
	8'h8D : Post_Data = 8'h45; 
	8'h8E : Post_Data = 8'h46; 
	8'h8F : Post_Data = 8'h47; 
	8'h90 : Post_Data = 8'h49; 
	8'h91 : Post_Data = 8'h4A; 
	8'h92 : Post_Data = 8'h4B; 
	8'h93 : Post_Data = 8'h4C; 
	8'h94 : Post_Data = 8'h4D; 
	8'h95 : Post_Data = 8'h4E; 
	8'h96 : Post_Data = 8'h4F; 
	8'h97 : Post_Data = 8'h51; 
	8'h98 : Post_Data = 8'h52; 
	8'h99 : Post_Data = 8'h53; 
	8'h9A : Post_Data = 8'h54; 
	8'h9B : Post_Data = 8'h55; 
	8'h9C : Post_Data = 8'h57; 
	8'h9D : Post_Data = 8'h58; 
	8'h9E : Post_Data = 8'h59; 
	8'h9F : Post_Data = 8'h5A; 
	8'hA0 : Post_Data = 8'h5B; 
	8'hA1 : Post_Data = 8'h5D; 
	8'hA2 : Post_Data = 8'h5E; 
	8'hA3 : Post_Data = 8'h5F; 
	8'hA4 : Post_Data = 8'h61; 
	8'hA5 : Post_Data = 8'h62; 
	8'hA6 : Post_Data = 8'h63; 
	8'hA7 : Post_Data = 8'h64; 
	8'hA8 : Post_Data = 8'h66; 
	8'hA9 : Post_Data = 8'h67; 
	8'hAA : Post_Data = 8'h69; 
	8'hAB : Post_Data = 8'h6A; 
	8'hAC : Post_Data = 8'h6B; 
	8'hAD : Post_Data = 8'h6D; 
	8'hAE : Post_Data = 8'h6E; 
	8'hAF : Post_Data = 8'h6F; 
	8'hB0 : Post_Data = 8'h71; 
	8'hB1 : Post_Data = 8'h72; 
	8'hB2 : Post_Data = 8'h74; 
	8'hB3 : Post_Data = 8'h75; 
	8'hB4 : Post_Data = 8'h77; 
	8'hB5 : Post_Data = 8'h78; 
	8'hB6 : Post_Data = 8'h79; 
	8'hB7 : Post_Data = 8'h7B; 
	8'hB8 : Post_Data = 8'h7C; 
	8'hB9 : Post_Data = 8'h7E; 
	8'hBA : Post_Data = 8'h7F; 
	8'hBB : Post_Data = 8'h81; 
	8'hBC : Post_Data = 8'h82; 
	8'hBD : Post_Data = 8'h84; 
	8'hBE : Post_Data = 8'h85; 
	8'hBF : Post_Data = 8'h87; 
	8'hC0 : Post_Data = 8'h89; 
	8'hC1 : Post_Data = 8'h8A; 
	8'hC2 : Post_Data = 8'h8C; 
	8'hC3 : Post_Data = 8'h8D; 
	8'hC4 : Post_Data = 8'h8F; 
	8'hC5 : Post_Data = 8'h91; 
	8'hC6 : Post_Data = 8'h92; 
	8'hC7 : Post_Data = 8'h94; 
	8'hC8 : Post_Data = 8'h95; 
	8'hC9 : Post_Data = 8'h97; 
	8'hCA : Post_Data = 8'h99; 
	8'hCB : Post_Data = 8'h9A; 
	8'hCC : Post_Data = 8'h9C; 
	8'hCD : Post_Data = 8'h9E; 
	8'hCE : Post_Data = 8'h9F; 
	8'hCF : Post_Data = 8'hA1; 
	8'hD0 : Post_Data = 8'hA3; 
	8'hD1 : Post_Data = 8'hA5; 
	8'hD2 : Post_Data = 8'hA6; 
	8'hD3 : Post_Data = 8'hA8; 
	8'hD4 : Post_Data = 8'hAA; 
	8'hD5 : Post_Data = 8'hAC; 
	8'hD6 : Post_Data = 8'hAD; 
	8'hD7 : Post_Data = 8'hAF; 
	8'hD8 : Post_Data = 8'hB1; 
	8'hD9 : Post_Data = 8'hB3; 
	8'hDA : Post_Data = 8'hB5; 
	8'hDB : Post_Data = 8'hB6; 
	8'hDC : Post_Data = 8'hB8; 
	8'hDD : Post_Data = 8'hBA; 
	8'hDE : Post_Data = 8'hBC; 
	8'hDF : Post_Data = 8'hBE; 
	8'hE0 : Post_Data = 8'hC0; 
	8'hE1 : Post_Data = 8'hC2; 
	8'hE2 : Post_Data = 8'hC4; 
	8'hE3 : Post_Data = 8'hC5; 
	8'hE4 : Post_Data = 8'hC7; 
	8'hE5 : Post_Data = 8'hC9; 
	8'hE6 : Post_Data = 8'hCB; 
	8'hE7 : Post_Data = 8'hCD; 
	8'hE8 : Post_Data = 8'hCF; 
	8'hE9 : Post_Data = 8'hD1; 
	8'hEA : Post_Data = 8'hD3; 
	8'hEB : Post_Data = 8'hD5; 
	8'hEC : Post_Data = 8'hD7; 
	8'hED : Post_Data = 8'hD9; 
	8'hEE : Post_Data = 8'hDB; 
	8'hEF : Post_Data = 8'hDD; 
	8'hF0 : Post_Data = 8'hDF; 
	8'hF1 : Post_Data = 8'hE1; 
	8'hF2 : Post_Data = 8'hE3; 
	8'hF3 : Post_Data = 8'hE5; 
	8'hF4 : Post_Data = 8'hE7; 
	8'hF5 : Post_Data = 8'hEA; 
	8'hF6 : Post_Data = 8'hEC; 
	8'hF7 : Post_Data = 8'hEE; 
	8'hF8 : Post_Data = 8'hF0; 
	8'hF9 : Post_Data = 8'hF2; 
	8'hFA : Post_Data = 8'hF4; 
	8'hFB : Post_Data = 8'hF6; 
	8'hFC : Post_Data = 8'hF8; 
	8'hFD : Post_Data = 8'hFB; 
	8'hFE : Post_Data = 8'hFD; 
	8'hFF : Post_Data = 8'hFF; 
	endcase
end

endmodule

vitis代码

//作者:抢公主的大魔王
//功能:gamma映射
//日期:24.5.27
//版本:1v0
//联系方式:2376635586@qq.com
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xplatform_info.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"
#include "sleep.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
//#define THRESHOLD_BASEADDR 	XPAR_AXICTRLTHRESHOLD_0_S00_AXI_BASEADDR

#define EMIO_SCL_NUM 54
#define EMIO_SDA_NUM 55
#define KEY1 56 //T19
#define KEY2 57 //P19
#define KEY3 58 //U20
#define KEY4 59 //U19
#define KEY5 60 //V20
#define LED1 61 //H18
#define LED2 62 //K17
#define LED3 63 //E19

#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs Gpio;
#define GPIO_BANK	XGPIOPS_BANK0  /* Bank 0 of the GPIO Device */
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
#define GPIO_INTERRUPT_ID	XPAR_XGPIOPS_0_INTR

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

static XScuGic Intc; /* The Instance of the Interrupt Controller Driver */


static void IntrHandler(void *CallBackRef, u32 Bank, u32 Status)
{
	XGpioPs *Gpio_cb = (XGpioPs *)CallBackRef;
	if (XGpioPs_IntrGetStatusPin(Gpio_cb, KEY1)){
		//binary_threshold++;
		//Xil_Out32(THRESHOLD_BASEADDR, binary_threshold);
		//xil_printf("The threshold has been changed\n\rThe threshold now is %d\n\r",binary_threshold);
		XGpioPs_IntrClearPin(Gpio_cb, KEY1);
	}
	else if (XGpioPs_IntrGetStatusPin(Gpio_cb, KEY4)){
		//binary_threshold--;
		//Xil_Out32(THRESHOLD_BASEADDR, binary_threshold);
		//xil_printf("The threshold has been changed\n\rThe threshold now is %d\n\r",binary_threshold);
		XGpioPs_IntrClearPin(Gpio_cb, KEY4);
	}
	else if (XGpioPs_IntrGetStatusPin(Gpio_cb, KEY2)){
		//binary_threshold = binary_threshold+10;
		//Xil_Out32(THRESHOLD_BASEADDR, binary_threshold);
		//xil_printf("The threshold has been changed\n\rThe threshold now is %d\n\r",binary_threshold);
		XGpioPs_IntrClearPin(Gpio_cb, KEY2);
	}
	else if (XGpioPs_IntrGetStatusPin(Gpio_cb, KEY5)){
		//binary_threshold = binary_threshold-10;
		//Xil_Out32(THRESHOLD_BASEADDR, binary_threshold);
		//xil_printf("The threshold has been changed\n\rThe threshold now is %d\n\r",binary_threshold);
		XGpioPs_IntrClearPin(Gpio_cb, KEY5);
	}
	else if (XGpioPs_IntrGetStatusPin(Gpio_cb, KEY3)){
		//binary_threshold = 128;
		//Xil_Out32(THRESHOLD_BASEADDR, binary_threshold);
		//xil_printf("The threshold has been reset\n\rThe threshold now is %d\n\r",binary_threshold);
		XGpioPs_IntrClearPin(Gpio_cb, KEY3);
	}
	XGpioPs_WritePin(&Gpio, LED1, !XGpioPs_ReadPin(&Gpio, LED1));
}



void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,
				u16 GpioIntrId){

	XScuGic_Config *IntcConfig;
	Xil_ExceptionInit();

	IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);

	XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,
					IntcConfig->CpuBaseAddress);

	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
				(Xil_ExceptionHandler)XScuGic_InterruptHandler,
				GicInstancePtr);
	XScuGic_Connect(GicInstancePtr, GpioIntrId,
				(Xil_ExceptionHandler)IntrHandler,
				(void *)Gpio);


	XScuGic_Enable(GicInstancePtr, GpioIntrId);

	XGpioPs_SetIntrTypePin(Gpio, KEY1,  XGPIOPS_IRQ_TYPE_EDGE_FALLING);
	XGpioPs_SetIntrTypePin(Gpio, KEY2,  XGPIOPS_IRQ_TYPE_EDGE_FALLING);
	XGpioPs_SetIntrTypePin(Gpio, KEY3,  XGPIOPS_IRQ_TYPE_EDGE_FALLING);
	XGpioPs_SetIntrTypePin(Gpio, KEY4,  XGPIOPS_IRQ_TYPE_EDGE_FALLING);
	XGpioPs_SetIntrTypePin(Gpio, KEY5,  XGPIOPS_IRQ_TYPE_EDGE_FALLING);

	XGpioPs_IntrEnablePin(Gpio, KEY1);
	XGpioPs_IntrEnablePin(Gpio, KEY2);
	XGpioPs_IntrEnablePin(Gpio, KEY3);
	XGpioPs_IntrEnablePin(Gpio, KEY4);
	XGpioPs_IntrEnablePin(Gpio, KEY5);

	Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
}


void Gpio_Init(void){
	XGpioPs_Config *ConfigPtr;

	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);

	XGpioPs_SetDirectionPin(&Gpio, LED1, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, LED1, 1);
	XGpioPs_WritePin(&Gpio, LED1, 0);

	XGpioPs_SetDirectionPin(&Gpio, LED2, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, LED2, 1);
	XGpioPs_WritePin(&Gpio, LED2, 0);

	XGpioPs_SetDirectionPin(&Gpio, LED3, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, LED3, 1);
	XGpioPs_WritePin(&Gpio, LED3, 0);

	XGpioPs_SetDirectionPin(&Gpio, KEY1, 0);
	XGpioPs_SetDirectionPin(&Gpio, KEY2, 0);
	XGpioPs_SetDirectionPin(&Gpio, KEY3, 0);
	XGpioPs_SetDirectionPin(&Gpio, KEY4, 0);
	XGpioPs_SetDirectionPin(&Gpio, KEY5, 0);

	SetupInterruptSystem(&Intc, &Gpio, GPIO_INTERRUPT_ID);

}


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;
	cmos_v_pixel = 720;
	total_h_pixel = 2570;
	total_v_pixel = 980;


	emio_init();
	status = ov5640_init( cmos_h_pixel,  //初始化ov5640
						  cmos_v_pixel,
						 total_h_pixel,
						 total_v_pixel);//设置OV5640输出分辨率为1280*720  PCLK = 72Mhz
	if(status == 0)
		xil_printf("OV5640 detected successful!\r\n");
	else
		xil_printf("OV5640 detected failed!\r\n");

	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);
	Gpio_Init();
	while(1){
		XGpioPs_WritePin(&Gpio, LED3, !XGpioPs_ReadPin(&Gpio, LED3));
		sleep(1);
	}
    return 0;
}




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1703026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪款洗地机好用?洗地机十大排行榜

在智能家电飞速发展的今天&#xff0c;洗地机因其吸拖洗一体化的技术优势&#xff0c;成为越来越多家庭的清洁利器。它不仅能快速清理各种地面污渍&#xff0c;还能轻松处理干湿垃圾&#xff0c;大大提升了日常清洁的效率。可是面对市场上琳琅满目的洗地机品牌和型号&#xff0…

数据持久化第六课-ASP.NET运行机制

数据持久化第六课-ASP.NET运行机制 一.预习笔记 1.动态网页的工作机制通常分为以下几个阶段&#xff1a; 1&#xff09;使用动态Web开发技术编写Web应用程序&#xff0c;并部署到Web服务器。 2&#xff09;客户端通过在浏览器中输入地址&#xff0c;请求动态页面。 3&#…

Swift 初学者交心:在 Array 和 Set 之间我们该如何抉择?

概述 初学 Swift 且头发茂密的小码农们在日常开发中必定会在数组&#xff08;Array&#xff09;和集合&#xff08;Set&#xff09;两种类型之间的选择中“摇摆不定”&#xff0c;这也是人之常情。 Array 和 Set 在某些方面“亲如兄弟”&#xff0c;但实际上它们之间却有着“云…

关于DDos防御...别在听别人瞎扯了.....

前言 无意间刷文章的时候看到一篇文章&#xff0c;写的是遇到ddos&#xff0c;怎么用iptables封IP....... 然后我就百度搜了一下&#xff0c;好多都是这么说的&#xff0c;但是我发现&#xff0c;大多数人只要遭受过长期Ddos的&#xff0c;就不会再信网上的文章 文笔不太好&…

【Qt】深入探索Qt事件处理:从基础到高级自定义:QEvent

文章目录 前言&#xff1a;1. 事件的介绍2. 事件的处理2.1. 示例1&#xff1a; 重写鼠标进入和鼠标离开事件2.2. 示例2&#xff1a;当鼠标点击时&#xff0c;获取对应的坐标值&#xff1b;2.3. 鼠标释放事件2.4. 鼠标双击事件2.5. 鼠标移动事件2.6. 鼠标滚轮的滚动事件 3. 按键…

后端经典三层架构

大家好&#xff0c;这里是教授.F 引入&#xff1a; MVC 全称∶ Model 模型、View 视图、 Controller 控制器。MVC 最早出现在 JavaEE 三层中的 Web 层&#xff0c;它可以有效的指导WEB 层的代码如何有效分离&#xff0c;单独工作。 View 视图∶只负责数据和界面的显示&#…

Python I/O操作笔记

打开文件&#xff1a; 使用 open() 函数&#xff0c;其中文件路径可以是相对路径或绝对路径。 模式除了常见的 r&#xff08;只读&#xff09;、w&#xff08;写入&#xff0c;会覆盖原有内容&#xff09;、a&#xff08;追加&#xff09;外&#xff0c;还有一些其他组合模式&…

小度推出全球首款基于文心大模型的学习机Z30,仅售价6699元

5月27日&#xff0c;小度科技召开新品发布会&#xff0c;全球首款基于文心大模型的学习机——小度学习机Z30重磅发布。 据「TMT星球」了解&#xff0c;该产品基于文心大模型&#xff0c;重新定义了“AI老师”的能力边界&#xff0c;不仅是一款能为孩子提供全面、有效学习辅导的…

LINUX环境基础练习题(附带答案)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

嵩山为什么称为五岳之尊

在此之前&#xff0c;人们心目中的五岳之尊一般是东岳泰山。自此以后&#xff0c;观点一定会改变&#xff1a;五岳之尊是中岳嵩山&#xff01;且听我慢慢道来。 首先将二者进行一下对比—— 中与东的对比&#xff0c;嵩山居中&#xff0c;泰山居东。东方是太阳升起的地方&#…

云原生Kubernetes: 云主机部署K8S 1.30版本 单Master架构

目录 一、实验 1.环境 2.Termius连接云主机 3.网络连通性与安全机制 4.云主机部署docker 5.云主机配置linux内核路由转发与网桥过滤 6.云主机部署cri-dockerd 7.云主机部署kubelet,kubeadm,kubectl 8.kubernetes集群初始化 9.容器网络&#xff08;CNI&#xff09;部署…

牛客NC67 汉诺塔问题【中等 递归 Java/Go/PHP/C++】 lintcode 169 · 汉诺塔

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/7d6cab7d435048c4b05251bf44e9f185 https://www.lintcode.com/problem/169/ 思路 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C…

书生·浦语大模型全链路开源体系-作业1

视频链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 1. LLM发展 LLM是近年来人工智能领域的一个重要发展方向。大型语言模型的历史可以追溯到2017年,当时OpenAI推出了GPT-1(Generative Pre-trained Transformer)模型,这是一个基于Transformer架构的语言生成…

论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023

《论文阅读》学习了解自己&#xff1a;一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023 前言 简介研究现状任务定义模型架构Learning to know myselfLearning to avoid Misidentification损失函数实验结果消融实验 前言 亲身阅读感受分享&#xff0c;细节画图解释…

28【Aseprite 作图】苹果——拆解

1 画苹果框架 左边:第一行 7 第二行 2 第三 四行1 竖着7行 竖着2行 竖着1 、1 行 横着2个 横着4个 苹果可以是左右对称的,完成上述后,水平翻转到右边 2 枝叶 第一行1 左边 2 3 4 行,各1 第5行,竖着4个 再横着3个 右边 竖着3个,然后斜着2个,然后斜着1个 最上面的,两个…

RTDETR结合CVPR2024最新图像增强算法!让你的模型无惧风雨【含端到端推理脚本】

如何有效地探索雨痕的多尺度表示对于图像去雨是很重要的。与现有的基于Transformer的方法相比,这些方法主要依赖于单一尺度的雨痕外观,我们开发了一个端到端的多尺度Transformer,利用各种尺度中潜在有用的特征来促进高质量的图像重建。为了更好地探索空间变化的雨痕的常见退…

九宫格转圈圈抽奖活动,有加速,减速效果

在线访问demo和代码在底部 代码&#xff0c;复制就可以跑 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

2023idea没有VCS首次提交代码到Git

1、setting 2、vcs------>create git repository 3、右键项目----->Git------>add 4、右键项目------>git------>commit Directory 之后就会显示这个页面(下面写你提交的信息&#xff0c;就是你修改了什么) 点击commit,提交 5、Git--------->push 6、选择…

C++基础:类的继承,public,private,protected

三种继承模式 在上图中: 派生继承 三种继承模式 protected模式中 父类的公有属性和保护属性的成员在子类中都会变为保护属性,只能通过父类或者子类的成员函数调用. 代码示例: #include <iostream> #include <string> using namespace std; //protected class per…

numpy-mkl的下载地址

不要使用pip3直接在终端安装&#xff0c;因为pip3默安装的是numpy&#xff0c;而不是numpymkl。 采用在第三方库中手动下载后&#xff0c;再安装的方式。 第三方库网址&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 如果不能进入就可以选择去git里面&#x…