ZYNQ:GPIO、MIO、EMIO 简洁笔记(含实验程序)

概述:最近开始学习ZYNQ的嵌入式部分,在这里对 GPIO,MIO,EMIO 做一个简单整理,并做一个通过使用 GPIO 外设通过 MIO 控制 PS 端的 LED的简单实验,后面会补上AXI部分笔记。本文章参考了Xilinx官方用户参考手册:UG585。

注:学习之前建议先看一下ZYNQ_7000架构图,这样做可以对各个知识点有一个全局的概念。
ZYNQ:GPIO、MIO、EMIO 简洁笔记(含实验程序)_第1张图片
1、GPIO是一个外设,用来对器件的引脚作观测input)以及控制(output)。

GPIO手册简介
ZYNQ:GPIO、MIO、EMIO 简洁笔记(含实验程序)_第2张图片
2、MIO(Multiuse I/O),将来自PS外设和静态存储器接口的访问多路复用到
PS的引脚上。
3、EMIO,是扩展的MIO,当PS的引脚不够用的时候,可以通过EMIO来进行扩展,从而使用PL的引脚。(注1:EMIO是PS和PL之间的接口)(注2:并不是所有外设都可以通过EMIO连接到PL)

图中圈中部分不能通过EMIO连接到PL端
ZYNQ:GPIO、MIO、EMIO 简洁笔记(含实验程序)_第3张图片
4、GPIO可以独立且动态地编程,作为输入/输出以及中断模式。
5、GPIO被分成4个Bank。Bank0/Bank1 通过MIO连接到PS的引脚,Bank2/Bank3 通过EMIO连接到PL

ZYNQ:GPIO、MIO、EMIO 简洁笔记(含实验程序)_第4张图片
6、软件通过一组存储映射的寄存器来控制GPIO。
7、寄存器组:(6个寄存器控制GPIO)PS端部分
DATA_RO,用来反映器件引脚的状态。
DATA,在GPIO被配置成输出的时候,该寄存器可以控制输出的数值。
MASK_DATA_LSW,用于屏蔽DATA低16位
MASK_DATA_MSW,用于屏蔽DATA高16位
DIRM,用于控制I/O引脚是作为输入还是输出。0:关闭输出驱动;1:使能输出驱动
OEN,当I/O被配置成输出时,该寄存器用于打开/关闭输出使能。0:关闭输出使能;1:打开输出使能。

MASK_MSW用法:1111_0000——1111_0000 (除了需要修改,其他用1屏蔽)
Data: 0000__1010——0000_0000
DATA:1010__0101——1010_0101_XXXX_XXXX_XXXX_XXXX
16个LED:亮灭亮灭——灭亮灭亮——亮灭亮灭——灭亮灭亮
DATA:1010__1010_1010_0101_XXXX_XXXX_XXXX_XXXX
16个LED:亮灭亮灭——亮灭亮灭——亮灭亮灭——灭亮灭亮
(1)先把DATA的值读出来 (read
(2)改变需要更换的数值 (modify
(3)修改之后的数值写在DATA里(write

ZYNQ:GPIO、MIO、EMIO 简洁笔记(含实验程序)_第5张图片
8、MIO[8:7]在系统复位过程中作为VMODE引脚(作为输入),用于配置MIO Bank的电压。复位结束后,MIO[8:7]只能作为输出信号。

实验内容:
使用PS端的MIO控制LED,实现LED闪烁的效果,并向串口发送GPIO MIO TEST!
ZYNQ:GPIO、MIO、EMIO 简洁笔记(含实验程序)_第6张图片

#include"stdio.h"
#include"xparameters.h"
#include"xgpiops.h"
#include"sleep.h"

#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID

//核心板上PS端LED     为增强程序可读性,所以定义了名称
#define MIO0_LED            0

XGpioPs_Config *ConfigPtr;

XGpioPs Gpio;

int main()
{
	printf("GPIO MIO TEST!\n\r");


	//根据器件的ID,查找器件的配置信息
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);

	//初始化GPIO
	XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);

	//把GPIO的方向设置为输出(0,输入/ 1,输出)
	XGpioPs_SetDirectionPin(&Gpio,MIO0_LED, 1);

	//设置输出使能(0,关闭/ 1,打开)
	XGpioPs_SetOutputEnablePin(&Gpio, MIO0_LED, 1);

	//写数据到GPIO的输出引脚
	XGpioPs_WritePin(&Gpio, MIO0_LED, 1);

	while(1){
	//点亮
		XGpioPs_WritePin(&Gpio, MIO0_LED, 1);
	//延时
	sleep(1);
	//熄灭
		XGpioPs_WritePin(&Gpio, MIO0_LED, 0);
	//延时
		sleep(1);
	}
	return 0;
}


你可能感兴趣的:(FPGA)