AXI_GPIO控制器详解(1)

1.AXI_GPIO应用场合

(1)AXI GPIO模块将PL端连接的GPIO信号通过AXI接口与PS模块连接,PS通过AXI接口的地址映射对PL端的GPIO信号进行读写等控制,与EMIO可以实现相同的功能,区别主要在于EMIO对于少数GPIO接口进行单独的控制,而AXI GPIO可以对多个GPIO接口合并成的总线进行整体读写控制;

(2)PS端可以借助AXI GPIO模块给PL逻辑生成一些通知信号;

(3)PL逻辑可以借助AXI GPIO模块给PS生成中断通知信号,但是必须使能AXI GPIO模块中断功能。

2.AXI_GPIO控制器框图

由下图可以知道AXI GPIO控制器有AXI Interface Module(AXI接口模块)、Interrupt Module(中断模块)、GPIO Core三大模块组成,从图中可以看出AXI GPIO控制器中断模块只针对输入信号(核心)。

(1)AXI Interface Module使用AXI_Lite接口和ZYNQ PS端的GP Master接口互联,PS用GP接口可以读写AXI GPIO控制器内部的寄存器,从而控制AXI GPIO控制器输入输出;

(2)Interrupt Module检测外部两个通道的输入信号(每个通道可以结合PL配置为32路三态门IO接口[输入、输出、高阻]),当检测到外部两个通道任何一个通道的任何一个输出发送上升沿或者下降沿时,都会由IP2INTC_Irpt端口生成一个中断给PS;

(3)GPIO Core为IPIC接口和AXI GPIO输入输出通道提供了一个转换接口,GPIO Core由读写寄存器和多路复用器组成,他还包括了必须的逻辑去生成一个中断事件,当一个输入状态改变时。下图为GPIO Core框图。

3.AXI_GPIO控制器所有寄存器描述及地址映射

(1)GPIO_DATA寄存器解释如下,当GPIO作为输入时,PS可以读其管教状态,写无效;当GPIO作为输出时,PS可以写其管教状态,读无效。

(2)GPIO_TRI(三态寄存器)寄存器解释如下,当为PS配置该位为0时,引脚作为输出,当为PS配置该位为1时,引脚作为输入。

(3)GIER寄存器(全局中断使能寄存器)解释如下,当为PS配置该位为0时,禁止AXI GPIO控制器产生中断,当为PS配置该位为1时,使能AXI GPIO控制器产生中断。也就是PS要想接收AXI GPIO中断,该位必须配置为1。

(4)IP IER寄存器(IP中断使能寄存器)解释如下,说白了就是可以单独控制哪一个通道中断打开与禁止。

(5)IP ISR寄存器(IP中断状态寄存器)解释如下,当发生中断时,PS可以查询这个寄存器来判断是通道1还是通道2发生的中断。

(7)寄存器地址映射如下

4.AXI_GPIO控制器配置及PS驱动

AXI_GPIO控制器详解(2)将结合本编文章详解AXI_GPIO控制器IP配置及PS中断配置及中断入口函数的编写及原理。

  • 2
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
下面是一个简单的 AXI GPIO 读写例子: ```c #include <stdio.h> #include <stdlib.h> #include "xparameters.h" #include "xgpio.h" #include "xstatus.h" #define GPIO_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID XGpio Gpio; /* The Instance of the GPIO Driver */ int main(void) { int Status; u32 DataRead; u32 DataWrite = 0x55; /* Initialize the GPIO driver */ Status = XGpio_Initialize(&Gpio, GPIO_DEVICE_ID); if (Status != XST_SUCCESS) { printf("GPIO initialization failed\n"); exit(EXIT_FAILURE); } /* Set the direction of the GPIO pins */ XGpio_SetDataDirection(&Gpio, 1, 0x00); /* Set as input */ XGpio_SetDataDirection(&Gpio, 2, 0xFF); /* Set as output */ /* Write to the GPIO pins */ XGpio_DiscreteWrite(&Gpio, 2, DataWrite); /* Read from the GPIO pins */ DataRead = XGpio_DiscreteRead(&Gpio, 1); printf("GPIO data read: 0x%x\n", DataRead); return 0; } ``` 在此例子中,我们使用 Xilinx 提供的 AXI GPIO 驱动程序来进行读写操作。首先,我们需要定义一个 `XGpio` 结构体以及一个设备 ID 变量 `GPIO_DEVICE_ID`,它们分别表示 GPIO 的实例和设备 ID。在 `main` 函数中,我们使用 `XGpio_Initialize` 函数来初始化 GPIO 实例。然后,使用 `XGpio_SetDataDirection` 函数来设置 GPIO 管脚的方向,这里我们将管脚 1 设置为输入,管脚 2 设置为输出。接着,我们使用 `XGpio_DiscreteWrite` 函数将数据写入 GPIO 管脚 2 中,使用 `XGpio_DiscreteRead` 函数从 GPIO 管脚 1 中读取数据。最后,我们将读取到的数据打印到控制台上。 需要注意的是,这个例子仅仅是一个简单的演示,实际应用中需要根据具体的需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个早起的程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值