由于个人原因,最近一直在对基础知识的复习,所以ZYNQ的后续学习记录,一直没有更新。
FLAG:新年新气象,争取2022年春节之前将所有关于ZYNQ中ARM裸机部分内容更新完毕,主要是ARM外设。

Zynq(2):Zynq(2):MIO,EMIO点灯之路

简介

ZYNQ 分为 PS 和 PL 两部分,那么器件的引脚(Pin)资源同样也分成了两部分。ZYNQ PS 中的外设可以通过 MIO(Multiuse I/O,多用输入/输出)模块连接到 PS 端的引脚上,也可以通过 EMIO 连接到 PL 端的引脚。

GPIO 是英文“general purpose I/O”的缩写,即通用的输入/输出。它是 ZYNQ PS 中的一个外设,用于观测和控制器件引脚的状态。

The general purpose I/O (GPIO) peripheral provides software with observation and control of up to 54 device pins via the MIO module. It also provides access to 64 inputs from the Programmable Logic (PL) and 128 outputs to the PL through the EMIO interface. The GPIO is organized into four banks of registers that group related interface signals.

上图是 GPIO 的框图,从中我们可以看到 GPIO 分为 4 个 Bank,其中 Bank0和 Bank1 连接到 MIO;而 Bank2 和 Bank3 连接到 EMIO。

除 Bank1 之外的 Bank 都具有 32bit,Bank1 只具有 22bit 是因为总共只有 54 个 MIO。

其中 32bit 的Bank0 控制MIO[31:0] ,22bit 的 Bank1 控制MIO[53:32]。Bank2 和 Bank3 用于控制扩展的MIO 即 EMIO,32bit 的Bank2 控制EMIO[31:0] ,32bit 的 Bank3 控制EMIO[63:32]。
总结一下 ZYNQ PS端一共有32 + 22 = 54个MIO和32 + 32 = 64个 EMIO。

PS 所有的外设都可以通过 MIO 访问,这些外设也是与 MIO 进行连接,每个 MIO 虽然可以独立控制,以及独立驱动单个引脚的外设,但对于 QSPI、USB、以太网等这些外设,其于 MIO 的连接有着特殊的要求。

由上图中我们可以看到 MIO 一但选定,引脚位置就已经确定下来了,不需要添加引脚约束(由于引脚固定,所以是由软件已经帮我们进行了引脚约束)。

但是对于EMIO却并不是这样,由于EMIO的设定是由于ZYNQ中PS端中MIO的引脚不够用,通过EMIO将PL端的IO复用到PS端。所以在搭建硬件平台使用EMIO的时候需要添加引脚约束。

GPIO Channel

GPIO Control

DATA_RO 是数据只读寄存器,通过该寄存器能够观察器件引脚上的值。如果 GPIO 信号配置为输出,则通常会反映输出上驱动的值,写入此寄存器将被忽略。

DATA 是数据寄存器,该寄存器控制 GPIO 信号配置为输出时要输出的值。该寄存器的所有 32 位都是一次写入的。读取该寄存器返回写入 DATA 或 MASK_DATA_ {LSW,MSW}的先前值,它不会返回器件引脚上的当前值。

MASK_DATA_LSWMASK_DATA_MSW 是数据掩码寄存器,该寄存器使软件能够有选择地一次更改所需的的输出值。可以写入最多 16 位的任意组合,MASK_DATA_LSW 控制 Bank 的低 16 位,MASK_DATA_MSW 控制高 16 位。未写入的那些位保持不变并保持其先前的值。读取该寄存器返回写入DATA 或 MASK_DATA_ {LSW,MSW}的先前值;它不会返回器件引脚上的当前值。该寄存器避免了对未更改位的读-修改-写序列的需要。

DIRM 是方向模式寄存器,用于控制 I/O 引脚是用作输入还是输出。当 DIRM [x] == 0 时,输出驱动器被禁用,该引脚作为输入引脚使用。

OEN 是使能输出寄存器。将 I/O 配置为输出时,该寄存器控制是否启用输出。禁用输出时,引脚为 3态。当 OEN [x] == 0 时,输出被禁用。

GPIO Interrupt

INT_MASK:中断屏蔽。

INT_DIS:中断关闭。

INT_EN:中断使能。

INT_STAT:中断状态,写1可以清除当前中断状态,读取可以获取当前中断状态。

INT_TYPE:中断的类型,分为边沿和电平两种。

INT_POLARITY:中断的极性,边沿而言,正极性即上升沿。电平而言,正极性即高电平。

INT_ANY:对于中断边沿触发有效,= 1 ,则双边延触发,=0,则单边延触发。


Programming Guide

UG585

Start-up Sequence

Main Example: Start-up Sequence

  1. Resets: The reset options are described in section 14.4.2 Resets.
  2. Clocks: The clocks are described in section 14.4.1 Clocks.
  3. GPIO Pin Configurations: Configure pin as input/output is described in section 14.3.2 GPIO Pin Configurations.
  4. Write Data to GPIO Output pin: Refer to example in section 14.3.3 Writing Data to GPIO Output Pins.
  5. Read Data from GPIO Input pin: Refer to example in section 14.3.4 Reading Data from GPIO Input Pins .
  6. Set GPIO pin as wake-up event: Refer to example in section GPIO as Wake-up Event.

GPIO Pin Configurations

Each individual GPIO pin can be configured as input/output. However, bank0 [8:7] pins must be configured as outputs. Refer to section 14.2.3 Bank0, Bits[8:7] are Outputs for further details.

Example: Configure MIO pin 10 as an output

  1. Set the direction as output: Write 0x0000_0400 to the gpio.DIRM_0 register.
  2. Set the output enable: Write 0x0000_0400 to the gpio.OEN_0 register.

Note: The output enable has significance only when the GPIO pin is configured as an output.

Example: Configure MIO pin 10 as an input

  1. Set the direction as input: Write 0x0 to the gpio.DIRM_0 register. This sets gpio.DIRM_0[10] = 0.

Writing Data to GPIO Output Pins

For GPIO pins configured as outputs, there are two options to program the desired value.

Option 1: Read, modify, and update the GPIO pin using the gpio.DATA_0 register.

Example: Set GPIO output pin 10 using the DATA_0 register.

  1. Read the gpio.DATA_0 register: Read gpio.DATA_0 register to the reg_val variable.
  2. Modify the value: Set reg_val [10] =1.
  3. Write updated value to output pin: Write reg_val to the gpio.DATA_0 register.

Option 2: Use the MASK_DATA_x_MSW/LSW registers to update one or more GPIO pins.

Example: Set output pins 20, 25, and 30 to 1 using the MASK_DATA_0_MSW register.

  1. Generate the mask value for pins 20, 25, and 30: To drive pins 20, 25 and 30, 0xBDEF is the
    mask value for gpio.MASK_DATA_0_MSW [MASK_0_MSW].
  2. Generate the data value for pins 20, 25, 30: To drive 1 on pins 20, 25, and 30, 0x4210 is the
    data value for gpio.MASK_DATA_0_MSW [DATA_0_MSW].
  3. Write the mask and data to the MASK_DATA_x_MSW register: Write 0xBDEF_4210 to the
    gpio.MASK_DATA_0_MSW register.

Reading Data from GPIO Input Pins

For GPIO pins configured as inputs, there are two options to monitor the input.

Option 1: Use the gpio.DATA_RO_x register of each bank.

Example: Read the state of all GPIO input pins in bank 0 using the DATA_RO_0 register.

  1. Read Input Bank 0: Read the gpio.DATA_0 register.

Option 2: Use interrupt logic on input pins (refer to section 14.2.4 Interrupt Function).
Example: Configure MIO pin 12 to be triggered as rising edge.

  1. Set the trigger as a rising edge: Write 1 to gpio.INT_TYPE_0 [12]. Write 1 to
    gpio.INT_POLARITY_0 [12]. Write 0 to gpio.INT_ANY_0 [12].
  2. Enable interrupt: Write 1 to gpio.INT_EN_0 [12].
  3. Status of Input pin: gpio.INT_STAT_0 [12] =1 implies that an interrupt event occurred.
  4. Disable interrupt: Write 1 to gpio.INT_DIS_0 [12].

上部分英文摘自UG585

上部分是关于GPIO的功能和寄存器的一些简单介绍。下面将根据上面的知识,简单实现三个功能

  1. 点亮PS端LED灯(通过MIO)
  2. 点亮PL端LED灯(通过EMIO)
  3. PL端KEY控制PS端LED

PL_MIO流水灯和PS_EMIO流水灯

MIO(Multiplexed I/O),将来自PS外设和静态存储器接口的访问多路复用到PS的引脚上。
EMIO(Extendable Multiplexed I/O),如果PS端的IO引脚超过54个,就可以将PS的IO引脚连接到PL的IO引脚进行扩展。当然并不局限于PL的IO,同时EMIO也可以连接到PL中的模块中。
由于两个设备的点灯原理基本上是一致的,主要区别是EMIO的PIN序号是排序在MIO的PIN序号之后的。(MIO:053;EMIO:54118).

由于前文已经介绍过了基本工程的搭建,这里就不在对于这部分进行过多的赘述,直接根据UG585中编程指南进行操作。

步骤:

  1. 初始化GPIO的驱动

    XGpioPs_LookupConfig :根据器件的ID,查找器件的配置信息。

    XGpioPs_CfgInitialize:初始化GPIO驱动。

    XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId)
    s32 XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr,u32 EffectiveAddr)
    
  2. 设置GPIO的方向为输出

    Direction : 0,输入;1,输出。

    void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, u32 Pin, u32 Direction)
    
  3. 设置GPIO输出使能

    OpEnable:0,disable;1,enable。

    void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin, u32 OpEnable)
    
  4. 写数据到GPIO输出引脚
    Data虽然是u32,但是只能赋值0或1,意味着最低位有效。

    void XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data)
    

Example:main.c

#include "stdio.h"
#include "xgpiops.h"
#include "xparameters.h"
#include "sleep.h"#define GPIO_DEVICE_ID          XPAR_XGPIOPS_0_DEVICE_ID
#define PS_LED0_MIO0            0
#define PL_LED0_EMIO0           55
#define PL_KEY0_EMIO1           54XGpioPs Gpio;
XGpioPs_Config *ConfigPtr;int main(void)
{printf("Light up led.\n");/* Initialize the Gpio driver. */ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);/* Set the direction for the specified pin to be output. */XGpioPs_SetDirectionPin(&Gpio, PS_LED0_MIO0, 1);XGpioPs_SetOutputEnablePin(&Gpio, PS_LED0_MIO0, 1);XGpioPs_WritePin(&Gpio, PS_LED0_MIO0, 0x0);XGpioPs_SetDirectionPin(&Gpio, PL_LED0_EMIO0, 1);XGpioPs_SetOutputEnablePin(&Gpio, PL_LED0_EMIO0, 1);XGpioPs_WritePin(&Gpio, PL_LED0_EMIO0, 0x0);while(1){XGpioPs_WritePin(&Gpio, PL_LED0_EMIO0, 0x1);XGpioPs_WritePin(&Gpio, PS_LED0_MIO0, 0x0);sleep(1);XGpioPs_WritePin(&Gpio, PL_LED0_EMIO0, 0x0);XGpioPs_WritePin(&Gpio, PS_LED0_MIO0, 0x1);sleep(1);}return 0;
}

Data : 2022-1-4
Author : QImua
City : Wuxi

Zynq(2):MIO,EMIO点灯之路相关推荐

  1. ZYNQ 的三种GPIO :MIO EMIO AXI_GPIO

    学了zynq一段时间,一上来的时候就被zynq的GPIO唬住了,实在没搞清楚zynq的GPIO怎么回事,一会这样,一会那样,最后才慢慢发现zynq至少有3种GPIO可以调用.难怪我觉得每篇介绍GPIO ...

  2. 基于Zynq的MIO与EMIO的区别和应用

    MIO与EMIO的区别与应用 1 MIO与EMIO概念 MIO:多功能IO接口,属于Zynq的PS部分,在芯片外部有54个引脚.这些引脚可以用在GPIO.SPI.UART.TIMER.Ethernet ...

  3. ZYNQ PL通过EMIO ETHE1外接PHY由GMII转RGMII

    ZYNQ使用AXI_Ethernet编译系统扩展多网口: 详见博客:https://mp.csdn.net/editor/html/104765046 一,硬件简介 1,3个以太网口,1个在PS,2个 ...

  4. ZYNQ使用PS+PL点灯总结

    初次使用ZYNQ中的纯PL点亮了LED等,后来知道了可以使用PS和PL联合使用点LED.但是尝试了N此,在网上找了很多资料都点不亮LED,也不知道问题出在哪里.网上很多ZEDBoard开发板,有官方提 ...

  5. 米尔科技zynq利用MIO操作LED灯的linux驱动

    一.目标 在米尔科技zynq的z-turn开发板上,通过编写驱动,实现对两盏灯的控制. 二.分析 ①硬件部分 这两盏绿灯位于zynq的MIO0和MIO9上. 有关操作IO口的地址,查找ug585-zy ...

  6. STM32学习笔记——GPIO,点灯之路第一步

    学习B站上江科大stm32教学视频作的笔记 本文将从工作原理和相关固件库函数来介绍GPIO. 工作原理 GPIO简介 GPIO,(General-purpose input/output),是由STM ...

  7. ZYNQ之路--初级开发流程介绍

    很多有玩过FPGA的老兄入手了ZYNQ,也明白什么PS+PL的开发方式,但是不知道开发ZYNQ究竟要怎么样做.本篇博客是本人阅读正点原子等开发资料的一些感悟,希望能让大家对ZYNQ的开发流程有一个更清 ...

  8. 基于ZYNQ的EMIO调试UART实验

    1 概述 本实验基于ZYNQ,通过EMIO调试UART. 2 过程记录 a) 首先创建ZYNQ工程,对DDR.时钟.电源.网口等引脚分配进行配置,此步骤按照原理图配置即可(由于本实验为后续调试做基础, ...

  9. ZYNQ学习笔记PS部分【基本介绍】

    基于Zynq的嵌入式开发流程 Xilinx Zynq SoC 是集成了FPGA和硬核处理器的特殊SoC,它与一般FPGA的最大不同就是自带了一个ARM Cortex-A系列硬核,根据型号不同从A9到A ...

最新文章

  1. Auto ML自动调参
  2. 线上学python哪家好-0基础学python,打算找培训机构,是线上好还是线下好?
  3. 我的软件工程之路(二)
  4. GDCM:gdcm::Dict的测试程序
  5. Mysql常用的命令
  6. 数据链路层---使用集线器的星型拓扑_传统以太网传输介质的改变_总线型--->双绞线为介质的以太网采用星型拓扑_集线器的特点_集线器之间的远程连接
  7. 增加无线模块传输距离的方法
  8. HDU 2242 双连通分量 考研路茫茫——空调教室
  9. HDU4609 FFT
  10. Javascript基础系列之(五)条件语句(if条件语句)
  11. tbopen链接生成工具_筛选了100个配色工具后,我挑出了这25个
  12. 你焊接过最小的贴片器件是多大?
  13. android商品详情详解
  14. 基于SpringBoot 在线答题系统 含小程序!
  15. 哪个城市美女最多?OPPO R11开启“谁是拍照King·仲夏之梦”活动
  16. 人机交互及用户体验、GUI思考
  17. 机器学习技术在日常生活和商业领域的应用有哪些,主要带来了什么商业收益?
  18. 践行安全使命,助力冬奥安全,常态化演练——赛宁在行动
  19. 安徽工程大学计算机与信息学院教师,杨丹 - 安徽工程大学 - 计算机与信息学院...
  20. 给大家分享一些IT网课资源的学习网站啦

热门文章

  1. vxWorks 无法启动问题定位
  2. 解决Maven中No valid Maven installation found. Either set the home directory in the configuration dialog
  3. Linux shell脚本、定时备份mysql数据库、sendMail邮件发送
  4. touchgfx将图片资源存放外部先遣测试
  5. 07、光耦隔离继电器实验
  6. 一起实现RPC,超详细~~~ 第一篇
  7. DIY植物生长机——《取经篇》
  8. 面向对象与面向过程的区别
  9. Docker-常用命令
  10. a-upload自定义上传图片