1、GPIO的分类:
ZYNQ 共有三种GPIO:MIO、EMIO、AXI_GPIO
2、MIO
MIO(multiuse I/O):多功能IO接口,属于Zynq的PS部分,Zynq7000 系列芯片有 54 个 MIO。它们分配在 GPIO 的 Bank0 和 Bank1 上,这些引脚可以用在GPIO、SPI、UART、TIMER、Ethernet、USB等功能上,每个引脚都同时具有多种功能,故叫多功能IO接口。这些 IO 与 PS 直接相连。不需要添加引脚约束,MIO 信号对 PL部分是透明的,不可见。所以对 MIO 的操作可以看作是纯 PS 的操作。GPIO 的控制和状态寄存器基地址为:0xE000_A000,我们 SDK 下软件操作底层都是对于内存地址空间的操作。
3、EMIO
EMIO(extendable multiuse I/O):扩展MIO,依然属于Zynq的PS部分,只是连接到了PL上,再从PL的引脚连到芯片外面实现数据输入输出。Zynq7000 系列芯片有 64 个 EMIO,它们分配在 GPIO 的 Bank2 和 Bank3 上,当 MIO 不够用时,PS 可以通过驱动 EMIO 控制 PL 部分的引脚,EMIO 的使用相当于,是一个 PS + PL 的结合使用的例子。所以,EMIO 需要分配引脚以及编译综合生成 bit文件。
PS:
(1)由于总计有54个 MIO ,因此第1组 MIO 引脚限制为22位。
(2)尽管 MIO 和 EMIO 组之间存在功能差异,但是对每组 GPIO 的控制是相同的。
3、AXI_GPIO
AXI_GPIO相当于GPIO的IP核,是通过AXI总线挂在PS上的GPIO上。
4、GPIO的结构体系
ZYNQ的GPIO由4个BANK组成,其体系结构如图1所示。其中Bank0有32个GPIO引脚,Bank1有22个引脚,共54个GPIO引脚直接通过MIO连接到PS上,每个引脚可以通过寄存器的设置来确定该引脚为输入、输出或者中断,因为54个MIO引脚直接连接在PS上,像其他普通ARM一样,不需要通过XPS进行硬件配置,直接通过SDK编程即可。
Bank2和Bank3通过EMIO接口将CPU的GPIO连接到PL部分的引脚上,其中每个Bank各有32个引脚,通过EMIO扩展的GPIO连接到PL上,可以在PL部分进行逻辑设计,进行特定功能的IP核制定。然后在PS部分,像控制普通MIO一样进行编程。因此,使用EMIO引脚必须通过XPS进行硬件配置,然后在PS部分使用SDK进行编程控制。
图1 GPIO的组成
GPIO的内部结构和内部数据流及寄存器结构如图2所示。上半部分为GPIO中断相关的寄存器,下半部分为GPIO查询方式读写的寄存器。
图2 GPIO寄存器数据流组成
DATA_RO: 读取GPIO引脚值寄存器,不论该GPIO引脚配置为输入还是输出,都能正确读取该GPIO引脚值。如果该引脚的功能没有配置成GPIO功能,读取的值为随机值,因为该寄存器只能读取GPIO引脚值。。
DATA: 此寄存器控制输出到 GPIO 的值,读这个寄存器的值可以读到最后一次写入该寄存器的值。
MASK_DATA_LSW: 位操作寄存器,写入 GPIO 低 16bit 其他没有改变的位置保存原先的状态
MASK_DATA_MSW: 位操作寄存器,写入 GPIO 高 16bit 其他没有改变的位置保存原先的状态
DIRM: 此寄存器控制输出的开关,当 DIRM[x]==0 时候,禁止输出
OEN: 输出使能,当 OEN[x]==0 的时候输出关闭,PIN 脚处于三态因此,如果要读 IO 状态就得读 DATA_RO 的值,如果是对某一位进行操作就是写MASK_DATA_LSW/MASK_DATA_MSW
PS:
相对于MIO,EMIO有几点要注意的地方:
1.EMIO 在 PL 部分,输入与 OEN 寄存器无关,当 DIRM 设置为 0 的时候设置为输入可以读 DATA_RO 寄存器获取数据。
2.输出不能设置成三态,当 DIRM 设置为 1 的时候为输出,写入 DATA 寄存器或者MASK_DATA_LSW/MASK_DATA_MSW 寄存器。
3.EMIOGPIOTN[x]=DIRM[x] & OEN[x],实现输出的控制