//BD中设置的3帧缓存地址 #define VIDEO_BASEADDR0 0x01000000 #define VIDEO_BASEADDR1 0x02000000 #define VIDEO_BASEADDR2 0x03000000 #define AXI_LITE_PL 0x43C00000 #define H_ACTIVE 1280 //行宽、水平方向字节数 #define V_ACTIVE 1024 //行数、垂直方向行数 #define H_STRIDE 1280 //跨度(帧延迟),每一行的偏移 #define START 0x00000001 int main() { Xil_DCacheDisable(); //把0x108B写到VDMA_BASEADDR + 0x030地址 /*****************写数据到DDR进行配置设置(S2MM)**********************/ Xil_Out32((VDMA_BASEADDR + 0x030), 0x108B); // enable circular mode Xil_Out32((VDMA_BASEADDR + 0x0AC), VIDEO_BASEADDR0); // start address,存入第一帧开始地址 Xil_Out32((VDMA_BASEADDR + 0x0B0), VIDEO_BASEADDR1); // start address Xil_Out32((VDMA_BASEADDR + 0x0B4), VIDEO_BASEADDR2); // start address 每次递增四个字节 Xil_Out32((VDMA_BASEADDR + 0x0A8), (H_STRIDE*1)); // h offset 1280 bytes(*1)表示数据是一个字节,即每个像素的位宽/8 Xil_Out32((VDMA_BASEADDR + 0x0A4), (H_ACTIVE*1)); // h size 1280 bytes Xil_Out32((VDMA_BASEADDR + 0x0A0), V_ACTIVE); // v size 1024 /*****************从DDR中读数据设置(MM2S)**********************/ Xil_Out32((VDMA_BASEADDR + 0x000), 0x8B); // enable circular mode Xil_Out32((VDMA_BASEADDR + 0x05c), VIDEO_BASEADDR0); // start address Xil_Out32((VDMA_BASEADDR + 0x060), VIDEO_BASEADDR1); // start address Xil_Out32((VDMA_BASEADDR + 0x064), VIDEO_BASEADDR2); // start address 同样每次递增四个字节 Xil_Out32((VDMA_BASEADDR + 0x058), (H_STRIDE*1)); // h offset 1280 bytes,代表stream每发送(H_STRIDE*1)byte数据后,就产生一个tlast; Xil_Out32((VDMA_BASEADDR + 0x054), (H_ACTIVE*1)); // h size 1280 bytes,代表只要vdma从内存取够(H_ACTIVE*1)byte,就会开始stream传输; Xil_Out32((VDMA_BASEADDR + 0x050), V_ACTIVE); // v size 1024 Xil_Out32((AXI_LITE_PL + 0x0000),START); //使能图像输出模块 /*在A8、A4、58、54 这四个寄存器配置有效传输宽度,后面的 “*3” 表示一个像素数据有3个字节,也就是RGB888(24bit),如果是RGBA(32bit),则应该设置为 “*4” 0x30寄存器(VDMA Control Register,简称 VDMACR)进行配置,0x108B转化成二进制:1000010001011,只看低四位就是1011,对应四个配置 3 GenlockEn 默认0 0:关闭Genlock或动态Genlock同步;1:开启Genlock或动态Genlock同步 2 Reset 默认0 0:正常操作;1:复位MM2S通道 1 Circular_Park 默认1 0:停留模式;1:循环模式 0 RS 默认 0 0:VDMA停止;1:VDMA运行;开始前必须置1 0x00寄存器也是同样