ZYNQ学习笔记——2.GPIO_MIO实验

2.GPIO_MIO_LED 实验

注:该实验,PYNQ_Z2板子MIO没有对应的LED接口,若需要观察实验现象,需要外部接入LED

硬件:PYNQ_Z2开发板

笔记

  • GPIO 是一个外设,用来对期间的引脚作 观测( i n p u t ) \textcolor {red} {观测(input)} 观测(input以及 控制( o u t p u t ) \textcolor {red} {控制(output)} 控制(output

  • MIO(Multiuse I/O),将;来自PS 外设和静态存储器接口的访问 多路复用 \textcolor {red} {多路复用} 多路复用到PS 的引脚上。

  • GPIO可以独立且动态地编程,作为 输入 / 输出 \textcolor {red} {输入/输出} 输入/输出以及 中断模式 \textcolor {red} {中断模式} 中断模式

  • GPIO被分成了4个Bank, B a n k 0 / B a n k 1 \textcolor {red} {Bank0/Bank1} Bank0/Bank1通过 M I O \textcolor {red} {MIO} MIO连接到PS的引脚,Bank2/Bank3通过 E M I O \textcolor {red} {EMIO} EMIO连接到PL。

  • 软件通过一组 存储映射 \textcolor {red} {存储映射} 存储映射的寄存器来控制GPIO。

  • 寄存器组:

    D A T A − R O \textcolor {red} {DATA-RO} DATARO,数据只读寄存器,用来反映期间引脚的状态。

    D A T A \textcolor {red} {DATA} DATA,数据寄存器,在GPIO被配置成输出的时候,该寄存器可以控制输出的数值。

    M A S K − D A T A − L S W \textcolor {red} {MASK-DATA-LSW} MASKDATALSW,数据掩码寄存器,用于屏蔽DATA的低16位。

    M A S K − D A T A − M S W \textcolor {red} {MASK-DATA-MSW} MASKDATAMSW,数据掩码寄存器用,于屏蔽DATA的高16位。

    D I R M \textcolor {red} {DIRM} DIRM,方向模式寄存器,用于控制I/O引脚是 作为输入还是输出。0:关闭输出驱动;1:使能输出驱动。

    O E N \textcolor {red} {OEN} OEN,使能输出寄存器,当I/O被配置成输出时,该寄存器用于打开/关闭输出使能。0:关闭输出使能;1:打开输出使能。

  • MIO[8:7]在系统复位过程中作为VMODE引脚(作为输入),用于配置MIO Bank的电压,复位结束后,MIO[8:7]只能作为输出信号。

+++

介绍

GPIO 外设一般用于控制一些简单的外设,如 LED 和蜂鸣器,此时 GPIO 用作输出;也可以用于观测一些简单外设的状态,如按键,此时 GPIO 用作输入。

GPIO 可以通过 MIO 连接到 PS 端的引脚,也可以通过 EMIO 连接到 PL。

除 Bank1 之外的 Bank 都具有 32bit,Bank1 只具有 22bit ,因为总共只有 54 个 MIO,其中 32bit 的 Bank0 控制了 MIO[0~31],剩下的 MIO[31~53]就由 22bit 的 Bank1 控制。Bank2 和 Bank3 用于控制扩展的 MIO 即 EMIO,也就是说总共可以有 32+32=64 个 EMIO。

实验过程

vivado2019.2版本使用的是vitis,在创建一个新的Application Projects后,会自动出现一个Board Support Package.

  • 直接导入实例 Import Examples
  • 找到main函数,点击GpioPolledExample函数(ctrl+左键)
  • 找到初始化GPIO的驱动
/* Initialize the GPIO driver. */
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//根据器件的ID,查找器件的配置信息
		//······中间隔了好几行······
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);//初始化GPIO驱动

  • 	//把GPIO的方向设置为输出 (0:输入/ 1:输出)
    	XGpioPs_SetDirectionPin(&Gpio, MIO0_LED, 1);
    
    	//设置输出使能(0:关闭/ 1:打开)
    	XGpioPs_SetOutputEnablePin(&Gpio, MIO0_LED, 1);
    
    	//写数据到GPIO的输出引脚(1点亮)
    	XGpioPs_WritePin(&Gpio, MIO0_LED, 0x1);
    
    
  • LED闪烁效果,用sleep() 延时函数

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

/*sleep() 函数介绍
给一个以秒为单位的延时
变量为int型

在sleep.h头文件中,有其他类型的延时函数
	usleep(unsigned long useconds);
以 us 为单位
*/

代码

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

#define GPIO_DEVICE_ID		XPAR_XGPIOPS_0_DEVICE_ID

//核心板上PS端LED(PYNQ板子上PS端没有LED,需要外部接入;但是可用EMIO控制)
#define MIO0_LED			0

XGpioPs_Config * ConfigPtr;
XGpioPs Gpio;	/* The driver instance for GPIO Device. */

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的输出引脚(1点亮)
		//	XGpioPs_WritePin(&Gpio, MIO0_LED, 0x1);

	//LED闪烁效果
 	 while(1)
 	 {
 	 	 //点亮
 	 	  XGpioPs_WritePin(&Gpio, MIO0_LED, 0x1);
 	 	 //延时1s
 	 	  sleep(1);
 	 	 //熄灭
 	 	  XGpioPs_WritePin(&Gpio, MIO0_LED, 0x0);
 	 	 //延时1s
 	 	  sleep(1);
 	 }

	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值