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

  • Post author:
  • Post category:其他




2.GPIO_MIO_LED 实验


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


硬件:PYNQ_Z2开发板



笔记

  • GPIO 是一个外设,用来对期间的引脚作



    观测(

    i

    n

    p

    u

    t

    \textcolor {red} {观测(input)}






    观测(


    in


    p


    u


    t








    以及



    控制(

    o

    u

    t

    p

    u

    t

    \textcolor {red} {控制(output)}






    控制(


    o


    u


    tp


    u


    t








  • 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}






    B


    ank


    0/


    B


    ank


    1





    通过



    M

    I

    O

    \textcolor {red} {MIO}






    M


    I


    O





    连接到PS的引脚,Bank2/Bank3通过



    E

    M

    I

    O

    \textcolor {red} {EMIO}






    EM


    I


    O





    连接到PL。

  • 软件通过一组



    存储映射

    \textcolor {red} {存储映射}






    存储映射





    的寄存器来控制GPIO。

  • 寄存器组:




    D

    A

    T

    A

    R

    O

    \textcolor {red} {DATA-RO}






    D


    A


    T


    A













    RO





    ,数据只读寄存器,用来反映期间引脚的状态。




    D

    A

    T

    A

    \textcolor {red} {DATA}






    D


    A


    T


    A





    ,数据寄存器,在GPIO被配置成输出的时候,该寄存器可以控制输出的数值。




    M

    A

    S

    K

    D

    A

    T

    A

    L

    S

    W

    \textcolor {red} {MASK-DATA-LSW}






    M


    A


    S


    K













    D


    A


    T


    A













    L


    S


    W





    ,数据掩码寄存器,用于屏蔽DATA的低16位。




    M

    A

    S

    K

    D

    A

    T

    A

    M

    S

    W

    \textcolor {red} {MASK-DATA-MSW}






    M


    A


    S


    K













    D


    A


    T


    A













    MS


    W





    ,数据掩码寄存器用,于屏蔽DATA的高16位。




    D

    I

    R

    M

    \textcolor {red} {DIRM}






    D


    I


    RM





    ,方向模式寄存器,用于控制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;
}



版权声明:本文为www_haha__原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。