#ZYNQ-7000系列文章目录
第一章 【Vivado/Vitis 2024.2】工程的组织和创建丨使用PS MIO读写GPIO
文章目录
前言
最近(2024.11.18)AMD官方推出了Vivado/Vitis 2024.2新版本,正好时间充裕,手头有空闲的开发板,所以想使用新板子和新版本的开发环境娱乐一下。所以就有了这一篇Vivado/Vitis 2024.2初体验的文章。
Vitis新版本将HLS和SDK融合在一起,并且以VSCode界面开发,使用clang编译器和cmake组织工程,相较于老版本的界面代码提示更快,界面逻辑性和美观性更强,目前给笔者的开发体验是比较好的。本文章相当于实现了之前SDK的功能。
Vivado:2024.2
Vitis:2024.2
ZYNQ芯片:xc7z020clg400-2
开发板:野火皓月ZYNQ-7000
一、ZYNQ MIO结构
ZYNQ 芯片的GPIO 分为三种,分别是MIO、EMIO和AXI_GPIO,其中MIO是PS的专用I/O,作为普通输入输出或者外设驱动I/O来使用,EMIO是扩展的MIO,当MIO不够时,可以使用部分PL的I/O做为MIO来使用,而AXI_GPIO是一个可以实现GPIO功能的IP核,PS端可以通过AXI总线对其进行操作。在需要众多I/O口的应用场合,AXI_GPIO可以将所有可用引脚作为I/O口使用。
ZYNQ的GPIO分为4个Bank,在官方手册中记为Bank0到Bank3。其中MIO连接Bank0和Bank1,在原理图中常常对应Bank500和Bank501。其余的Bank2和Bank3连接EMIO,他们本身是PL端的引脚,当PS端的引脚不够用,或者PS端必须通过PL端的引脚输出时,就可以将外设的端口连接到PL的EMIO上(也就是说,如果一个设备连接在PL的端口上,我们可以通过EMIO使用PS的CPU来控制这个端口)。
MIO是PS内核和PS外设沟通的桥梁。对于外设,相信熟悉STM32的开发者并不会陌生。UART0是最常用的PS外设之一,除此之外,PS端还拥有SPI、I2C、CAN、GPIO、SD、USB、ENET等众多外设。我们可以使用库函数的方式直接调用和使用这些外设,并且如果我们仅仅使用ZYNQ的PS端,那么开发流程和开发单片机裸机不会有太大区别。
相较于STM32,MIO的端口映射自由了很多,但它并不能完全做到像FPGA那样想映射哪个端口就映射在哪个端口。我们可以在多个可选的组合中进行配置,具体可选的方案在Vivado的Block Design界面就可以找到。
二、Vitis 设置
在这里记录一些新版Vitis使用的经验。
1.Vitis 串口助手使能
网络上关于Vitis设置的教程极少,很多设置和功能目前笔者也只能根据零星的资源和教程以及自己的经验摸索。甚至对比Vitis
2024.1和Vitis 2024.2,后者似乎删除了自带的串口助手,好在无伤大雅(也可能是AMD官方放在别的地方我没有找到),使用自己的串口助手(笔者使用vofa+)。 通过在AMD官方论坛发帖提问,笔者得到了想要的答案。Vitis 2024.2自带的串口助手需要手动使能后开启。具体问题贴:Vitis
2024.2 may be missing serial monitor?。使用后感觉还不如自己的串口助手好用(貌似只能接收不能发送),不过AMD官方确实也声明了该功能还在开发中。
2.切换编程字体和大小
windows 11 更新了系统自带的Cascadia Code字体,笔者非常喜欢。如果你不是windows 11 系统,也可以自行安装字体后在这里更改。
更改字体大小同理,直接搜索即可。
3.空格和制表符的显示设置
默认是选择的字符才显示空格制表符,这会导致在编辑代码时选中的代码与未选中的代码对齐不一致,操作别扭,所以要么就改成全部显示要么就全部不显示。
笔者这里习惯设置为全部显示
4.查看库函数源码
使用.xsa文件创建平台后,可以在打开平台中使能的外设的库函数代码。在这里以使能GPIO为例,在下面的路径查看库函数相关的源码。
5.查看例程
AMD官方为这些外设提供了详尽的手册说明和样例,非常有助于我们学习。可以在下面的位置找到每一个外设的手册链接和样例App。
三、MIO(GPIO)的常用库函数
GPIO的使用较为简单,编程思路可以大体分为以下三步:
- 初始化GPIO(创建XGpioPs对象和XGpioPs_Config指针,初始化GPIO),通过原理图查找GPIO对应的MIO编号;
- 设置GPIO的输入和输出方向。对于输出方向需要额外使能;
- 依靠程序逻辑,读取端口和写入端口。
1.初始化GPIO
- XGpioPs_LookupConfig:该函数仅接受一个参数,但是在xgpios.h中却有两个声明。如果没有定义SDT,则函数此时接受的参数就可能形如XPAR_XGPIOPS_0_DEVICE_ID,如果是定义了,函数的参数就可能形如XPAR_XGPIOPS_0_BASEADDR。具体使用时可以在工程中全局搜索(点击左侧搜索图标即可)查看该工程使用哪种定义,但是新版Vitis可以智能提示形参的名称。该函数返回一个XGpioPs_Config结构体指针。
#ifndef SDT
XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId);
#else
XGpioPs_Config *XGpioPs_LookupConfig(u32 BaseAddress);
#endif
- XGpioPs_CfgInitialize:接受三个参数,分别是