ZYNQ PS端模块读书笔记-GPIO

在这里插入图片描述


作者: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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShownSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值