ZYNQ——GPIO之EMIO

开发环境        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,如图:

如上图所示,点击左侧的 MIO Configuration 页面,在右侧展开 I/O Peripherals > UART0 ,可以看到更具 体的引脚配置信息。其中 MIO14 作为 RX 引脚、 MIO15 作为 TX 引脚。

完成配置后,点击右下角的“ OK ”按钮。然后在 Diagram 窗口中可以看到 ZYNQ7 Processing System 多了一个 GPIO_0 端口,如下图所示:
将光标移动到上图中箭头所指示的位置,会发现光标变成了铅笔的样式。点击选中该端口,然后点击鼠标右键,在弹出的列表中选择“Make External” ,如下图所示:

可以看到 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 键不放, 用鼠标点击相应的函数,就会跳转到其定义的地方。

可以看到 init_platform 函数的作用是使能 caches 和初始化 uart cleanup_platform 函数的作用是取消使 能 caches 。实际上这两个函数在该工程中并没有起到任何作用,因为这两个函数是针对于特定平台如 Microblaze 的,对于我们使用的 ZYNQ 平台而言是不起作用的,所以 main 函数中只需包含 print 语句就可以了,出于平台的通用性和可移植性,此处我们保留这两个函数。
Vitis 软件的下方,找到 Terminal 窗口。如果界面中没有找到该窗口,或者操作过程中把该窗口
给关闭了,则可以通过在菜单栏中选择 Window > Show View > Terminal,在 Show View 窗口中搜索添加 Terminal,如下图所示:

添加 Terminal 后如下图所示,点击箭头处的图标对串口进行设置:

 在弹出的窗口中,Choose terminal 一栏中,下拉选择 Serial Terminal 串口终端,如下图所示:

对于EMIO部分,可以看到,程序中PL的按键,用的是BANK2的EMIO0,在之前也提到了,因此标号是54,对于其他的,和之前mio控制led都比较类似。在这里我们也可以看到,对于输入来说,我们只需要配置方向寄存器即可,就是把它配置成输入还是输出;而对于输出引脚来说,我们还需要配置它的使能。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱你等于1+1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值