ZedBoard之GPIO详解

来源:互联网 发布:java 线程间共享数据 编辑:程序博客网 时间:2024/06/08 19:09

不可缺少的资料:官方UG585手册
GPIO简介
1. GPIO: General-Purpose Input/Output Ports. 通用I/O口。
2. MIO就是ARM自己的手脚,完全由自己支配;MIO是PS的IO接口,54个引脚。这些引脚可以用在GPIO/SPI/UART/TIMER/USB/Ethernet等功能上,每个引脚都有多个功能。(类似于MCU的引脚复用)。
EMIO是扩展MIO,功能主要是将MIO上放不下,而又想使用的IO接口连接到PL上,再从PL的引脚连接到芯片外面。EMIO则是FPGA的手脚,如果不做任何处理,ARM说什么对他们根本不起作用

MIO(multiuse I/O)引脚在bank0和bank1上,EMIO(extendable multiuse I/O)在bank2和bank3上。MIO共32+22=54个引脚,EMIO共32+32=64个引脚,引出的引脚都是按bank2到bank3顺序排列的,也就是说53个MIO之后,我们引出的这eg.8个EMIO,分别是54~61号引脚。
GPIO框图:
这里写图片描述

中断相关寄存器
所有GPIO共享一个中断(#52,bank1),必须在软件上检查INT_MASK和INT_STAT的值判断是哪个GPIO引发了中断。
1. INT_MASK(0xE000A20C):中断屏蔽寄存器,只读,读取该寄存器的值可以显示哪些位被屏蔽和没有屏蔽(即使能)。
2. INT_ENT(0xE000A210–): 中断使能寄存器(4个bank,4个寄存器)。写1,对应的引脚中断功能开启,即使能。
3. INT_DIS(0xE000A214—):屏蔽寄存器(4个bank,4个寄存器)。写1,对应的引脚中断屏蔽。
4. INT_STAT(0xE000A18–):中断状态寄存器(4个bank,4个寄存器)。每一位代表对应的引脚上是否发生中断事件,中断发生时,该引脚的中断标志位为1。如果对该位写1,清除该引脚的中断标志,写0无操作。
5. INT_TYPE(0xE000A21C–):中断类型寄存器(4个bank,4个寄存器)。写1代表边沿触发中断,写0代表电平触发中断。
6. INT_POLARITY(0xE000A220–): 中断极性寄存器,控制中断的触发条件(4个bank,4个寄存器)。写1代表高电平或者上升沿触发,写0代表低电平或者下降沿触发。
7. INT_ANY(0xE000A224–): 中断边沿触发类型设置寄存器(4个bank,4个寄存器)。写1代表上升沿和下降沿同时触发,写0代表单边沿触发中断,只在INT_TYPE设置为边沿触发中断(写1)时有效。

非中断(输入、输出)相关寄存器
1. DATA_R0:(0xE000A060—): 读取GPIO引脚值,不管该GPIO引脚配置是输入还是输出,前提是该引脚配置为GPIO状态。
4个bank,4个寄存器DATA_0_R0/ DATA_1_R0/ DATA_2_R0/ DATA_3_R0
2. DATA: (0xE000A040—):当GPIO配置为输出时,DADA寄存器的值是要输出到GPIO引脚上的数值。
4个bank,4个寄存器DATA_0 / DATA_1/ DATA_2/ DATA_3
3. MASK_DATA_LSW/ MASK_DATA_MSW:是传统数据寄存器(DATA)和屏蔽寄存器(MASK)的结合。32位,分为高16(MASK)、低16(DATA)。LSW/MSW分别控制的是16个引脚!
MASK_DATA_LSW是对GPIO的16位引脚进行设置和屏蔽。
在修改个别引脚的时候,不用经过读寄存器、修改值、写寄存器步骤,而直接写MASK_DATA_LSW、MASK_DATA_MSW即可。
4个bank ,MASK_DATA_0_LSW/MSW, MASK_DATA_1_LSW/MSW,
MASK_DATA_2_LSW/MSW, MASK_DATA_3_LSW/MSW,
4. DIRM:方向控制寄存器,控制GPIO的输入或者输出。输入时常开的,所以该寄存器其实控制的输出。当DIRM[X]=0时,输出无效,保持输入。DIRM[X]=1,输出。4个bank,4个寄存器DIRM _0 / DIRM _1/ DIRM _2/ DIRM _3
5. OEN:输出使能寄存器,当GPIO引脚配置成输出时,该寄存器控制该引脚的输出使能。4个bank,4个寄存器OEN _0 / OEN _1/ OEN _2/ OEN _3

GPIO slcr寄存器:配置引脚为GPIO功能。(slcr)GPIO_PIN_xx对应引脚的寄存器。配置为GPIO可以是:*MIO_PIN_50=0X00003300;

例程

按键BTN8控制灯LD9,均在PS上//************************用BTN8控制LD9*******************************//#include <stdio.h>//对应寄存器的地址//#define MIO_PIN_07  ((unsigned int *)(0XF800071C))#define MIO_PIN_50  ((unsigned int *)(0XF80007C8))#define DIRM_1     ((unsigned int *)(0XE000A244))#define DATA_1_R0     ((unsigned int *)(0XE000A064))#define DIRM_0     ((unsigned int *)(0XE000A204))#define DATA_0     ((unsigned int *)(0XE000A040))int state;int delay;int main(){    *MIO_PIN_50=0X00003300;//设置MIO_50为GPIO//    *MIO_PIN_07=0X00003300;//设置MIO_07为GPIO//    *DIRM_1=0X0; //设置MIO_50为输入//    *DIRM_0=0X00000080; //设置MIO_PIN_07为输出,10000000第7位为1//    while(1)    {        state=*DATA_1_R0;        if(state&0X040000)            *DATA_0=0X00000080;//MIO_PIN_07的输入数据,10000000第7位为1        else            *DATA_0=0X0;    }    //  printf("%x\r\n",state);    return 0;}

Xilinx 底层库函数

1.  XGpio_Config *XGpio_LookupConfig(u16 DeviceId)Lookup the device configuration based on the unique device ID.  The tableConfigTable contains the configuration info for each device in the system.检查DeviceId的配置信息2.  int XGpio_Initialize(XGpio * InstancePtr, u16 DeviceId)Initialize the XGpio instance provided by the caller based on the given DeviceID.初始化XGpio实例(InstancePtr:实例化的对象, DeviceId:ID号,比如gpio,之前定义的#define GPIO_DEVICE_ID  XPAR_AXI_GPIO_0_DEVICE_ID)3.  void XGpio_SetDataDirection(XGpio * InstancePtr, unsigned Channel,u32 DirectionMask)Set the input/output direction of all discrete signals for the specifiedGPIO channel. Bits set to0’ are output, and bits set to1’ are input设置输入/输出方向4.  void XGpio_DiscreteWrite(XGpio * InstancePtr, unsigned Channel, u32 Data)Write to discretes register for the specified GPIO channel写值5.  void XGpio_DiscreteClear(XGpio * InstancePtr, unsigned Channel, u32 Mask)Set output discrete(s) to logic 0 for the specified GPIO channel.清空值
0 0
原创粉丝点击