开发环境 vivado 19.2 vitis
开发板 zynq7010
内容 按键控制led
用两个PS端的按键和一个PL端的按键,分别控制3个led,按下按键led亮。同时我们把串口的内容也加到这部分。
同上讲,先给出如下的结构图,除 Bank1 之外的 Bank 都具有 32bit,Bank1 只具有 22bit 是因为总共只有 54 个 MIO,其中 32bit 的 Bank0 控制了 MIO[0~31],剩下的 MIO[31~53]就由 22bit 的 Bank1 控制。Bank2 和 Bank3 用于控制扩展的 MIO 即 EMIO,也就是说总共可以有 32+32=64 个 EMIO。本次我们只需要用BANK2的EMIO0即可,那么它的编号就是54。
由于上讲我们已经对vivado和vitis工程的建立作了详细介绍,因此这里我们就对关键部分作解释即可。 因为我们是通过EMIO来控制PL端的引脚,那么首先需要在ZYNQ的配置界面选中EMIO,我们只需要用到一个EMIO,所以位宽选1就可以,同时还要选中uart,如图:


可以看到 ZYNQ7 Processing System 引出了一个名为 GPIO_0_0 的接口,如下图所示:
接下来的步骤和之前一样,在这里就不再赘述了。这里再强调一点,就是因为我们是通过EMIO来控制PL端的引脚,那必须把XDC文件加上,并且生成比特流。在Export Hardware的时候,也必须选中包含比特流,如图:
之后就是打开vitis,新建工程,然后编程,同样这里给出对应的源程序,并作相应的解释:
#include "stdio.h"
///
#include "platform.h"
#include "xil_printf.h"
///
#include "xparameters.h"
#include "xgpiops.h"
#define GPIOPS_ID XPAR_XGPIOPS_0_DEVICE_ID //PS端 GPIO器件 ID
#define MIO_LED0 7 //PS_LED0 连接到 MIO7
#define MIO_LED1 8 //PS_LED1 连接到 MIO8
#define MIO_LED2 0 //PS_LED2 连接到 MIO0
#define MIO_KEY0 12 //PS_KEY0 连接到 MIO12
#define MIO_KEY1 11 //PS_KEY1 连接到 MIO11
#define EMIO_KEY 54 //PL_KEY0 连接到EMIO0
int main()
{
init_platform();
print("Hello World\n\r");
cleanup_platform();
XGpioPs gpiops_inst; //PS端 GPIO 驱动实例
XGpioPs_Config *gpiops_cfg_ptr; //PS端 GPIO 配置信息
//根据器件ID查找配置信息
gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIOPS_ID);
//初始化器件驱动
XGpioPs_CfgInitialize(&gpiops_inst, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr);
//设置LED为输出
XGpioPs_SetDirectionPin(&gpiops_inst, MIO_LED0, 1);
XGpioPs_SetDirectionPin(&gpiops_inst, MIO_LED1, 1);
XGpioPs_SetDirectionPin(&gpiops_inst, MIO_LED2, 1);
//使能LED输出
XGpioPs_SetOutputEnablePin(&gpiops_inst, MIO_LED0, 1);
XGpioPs_SetOutputEnablePin(&gpiops_inst, MIO_LED1, 1);
XGpioPs_SetOutputEnablePin(&gpiops_inst, MIO_LED2, 1);
//设置KEY为输入
XGpioPs_SetDirectionPin(&gpiops_inst, MIO_KEY0, 0);
XGpioPs_SetDirectionPin(&gpiops_inst, MIO_KEY1, 0);
XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_KEY, 0);
//读取按键状态,用于控制LED亮灭
while(1){
XGpioPs_WritePin(&gpiops_inst, MIO_LED0,
~XGpioPs_ReadPin(&gpiops_inst, MIO_KEY0));
XGpioPs_WritePin(&gpiops_inst, MIO_LED1,
~XGpioPs_ReadPin(&gpiops_inst, MIO_KEY1));
XGpioPs_WritePin(&gpiops_inst, MIO_LED2,
~XGpioPs_ReadPin(&gpiops_inst, EMIO_KEY));
}
return 0;
}
对于UART部分可以看到程序中主函数调用了 3 个函数,分别是 init_platform()、cleanup_platform()和 print()函数。我们 将鼠标停留在各个函数名上,Vitis 就会显示该函数的声明。如果想查看函数的定义,可以按住 Ctrl 键不放, 用鼠标点击相应的函数,就会跳转到其定义的地方。
添加 Terminal 后如下图所示,点击箭头处的图标对串口进行设置:
在弹出的窗口中,Choose terminal 一栏中,下拉选择 Serial Terminal 串口终端,如下图所示:
对于EMIO部分,可以看到,程序中PL的按键,用的是BANK2的EMIO0,在之前也提到了,因此标号是54,对于其他的,和之前mio控制led都比较类似。在这里我们也可以看到,对于输入来说,我们只需要配置方向寄存器即可,就是把它配置成输入还是输出;而对于输出引脚来说,我们还需要配置它的使能。