Vivado中的IP核——GPIO详解

Vivado中的IP核——GPIO详解Vivado 中 GPIO 核的使用 vivadogpio

大家好,欢迎来到IT知识分享网。

资料ID:PG144
文档查找软件:DocNav,在安装vivado时可以选择一并安装

Vivado中的GPIO模块框图如下。
在这里插入图片描述
下表展示了AXI GPIO的寄存器和相对于基地址的地址偏移值。
在这里插入图片描述
这些寄存器是否可用取决于一些配置参数的值。若某个寄存器是不可用的,一个写信号对该寄存器没有效果;当尝试读取该寄存器的值时,将会得到全零值。决定寄存器是否可用的参数如下表。
在这里插入图片描述
如上表所示,当Enable Interrupt参数为0时,与中断相关的三个寄存器GIER、IP IER、IP ISR是不可使用的,而对其余寄存器是没有影响的。同理,当使能双通道(Enable Dual Channel)这个参数为0时,通道2的数据寄存器和三态寄存器是不可用的。






Register Space

由于通道1和通道2的数据寄存器与三态寄存器是相同的,所以这里仅介绍五个寄存器。GPIOx_DATA表示通道x的数据寄存器。

GPIOx_DATA

GPIOx_TRI

Interrupts

GIER

IPIER

IPISR

示例程序:GPIO做为输出控制LED,GPIO2做为输入产生中断

在利用Vivado搭建硬件平台的时候已经对GPIO进行了相关设置,程序里首先验证这些设置是否会对相关寄存器进行初始化,如是否会将GPIO2所对应的4个端口全部设置为输入。实验结果表明,寄存器必须由软件初始化。

#include "xil_printf.h" #include "sleep.h" #define GPIOBaADDr 0x #define DATA1OffSet 0x0 #define TRI1OffSet 0x4 #define DATA2OffSet 0x8 #define TRI2OffSet 0xC #define GIEROffSet 0x11C #define IPIEROffSet 0x128 #define IPISROffSet 0x120 #define GETX(x) (*(volatile int *)(GPIOBaADDr + x)) int main() { 
    /*initialize GPIO*/ if((GETX(TRI1OffSet) & 0xf) == 0x0) { 
    print("GPIO1 already set to output by hardware platform\r\n"); } else { 
    print("GPIO1 will set to output by software\r\n"); GETX(TRI1OffSet) &= 0x0; } if((GETX(TRI2OffSet) & 0xf) == 0xf) { 
    print("GPIO2 already set to input by hardware platform\r\n"); } else { 
    print("GPIO2 will set to input by software\r\n"); GETX(TRI2OffSet) |= 0xf; } if((GETX(GIEROffSet) & 0x) == 0x) { 
    print("Global Interrupt Enable by hardware platform\r\n"); } else { 
    print("Global Interrupt Enable by software\r\n"); GETX(GIEROffSet) |= 0x; } if((GETX(IPIEROffSet) & 0x2) == 0x2) { 
    print("channel2 interrupt enable by hardware platform\r\n"); } else { 
    print("channel2 interrupt enable by software\r\n"); GETX(IPIEROffSet) |= 0x2; } /*/ /GPIO control led*/ //The four LEDs are lit in turn every one second for(int i = 0; i < 100; i++) { 
    GETX(DATA1OffSet) |= (0x1 << (i % 4)); sleep(1); GETX(DATA1OffSet) &= 0x0; } /*/ /GPIO2 generate interrupt*/ while(1) { 
    if((GETX(IPISROffSet) & 0x2) == 0x2) { 
    print("GPIO2 Generate interrupt\r\n"); GETX(IPISROffSet) |= 0x2;//clear interrupt by TOW } } / / } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/115414.html

(0)
上一篇 2025-12-03 10:20
下一篇 2025-12-03 10:36

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信