作者:ShownSun
工作室:时沿科技
文章目录
ZYNQ PS端模块读书笔记-GPIO
1 介绍
通过MIO模块包含54个设备引脚。它还提供访问来自可编程逻辑(PL)的64输入和通过EMIO接口输出到PL的128个输出。GPIO由四个bank相关接口组成。GPIO控制和状态寄存器的基地址为0xE000_A000。
1.1 特色
54个GPIO设备引脚;
在PS和PL之间通过EMIO接口连接的192GPIO信号(64个输入、128个输出);
每个GPIO模块可以动态独立或者群编程;
使能、写数据、输出使能和方向控制;
独立GPIO的可编程中断控制;
读取状态和屏蔽中断;
可选择的敏感边沿:高电平或者低电平,或者边沿敏感;
1.2 框图
GPIO模块分为4个bank;
bank0:32位控制MIO引脚[31:0];
bank1:22位控制MIO引脚[53:32];
bank2:32位控制EMIO信号[31:0];
bank3:32位控制EMIO信号[63:32];
1.3 通知
2 功能描述
2.1 GPIO控制设备引脚
DATA_RO寄存器总是返回GPIO引脚的状态,不管GPIO设置为输入还是输出。
GPIO bank(bank0和bank1)总结如下:
DATA_RO:用于观察设备引脚的值;
DATA:该寄存器的32位被同时写;从该寄存器读取将返回写入到DATA或者MASK_DATA的以前的值;不会返回目前设备引脚的值;
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;
2.2 EMIO信号
该部分描述了bank2和bank3的描述;EMIO只是用于PS和PL之间,包含以下几点不同:
当DIRM设置为0时,可以从DATA_RO寄存器中读取数据;
当DIRM设置为1时,可以向DATA、MASK_DATA_LSW、MASK_DATA_MSW写入数据;
2.3 Bank0,Bit[8:7]是输出
Bank0的GPIO位[8:7]对应于用于控制的封装引脚在重置期间,I/O缓冲区本身。
为了防止它们被其他系统逻辑驱动,它们不能作为一般用途的输入。
2.4 中断函数
GPIO bank控制总结如下:
INT_MASK:这个寄存器是只读的,可以显示当前哪些位是掩码,哪些是un-masked /启用。
INT_EN:将1写入寄存器的任何位中,可以启用/取消中断信号的掩码。从该寄存器读取数据将返回一个不可预测的值。
INT_DIS:将1写入寄存器的任何位将屏蔽中断信号。阅读这个寄存器返回一个不可预知的值。
INT_STAT:这个寄存器显示是否发生了中断事件。写1此寄存器清除该位的中断状态。在这个寄存器中写0是被忽略的。
INT_TYPE:这个寄存器控制中断是边缘敏感的还是水平敏感的。
INT_POLARITY:这个寄存器控制中断是高电平还是低电平(下降敏感或上升敏感)。
INT_ON_ANY:如果INT_TYPE设置为边缘敏感,那么这个寄存器将启用一个中断事件在上升和下降的边缘。如果INT_TYPE设置为电平敏感,则忽略该寄存器。
3 编程指南
3.1 启动顺序
主要例子:启动顺序
1、 复位;
2、 时钟;
3、 GPIO引脚配置;
4、 写数据到GPIO输出引脚;
5、 从GPIO输入引脚读取数据;
6、 设置GPIO引脚作为唤醒事件;
3.2 GPIO引脚配置
每个独立的GPIO引脚可以配置为输入/输出。但是bank0[8:7]引脚必须配置为输出。
例子:配置MIO引脚10作为输出
1、 设置方向为输出:写0x0000_0400到gpio.DIRM_0寄存器;
2、 设置输出使能:写0x0000_0400到gpio.OEN_0 寄存器;
例子:配置MIO引脚10作为输入
1、 设置方向为输入:写0x0到 gpio.DIRM_0 寄存器. 设置gpio.DIRM_0[10] = 0.
3.3 写数据到GPIO输出引脚
例子:使用DATA_0寄存器设置GPIO输出引脚10
1、 读gpio.DATA_0寄存器;读取gpio.DATA_0 寄存器到reg_val变量中
2、 修改值;Set reg_val [10] =1;
3、写更新值到输出引脚;写reg_val 到gpio.DATA_0 寄存器;
例子:使用MASK_DATA_0_MSW寄存器设置输出引脚20、25和30为1
1、 产生20、25和30引脚的掩饰值;为了驱动 20, 25和30, 0xBDEF是gpio.MASK_DATA_0_MSW [MASK_0_MSW]的掩饰值;
2、 产生20、25和30引脚的数据值;在20, 25,和30引脚写 1, 0x4210是gpio.MASK_DATA_0_MSW [DATA_0_MSW]的掩饰值;
3、 写掩饰和数据到MASK_DATA_x_MSW寄存器;写0xBDEF_4210到gpio.MASK_DATA_0_MSW寄存器;
3.4 从GPIO输入引脚读取数据
例子:使用DATA_RO_0寄存器读取bank0所有的GPIO输入引脚的状态;
1、 读取输入bank0;读取gpio.DATA_0寄存器;
例子:配置MIO引脚12为上升沿触发;
1、 设置触发为上升沿触发;写1到gpio.INT_TYPE_0 [12]. 写1到gpio.INT_POLARITY_0 [12]. 写0到 gpio.INT_ANY_0 [12].
2、 使能中断;写1到 gpio.INT_EN_0 [12].
3、 输入引脚状态:gpio.INT_STAT_0 [12] =1表示中断事件出现;
4、 不使能中断:写1到gpio.INT_DIS_0 [12].
3.5 GPIO作为唤醒事件
1、 使能GPIO中断作为GIC;
2、 使能GPIO中断在想设置的引脚上;使用gpio.INT_EN_{0…3}寄存器;
3、 不要关闭任何GPIO相关的时钟;
3.6 寄存器概述
4 系统功能
4.1 时钟
控制器时钟来自APB接口的CPU_1x时钟;所有输出和输入采样使用CPU_1x;
时钟门选通使用slcr.APER_CLK_CTRL[GPIO_CPU_1XCLKACT];
4.2 复位
控制器使用slcr.GPIO_RST_CTRL [GPIO_CPU1X_RST]进行复位;
4.3 中断
控制器中断宣称IRQ# 52 到GIC.
5 IO接口
例子:配置MIO引脚6作为一个GPIO信号
1、 选择MIO引脚作为GPIO;设置L0_SEL, L1_SEL, L2_SEL, L3_SEL =0.
2、 设置TRI_ENABLE = 0.
3、 LVCMOS18.
4、 缓慢的CMOS边缘.
5、 使能内部上拉电阻.
6、 不使能HSTL接收器.
注意:如果 TRI_ENABLE=1, 输出为3-stated,不管任何GPIO设置. 如果TRI_ENABLE=0,通过 gpio.OEN_x 寄存器控制3-stated;