【【手把手教你从SD卡驱动VDMA显示图片实验】】

这篇具有很好参考价值的文章主要介绍了【【手把手教你从SD卡驱动VDMA显示图片实验】】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

手把手教你从SD卡驱动VDMA显示图片实验

图像格式介绍

典型的BMP图像文件是由四部分组成的
包括了BMP的文件头,BMP信息头,调色板,位图数据
因为传递的是RGB图像 RGB不太需要调色板了 从信息头直接到位图数据

【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频
文件头占据了14个字节
分别是
【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频
查看这个16进制格式 BMP的文件格式 总是低字节的放在低地址位,高字节放在高地址位。
可以查看到如下的二进制
【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频
前2字节 0x4d42 是 代表了图片的类型是 BM
后面的4字节 0x00_11_94_36 是 代表了字节的大小
后面的合起来4字节 保留都是 0x00_00_00_00
最后的4字节是代表了从文件开始到真正的数据的偏移量 0x36 代表了54个字节
记住这里的是0ah 的位置
这里一共合计14个字节

下面的一共 40个字节 用来表示BMP数据头的信息
【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频
在这里面最主要关注的就是上面的
bitWidth 图像宽度
bitHeight 图像高度
bitBitCount 图像位深
bitSizeImage 图像大小

整个架构block design 的连接参照
VDMA与HDMI的连接

需要修改的是 zynq核
启用SD的连接
【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频
【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频
注意修改电平 不然会被烧坏整个SD卡
整体的block design 构建如下
其实和上一节的 block design是一样的
【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频
启动vitis

我的src只有3个文件
因为输出的是720p的图像 我并没有参照例程做
我的main.c有两版都可以运行

第一个main.c

#include"stdio.h"
#include "stdlib.h"
#include "string.h"
#include"xparameters.h"
#include"vdma_api.h"
#include "xaxivdma.h"
#include "xil_types.h"
#include "xil_cache.h"
#include "ff.h"
#define   VDMA_ID        XPAR_AXI_VDMA_0_DEVICE_ID      // VDMA ID
#define   DDR_ADDRESS    XPAR_PS7_DDR_0_S_AXI_BASEADDR  // DDR的基地址 0x00100000
#define   WIDTH          1280
#define   HEIGHT         720
int       frame_buffer_addr   =   DDR_ADDRESS + 0x10000000   ;
void load_sd ( u8 * frame);
int main()
{
Xil_DCacheDisable();
    XAxiVdma vdma_inst;  // 这是例化的驱动实例


// 往VDMA的帧缓存写入图案
//先写SD卡

    // 配置并启动VDMA
    run_triple_frame_buffer(
            &vdma_inst,        // VDMA 驱动实例
            VDMA_ID,           // VDMA 器件ID
             WIDTH,             // 图像宽度
            HEIGHT,            // 图像高度
            frame_buffer_addr, // VDMA帧缓存的起始地址
            0,
            0);

load_sd((u8*)frame_buffer_addr);
}
void load_sd ( u8 * frame)
{
//先定义一个 FATFS 的 文件系统
static     FATFS fatfs;
FIL     fil;
UINT     *bmp_width,*bmp_height;
UINT     br;
int     i;
u8 bmp_head[54];
//挂载文件系统
printf("%d\n",f_mount(&fatfs,"",1));

//打开文件
f_open(&fil,"xiaoeyu.bmp",FA_READ);   //FA_READ 表示只读的形式
xil_printf("show1\n\r");
//移动文件读写指针到文件开头
f_lseek(&fil,54);
xil_printf("show2 \n\r");

f_read(&fil,bmp_head,54,&br);

 //打印 BMP 图片分辨率和大小
 bmp_width = (UINT  *)(bmp_head + 0x12);
 bmp_height = (UINT *)(bmp_head + 0x16);

 //printf("%d,%d\n",*bmp_width, *bmp_height);

// f_lseek(&fil,54);
//读出图片,写入DDR
for(i=*bmp_height-1;i>=0;i--){
    f_read(&fil,frame+i*(*bmp_width)*3,(*bmp_width)*3,&br);

}
//关闭文件
f_close(&fil);
    xil_printf("show bmp\n\r");

}

第二版main.c

#include"stdio.h"
#include "stdlib.h"
#include "string.h"

#include"xparameters.h"
#include"vdma_api.h"

#include "xaxivdma.h"
#include "xil_types.h"
#include "xil_cache.h"

#include "ff.h"



#define   VDMA_ID        XPAR_AXI_VDMA_0_DEVICE_ID      // VDMA ID
#define   DDR_ADDRESS    XPAR_PS7_DDR_0_S_AXI_BASEADDR  // DDR的基地址 0x00100000
#define   WIDTH          1280
#define   HEIGHT         720
int       frame_buffer_addr   =   DDR_ADDRESS + 0x10000000   ;
void load_sd ( u8 * frame);


int main()
{


	Xil_DCacheDisable();
		XAxiVdma vdma_inst;  // 这是例化的驱动实例


	// 往VDMA的帧缓存写入图案
	//先写SD卡

		// 配置并启动VDMA
		run_triple_frame_buffer(
				&vdma_inst,        // VDMA 驱动实例
				VDMA_ID,           // VDMA 器件ID
			 	WIDTH,             // 图像宽度
				HEIGHT,            // 图像高度
				frame_buffer_addr, // VDMA帧缓存的起始地址
				0,
				0);
load_sd((u8*)frame_buffer_addr);
}



void load_sd ( u8 * frame)
{
	//先定义一个 FATFS 的 文件系统
	static 	FATFS fatfs;
	FIL 	fil;
	UINT 	*bmp_width,*bmp_height;
	UINT 	br;
	int 	i;
	//u8 bmp_head[54];


	//挂载文件系统
	printf("%d\n",f_mount(&fatfs,"",1));

	//打开文件
	f_open(&fil,"xiaoeyu.bmp",FA_READ);   //FA_READ 表示只读的形式
	xil_printf("show1\n\r");
	//移动文件读写指针到文件开头
	f_lseek(&fil,0);
	xil_printf("show2 \n\r");

	//f_read(&fil,bmp_head,54,&br);

	 //打印 BMP 图片分辨率和大小
	 bmp_width = (UINT  *)(&fil + 0x12);
	 bmp_height = (UINT *)(&fil + 0x16);

	 //printf("%d,%d\n",*bmp_width, *bmp_height);

     f_lseek(&fil,54);
	//读出图片,写入DDR
	for(i=*bmp_height-1;i>=0;i--){
		f_read(&fil,frame+i*(*bmp_width)*3,(*bmp_width)*3,&br);
}
	//关闭文件
		f_close(&fil);

		xil_printf("show bmp\n\r");

}

接下来的vdma_api.c

我在两处禁用了写使能端口
【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频
【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频

vdma_api.h

#include "xaxivdma.h"
#include "xparameters.h"
#include "xil_exception.h"


int run_triple_frame_buffer(XAxiVdma* InstancePtr, int DeviceId, int hsize,
		int vsize, int buf_base_addr, int number_frame_count,
		int enable_frm_cnt_intr) ;

【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频

实验结果如图所示

【【手把手教你从SD卡驱动VDMA显示图片实验】】,SOC学习,FPGA学习,fpga开发,单片机,嵌入式硬件,实时音视频文章来源地址https://www.toymoban.com/news/detail-812238.html

到了这里,关于【【手把手教你从SD卡驱动VDMA显示图片实验】】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你从0开始在服务器上部署stable diffusion

    验证是否有nvidia驱动 如果没有显示出显卡信息(如下) 则需要参考 ubuntu安装nvidia驱动 https://blog.csdn.net/Perfect886/article/details/119109380 远程连接服务器工具:VS Code https://code.visualstudio.com/Download VS Code 插件:Remote 文件传输工具 FileZilla https://www.filezilla.cn/download 下载地址: https:

    2024年02月06日
    浏览(58)
  • Swagger:手把手教你从0开始配置idea中swagger,全步骤配图文版。

    Swagger 是一组用于设计、构建、文档化和使用 RESTful Web 服务的开源工具和框架。它允许开发团队设计、构建和测试 API,并提供易于理解的文档,以便开发人员和消费者能够快速了解和使用 API。Swagger 通常与各种编程语言和框架一起使用,以简化 API 的开发和维护过程。 1.文件

    2024年02月04日
    浏览(72)
  • 前端小程序,手把手教你从零开始做一个酷炫的扭蛋机十连抽动画效果

    其实没有做多复杂的效果,连 canvas 都没用上,都是一些简单的平面变换,不过一段看似复杂的动画往往都是几个简单的变换拼接而成,所以我们逐步拆解,很简单的就能得到一个扭蛋机十连抽效果。 语言环境 我这边使用的是 tailwindcss 和 ts,在 uniapp  + vue3 的情况下写的小

    2024年04月13日
    浏览(65)
  • 【Oracle安装及使用】超级详细的初次在python中使用Oracl图文详解!手把手教你从安装Oracle到在python中连接Oracle!

    需要安装pycharm、 主要任务:安装Oracle、Oracle环境配置、新建数据库、测试、pycharm中下载包、pycharm中使用Oracle。 1.Oracle完整安装详解 这篇很详细了,还附了安装包,按照博主一套下来基本没问题。 此外有几个小改动: (1)HOST我改成了IP地址 * 查询自己的本机地址方式如下

    2024年02月01日
    浏览(50)
  • 手把手教你在ARM板上写一个驱动程序!

    摘要:搞嵌入式有两个方向,一个是嵌入式软件开发(MCU方向),另一个是嵌入式软件开发(Linux方向)。其中MCU方向基本是裸机开发和RTOS开发。而Linux开发方向又分为驱动开发和应用开发。其中应用开发相比于驱动开发来说简单一些,因为搞驱动你要和Linux内核打交道。而我们普

    2024年02月01日
    浏览(87)
  • 手把手教你从零搭建ChatGPT网站AI绘画系统,(SparkAi系统V6)GPTs应用、DALL-E3文生图、AI换脸、垫图混图、SunoAI音乐生成

    SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型+国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPTs、GPT语音对话、GPT-4模型、GPT联网提问、DALL-E

    2024年04月17日
    浏览(46)
  • 【ubuntu2004安装N卡驱动】

    硬件:联想notebook16,显卡4060laptop 软件: ubuntu20.04 驱动安装成功的版本:NVIDIA-Linux-x86_64-535.146.02.run 让手动安装。 环境准备: 禁用nouveau 在文本最后添加 然后更新,重启 重启之后输入以下命令,如果没有输出则成功 查看nvidia型号并且在官网下载 查看显卡硬件是否安装正确

    2024年02月22日
    浏览(45)
  • 无线网卡驱动怎么安装详细介绍

    随着无线网络的流行,如今不管是智能手机以及笔记本、甚至是台式电脑都愈加流行使用无线网络,对于笔记本或者台式电脑来说,使用无线上网也比较简单,一般笔记本都自带有无线网卡,台式电脑则需要单购购买无线网卡连接上电脑即可,对于某些笔记本或者台式电脑使

    2024年02月05日
    浏览(49)
  • windows server 2016 安装有线网卡驱动

    https://www.intel.cn/content/www/cn/zh/download/18737/26092/intel-network-adapter-driver-for-windows-server-2016.html? 有改不好的,我下面有已经改好的,可以直接下载使用 。 https://download.csdn.net/download/qq_45935297/86016065 bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS bcdedit -set TESTSIGNING ON 执行完毕后重启。 更新驱

    2024年02月04日
    浏览(51)
  • Ubuntu20.04无线网卡驱动安装

    UbuntuU盘启动盘安装好Ubuntu 20.04之后,发现没有无线网络,不过有线可以用。 比较简单的就是直接拉一条网线进行连接,如果没有网线,有另外一台带无线的电脑也可以 进入设置 选择更改适配器设置 选择连上的无线网络,右键选择属性 选择共享,勾线允许其他网络,点击确

    2023年04月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包