首页 > 其他分享 >Zynq7020 SDK 初学篇(3)- PS 端 GPIO Key

Zynq7020 SDK 初学篇(3)- PS 端 GPIO Key

时间:2023-08-10 19:57:24浏览次数:35  
标签:PS int Zynq7020 BOARD Key GPIO XGpioPs include psGpio

一、开发环境  Zynq7020 + Vivado2017.4

二、开发背景:会使用 Vivado 开发工具,不熟悉的可以参考正点原子开发文档

三、功能实现,按键控制 LED 定时闪烁,这里基于上一篇 GPIO LED 的基础上编写

四、实现步骤:

  1、配置 PS 端 Block Design MIO 功能, 根据配置表编写代码

   

  

   2、导出到 SDK,编写代码,编译运行

 

#include <xil_printf.h>        // 包含 xil_printf()函数

#include "xparameters.h"     // 器件参数信息 系统生成
#include "xstatus.h"         // 包含 库的故障码 的宏定义
#include "xgpiops.h"        // 包含 PS GPIO 的函数声明
#include "xplatform_info.h"    // 获取当前的平台信息
#include "sleep.h"            // 睡眠延时接口
#include "xtime_l.h"

/* 重新定义 */
#define printf     xil_printf

/* gpio 设备,不知为何为 0 */
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID    // 0

/* GPIO 映射 */
#define BOARD_LED0    (7)
#define BOARD_KEY0    (12)
#define CORE_LED    (0)

static XGpioPs s_psGpio = {0};

/* 毫秒延时 */
void msleep(int ms)
{
    /* 64 bit 记录时间 */
    XTime tEnd;
    XTime tCur;

    /* 获取当前时间 */
    XTime_GetTime(&tCur);

    /* 计算理论结束时间 */
    tEnd  = tCur + ((((XTime) ms) * COUNTS_PER_SECOND) / 1000);

    /* 阻塞一致查询当前时间是否超时,一直占用 CPU */
    do
    {
        XTime_GetTime(&tCur);
    }while (tCur < tEnd);
}

int main(int argc, char* argv[])
{
    printf("%s XGetPlatform_Info = %d\r\n", __func__, XGetPlatform_Info());

    /* 通过设备 ID 找到对应的配置指针 */
    XGpioPs_Config *ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);

    /* 通过配置指针初始化GPIO */
    int Status = XGpioPs_CfgInitialize(&s_psGpio, ConfigPtr,
                    ConfigPtr->BaseAddr);
    if (Status != XST_SUCCESS)
    {
        return XST_FAILURE;
    }

    /* 设置  GPIO 方向输出,这里为什么会共用一个 GPIO 结构体?参数一致?  */
    XGpioPs_SetDirectionPin(&s_psGpio, BOARD_LED0, 1);
    XGpioPs_SetDirectionPin(&s_psGpio, BOARD_KEY0, 0);
    XGpioPs_SetDirectionPin(&s_psGpio, CORE_LED, 1);

    /* 使能 GPIO */
    XGpioPs_SetOutputEnablePin(&s_psGpio, BOARD_LED0, 1);
    XGpioPs_SetOutputEnablePin(&s_psGpio, CORE_LED, 1);

    /* 点灯 1s改变一次电平 */
    for (int i = 0; i < 3; i++)
    {
         XGpioPs_WritePin(&s_psGpio, BOARD_LED0, 0);
         sleep(1);

         XGpioPs_WritePin(&s_psGpio, BOARD_LED0, 1);
         sleep(1);
    }

    /* 点灯 0.2s改变一次电平 */
    for (int i = 0; i < 10; i++)
    {
         XGpioPs_WritePin(&s_psGpio, CORE_LED, 0);
         msleep(200);

         XGpioPs_WritePin(&s_psGpio, CORE_LED, 1);
         msleep(200);
    }

    /* 定时读取电平控制对应灯的亮灭 */
    unsigned int status = 0;
    while (1)
    {
        msleep(10);
        status = XGpioPs_ReadPin(&s_psGpio, BOARD_KEY0);
        XGpioPs_WritePin(&s_psGpio, BOARD_LED0, status);
    }

    return 0;
}

  3、代码解释:

    (1)void msleep(int ms) 接口,暂时只找到 sleep 秒级延时API,如果需要更小的延时,进入 sleep 接口内部,发现实现的方式是获取了CPU当前的计数时钟节拍,

       这样就简单了,参考 sleep 的的实现方式,把需要等待的计数值 除以 1000 即可求出,毫秒级的延时时间。关键函数:XTime_GetTime

    (2)GPIO MIO 驱动流程:

      1)XGpioPs_LookupConfig:通过设备 ID 找到对应的配置指针

      2)XGpioPs_CfgInitialize:初始化 GPIO 

      3)XGpioPs_SetDirectionPin:设置 GPIO 控制方向,可以是输出,也可以是输入,上述代码是输出部分

      4)XGpioPs_SetOutputEnablePin:使能 GPIO 输出

      5)XGpioPs_WritePin:控制电平高低,这样就可以自由控制输出啦

      6)XGpioPs_ReadPin:读取 GPIO 电平,这里读取按键的电平

  

 

标签:PS,int,Zynq7020,BOARD,Key,GPIO,XGpioPs,include,psGpio
From: https://www.cnblogs.com/yangjinghui/p/17621360.html

相关文章

  • C#实现PS曲线调整,OpenCV实现
    曲线原理 对于一个RGB图像, 可以对R, G, B通道进行独立的曲线调整,即,对三个通道分别使用三条曲线(Curve)。还可以再增加一条曲线对三个通道进行整体调整。 因此,对一个图像,可以用四条曲线调整。最终的结果,是四条曲线调整后合并产生的结果。比如:对红色通道定义一条曲线如下......
  • Mac重启后ssh-key失效问题
    Mac重启后ssh-key失效问题周日重启了下电脑,今天周一上班拉代码才发现没有权限Permissiondenied(publickey,gssapi-keyex,gssapi-with-mic).到ssh目录ssh-add-l一看,好家伙,所有的ssh-key都没有了网上百度了一波发现解决方案1、Windows处理方案在git的根目录中找到bash.ba......
  • 软件测试|docker ps命令 管理和监视容器的利器
    简介Docker是一种流行的容器化平台,用于构建、分发和运行应用程序。Docker提供了许多命令行工具,其中之一是dockerps命令。本文将深入介绍dockerps命令,解释其用途、参数和功能,以及如何使用该命令来管理和监视运行中的Docker容器。dockerps在Docker中,容器是运行应用程序的独立环境......
  • 天壤小白v1.1.0版本上线,超实用的大模型文档集功能优化Tips,快来一探究竟!
    Hi!小白的用户伙伴们,你们好!上月,「天壤小白」大模型产品三件套首次亮相2023WAIC。其中,应用开发平台最具特点的文档集功能,集成大模型强大的语义理解和推理技术,不仅有效破解大模型“幻觉”,还助力天壤快速适配企业需求,发布20+企业级智能应用。今天,天壤小白v1.1.0版本上线!除了「模型......
  • Redis 的大 key 如何处理
    介绍 大key并不是指key的值很大,而是key对应的value很大(非常占内存)一般而言,下面这两种情况被称为大key:String类型的值大于10KB;Hash、List、Set、ZSet类型的元素的个数超过5000个;为什么会出现大key数据结构不合理:当使用Redis的字符串类型存储较大的数据时......
  • eclipse.ini jvm 配置
    在eclispe的配置文件eclipse.ini中添加使用哪个jvm的配置:-startupplugins/org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar--launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.400.v20160518-1444-productorg.eclipse.epp.package.je......
  • sqlite3 db "delete from apps where title='Typora';"&&killall Dock
    command+shift+G进入访达前往->输入/private/var/folders 搜索:com.apple.dock.launchpad  仔细看了下执行的命令就发现了sqlite3db这个东西,可以深入了解下  ......
  • Vue3中的defineProps方法
    1.什么是definePropsdefineProps是Vue3中的一种新的组件数据传递方式,可以用于在子组件中定义接收哪些父组件的props。当父组件的props发生变化时,子组件也会随之响应。2.如何使用defineProps?在子组件中可以使用defineProps声明该组件需要接收的props,它需要传递一个包含props字段......
  • ipsec 野蛮模式点到多点(分支通过总部进行互相访问)
    需求:总部与二分支之间通过ipsecvpn进行连通,需要实现分支1与分支2通过总部ipsecvpn进行连通(测试需要分支1与分支2同时进行ping去触发感兴趣流)总部配置分解:ACL配置感兴趣流:acladvanced3005(总部与分支1的感兴趣流)rule1permitipsource192.168.30.00.0.0.255destination......
  • IPSEC相关实验--野蛮模式(点到点)
    总部配置分解:第一步、定义感兴趣流ACLaclad3005rule10peripsource192.168.10.00.0.0.255des192.168.20.00.0.0.255第二步、配置ipsec安全协议ipsectransform-setidcespencryption-algorithmdes-cbcespauthentication-algorithmmd5第三步、创建IKEprof......