提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

ZYNQ开发系列——hw_platform包和BSP包中的一些理解

  • 前言
  • hw_platform
  • BSP包

前言

前面我们完成了PS输出helloworld、PS与PL交互、MIO,EMIO,AXI GPIO的控制、以及PS中断的一些功能,前面的章节不去扣细枝末节,只求快速实现功能,算是一种偷跑吧,尽管一般说来,我们只要能会用即可,因为那些代码也很简单也比较独立,只要需要这些功能的时候把相关代码复制过去就可以了。但毕竟还是比较浅表的东西,有时候还是希望稍深入的了解一下。

hw_platform

下面带着一些问题,来初步探索一下SDK工程中的相关文件内容

我们点击了Export hardware之后,生成了一个hdf文件。这个是是硬件描述文件(Hardware Description File),里面包含了PS所有外设的地址空间映射,如下图所示(和Vivado中的Address Editor是对应的)
启动SDK后,会自动生成了一个hw_platform的文件夹

Ps7_init.c和ps7_init.h,(与Ps7_init_gpl.c和ps7_init_gpl.h内容上完全一样)用于初始化CLK,DDR和MIO。Ps7_init.tcl完成的初始化和ps7_init.c代码完成的初始化是相同的。这点我们稍微从Ps7_init.c 和 Ps7_init.tcl的前几行内容就可以看出来了

Ps7_init.c

Ps7_init.tcl

但Ps7_init.tcl是JTAG调试的时候才使用,而Ps7_init.c/Ps7_init_gpl.c其他方式启动(后面搞清楚了再这里补充),在run configurations的对话框中,看到了这个。

BSP包

在SDK里新建工程(File->New->Application Project)后,会出现system.mss,里面包含了外设的种类、驱动和示例程序,如下图所示。

Libsrc包含了各个外设的驱动代码
图中列出了板卡上使用的外设、文档和示例程序,例如下图中板卡上使用了若干gpio(axi_gpio_address等),1个ps7_ethernet(emacps)等等。
通过软件自带的Examples可以学习外设的使用。这些example 甚至直接就能跑。

不过,在我们打开example之前,首先必须需要知道这个文件xparameters.h。这个文件太重要了,这个文件就是整个系统中所有存在的外设驱动的一些定义
我这里把几段拿出来看看是啥意思。之前的工程中,我们知道我们与AXI GPIO、MIO/EMIO、UART 2个、还有中断,我们看看这个文件中是否有对应信息

/* Definitions for driver GPIO */
#define XPAR_XGPIO_NUM_INSTANCES 1/* Definitions for peripheral AXI_GPIO_0 */
#define XPAR_AXI_GPIO_0_BASEADDR 0x41200000
#define XPAR_AXI_GPIO_0_HIGHADDR 0x4120FFFF
#define XPAR_AXI_GPIO_0_DEVICE_ID 0
#define XPAR_AXI_GPIO_0_INTERRUPT_PRESENT 0
#define XPAR_AXI_GPIO_0_IS_DUAL 0

这段代码表示,我们这个系统存在1个XGPIO外设,并且给出了第1个外设相关的参数BASEADDR、HIGHADDR、DEVICE_ID,这个外设是实际存在的,我们需要在我们的代码中去调用。

/* Definitions for driver GPIOPS */
#define XPAR_XGPIOPS_NUM_INSTANCES 1/* Definitions for peripheral PS7_GPIO_0 */
#define XPAR_PS7_GPIO_0_DEVICE_ID 0
#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000
#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF

这段代码表示,我们这个系统存在1个XGPIOPS外设,并且给出了第1个外设相关的参数BASEADDR、HIGHADDR、DEVICE_ID,这个外设是实际存在的,我们需要在我们的代码中去调用。

/* Definitions for driver UARTPS */
#define XPAR_XUARTPS_NUM_INSTANCES 2/* Definitions for peripheral PS7_UART_0 */
#define XPAR_PS7_UART_0_DEVICE_ID 0
#define XPAR_PS7_UART_0_BASEADDR 0xE0000000
#define XPAR_PS7_UART_0_HIGHADDR 0xE0000FFF
#define XPAR_PS7_UART_0_UART_CLK_FREQ_HZ 100000000
#define XPAR_PS7_UART_0_HAS_MODEM 0/* Definitions for peripheral PS7_UART_1 */
#define XPAR_PS7_UART_1_DEVICE_ID 1
#define XPAR_PS7_UART_1_BASEADDR 0xE0001000
#define XPAR_PS7_UART_1_HIGHADDR 0xE0001FFF
#define XPAR_PS7_UART_1_UART_CLK_FREQ_HZ 100000000
#define XPAR_PS7_UART_1_HAS_MODEM 0

这段代码表示,我们这个系统存在2个XUARTPS外设,并且给出了2个外设相关的参数BASEADDR、HIGHADDR、DEVICE_ID、UART_CLK_FREQ_HZ等参数,这2个外设是实际存在的,我们需要在我们的代码中去调用。

/* Definitions for driver SCUGIC */
#define XPAR_XSCUGIC_NUM_INSTANCES 1U/* Definitions for peripheral PS7_SCUGIC_0 */
#define XPAR_PS7_SCUGIC_0_DEVICE_ID 0U
#define XPAR_PS7_SCUGIC_0_BASEADDR 0xF8F00100U
#define XPAR_PS7_SCUGIC_0_HIGHADDR 0xF8F001FFU
#define XPAR_PS7_SCUGIC_0_DIST_BASEADDR 0xF8F01000U

这段代码表示,我们这个系统存在1个SCUGIC外设,并且给出了这个外设相关的参数BASEADDR、HIGHADDR、DEVICE_ID、DIST_BASEADDR等参数,这个外设是实际存在的,我们需要在我们的代码中去调用。

可以看出每个driver的定义都是一个套路,首先声明有多少个INSTANCES,然后将每个INSTANCES的参数列出来

我们来学习一下一个关于AXI_GPIO的example。
1、 首先定义一个AXI_GPIO驱动的实例 XGpio Gpio
也就是说XGpio就是AXI_GPIO驱动的定义

 typedef struct {UINTPTR BaseAddress;    /* Device base address */u32 IsReady;       /* Device is initialized and ready */int InterruptPresent;  /* Are interrupts supported in h/w */int IsDual;        /* Are 2 channels supported in h/w */
} XGpio;

2、初始化XGpio的实例Gpio

XGpio_Initialize(&Gpio, GPIO_EXAMPLE_DEVICE_ID)
实际上作用就是要将我们定义的实例映射到实际的外设(device)上去,而上面我们讲过实际的外设是有编号区分的。
我们进入这个函数进行细看,里面有一个这样的函数XGpio_LookupConfig,从这个函数我们可以看出,驱动有一个列表XGpio_ConfigTable来保存每个实际实例的具体参数信息,我们通过DEVICE_ID查询列表,查到后就将这个实例映射到对应的DEVICE_ID这个外设上去。感觉说的有点绕,直接看代码更加明了。

3、然后就是设置XGpio方向,实际上就是对特定地址寄存器进行设置了

4、写XGpio的值,也是对特定地址寄存器进行写值。

关于这些地址的定义,就得查询这个文档了。
其他的外设的例程就不列举了,总之通过例程程序可以节省很多时间快速学习使用。

ZYNQ开发系列——hw_platform包和BSP包中的一些理解相关推荐

  1. ZYNQ开发系列——双串口打印以及串口波特率设置

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--双串口打印以及串口波特率设置 前言 双串口打印 串口波特率的修改 前言 上一篇,我们遗留了这两个问题: 1. 如果 ...

  2. zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED(SDK开发详解)

    axi_gpio是PL端gpio(FPGA资源搭建的软核),ps7_gpio是ps端gpio(硬核).打开Documentation的示例Examples,可知第二个是关于中断的示例.导入示例impo ...

  3. zynq开发系列4:MIO按键中断控制LED

    与实验三类似 zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起 ,PS部分设置为与实验一helloword相同的最小系统,但按键控制LED的方式设置为中断,即通过按下按键为中断这一方式从 ...

  4. zynq开发系列4:EMIO连接按键控制MIO连接的灯

    EMIO是负责PL端和PS端通信,PL侧按键可以通过连接EMIO来控制连接到MIO的PS侧的LED.原理和实验3 zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起 类似,只是由MIO侧的 ...

  5. zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起

    按键和LED由MIO连接,在PS端用按键控制LED,按键按下时发出信号,LED接收到信号后亮起 可以参考上一节实验 zynq开发系列2:GPIO连接MIO控制LED闪烁 的流程和代码,在vivado操 ...

  6. ZYNQ开发系列——PS开发之HelloWorld

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--PS开发之HelloWorld 前言 外设接口 SDK建立工程相关操作记录 前言 俗话说一日不见,如隔三秋.两年没 ...

  7. ZYNQ开发系列——PS响应PL中断请求

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--PS响应PL中断请求 前言 中断的设置 PS部分代码 前言 PS和PL的交互中,还有一个中断没有讲到,在<从 ...

  8. ZYNQ开发系列——使用AXI4LITE接口进行PS和PL交互

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--使用AXI4LITE接口进行PS和PL交互 前言 PS端AXI接口 AXI4LITE slave模块的设计 后记 ...

  9. ZYNQ开发系列——ZYNQ系统的搭建

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--ZYNQ系统的搭建 DDR设置 FLASH设置 UART设置 网口设置 当我们有一个要用ZYNQ做的项目时,首先当 ...

最新文章

  1. 利用JNI技术在Android中调用C++代码
  2. ue4是什么意思_恋爱中,男生最喜欢什么相处模式?
  3. weblogic调优的经过
  4. 《剑指offer》第四题(二维数组中的查找)
  5. [渝粤教育] 西南科技大学 管理学原理 在线考试复习资料(5)
  6. 数据库的完整性和安全性
  7. C#中的深度学习:了解神经网络架构
  8. 如何通过改造休闲旅行车赚到1000万元?
  9. Unicode 和 UTF-8 之间的关系
  10. Linux 系统编程技巧与概念 第12章 基于 TLV 传输
  11. java.util.ConcurrentModificationException 异常问题详解
  12. C#中奇怪的Queue T 行为!
  13. [转载]SQL Server 2008 R2安装时选择的是windows身份验证,未选择混合身份验证的解决办法...
  14. 一图看懂什么是集成电路?
  15. CuteFTP Pro 8.3.4 最新破解绿色版
  16. 最好的 6 款 React 后台管理系统模板和框架
  17. MySQL分页查询效率
  18. python爬取美女图片_Python 爬取美女图片
  19. 火狐Android 附加组件,Android版Firefox 85允许AMO安装附加组件
  20. android 静态蓝牙地址吗,用于BLE广告的Android 5静态蓝牙MAC地址 | 所有编程讨论 | zhouni.net...

热门文章

  1. Android O 安卓启动时间优化分析
  2. Substrate 基础教程(Tutorials) -- 模拟网络 添加可信节点
  3. VS2019 配色_SOAR NEWS两款全新配色 Kobe 5、Louis Vuitton x NBA 项链
  4. 黑马程序员——java基础---网络编程
  5. 数字图像 - 图像隐写
  6. C语言完成图书管理系统
  7. Redis事务与Pipeline功能
  8. 一、webpack的全局安装和局部安装以及使用
  9. USB Camera摄像头 (UVC 与 gspca)
  10. 最好用的xshell替代软件----FinalShell工具