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 to ‘0’ are output, and bits set to ‘1’ 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.清空值
- ZedBoard之GPIO详解
- ZedBoard Linux开发 --- GPIO驱动详解
- ZedBoard Linux开发 --- GPIO驱动详解
- ZedBoard Linux开发 --- GPIO驱动详解
- ZedBoard之中断interrupt详解
- zedboard的GPIO实验
- zedboard之GPIO驱动(从FPGA一直到LINUX应用)
- 嵌入式学习笔记之GPIO详解
- zedboard vivado+zedboard之Linux编译
- FPGA之ZedBoard入门
- zynq 之zedboard ubuntu
- Zedboard-网络配置方法详解
- 实验 使用 vivado zedboard GPIO 开关 开控制 LED
- zedboard的板级支持包GPIO例子
- Zedboard
- zedboard之ubuntu环境变量设置
- vivado+zedboard之流水灯
- vivado+zedboard之OLED驱动
- 程序员值得收藏和推荐的一些平台网站
- 协议森林
- Tinking in java读书笔记---关于继承和设置jdk的一个小小错误
- 1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪
- maven 安装
- ZedBoard之GPIO详解
- Android图片加载神器之Fresco,基于各种使用场景的讲解
- OPNET学习笔记之simple_source模块
- sql注入原理
- CentOS更改开机启动顺序
- Android实现沉浸式状态栏
- 《丁小柒的JavaScript大神之路》----javascript函数
- 协议森林01 邮差与邮局 (网络协议概观)
- [Lintcode] Set Matrix Zeroes矩阵归零