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

Zynq7020 SDK 初学篇(2)- PS 端 GPIO LED

时间:2023-08-09 20:33:36浏览次数:29  
标签:PS LED Zynq7020 BOARD XGpioPs GPIO include psGpio

一、开发环境  Zynq7020 + Vivado2017.4

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

三、功能实现,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_LED1    (8)
#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_LED1, 1);
    XGpioPs_SetDirectionPin(&s_psGpio, CORE_LED, 1);

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

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

         XGpioPs_WritePin(&s_psGpio, BOARD_LED0, 1);
         XGpioPs_WritePin(&s_psGpio, BOARD_LED1, 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);
    }

    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:控制电平高低,这样就可以自由控制输出啦

 

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

相关文章

  • Oracle 安装 Failed to Create oracle Oracle Home User 解决方案
    WindowsServer2016安装Oracle12报错:FailedtoCreateoracleOracleHomeUser的解决方案:1、打开域安全策略(secpol.msc)-安全设置-账户策略-密码策略-密码必须符合复杂性要求。定义这个策略设置为:已禁用。 2、最后cmd运行刷新组策略命令为:gpupdate/force 3、重新......
  • Zynq7020 SDK 初学篇(1) - HelloWorld
    一、开发环境 Zynq7020+Vivado2017.4二、开发背景:会使用Vivado开发工具,不熟悉的可以参考正点原子开发文档二、功能实现,串口输出HelloWorld三、实现步骤:1、配置PS端BlockDesign串口0 2、导出到SDK,编写代码,编译输出即可#include<stdio.h>......
  • vue启用https服务及nginx启用https配置
    1.vue开发环境中主要是configjs配置启用https服务devServer:{https:true,//启用https} 2.nginx 申请一个ssl证书,自行申请。 下面是一个nginx例子 需要修改的配置https主要是红色标出来部分。蓝色加粗部分主要是history模式下刷新出现404的解决办法ser......
  • NETCORE - 读取 appsettings.json 配置数据
    NETCORE-读取appsettings.json配置数据 环境:net6 webapi 1. 配置appsettings.json数据{"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warn......
  • excel wps宏编辑器,用JavaScript自定义函数设置单元格符合条件后,那一行都变色
        functionjudge(){varapp=Application;//WPS表格的应用程序对象varwb=app.ActiveWorkbook;//当前工作簿varsheet=wb.ActiveSheet;//当前工作表vardataRange=sheet.UsedRange;//使用的数据范围varnumRows=dataRange.Rows......
  • Linux终端命令行提示符PS1格式修改
    zsh先确定你是用的shell类型,运行echo$SHELL如果你使用的是zsh,那么修改/etc/zshrc其中有一行设置PS1的值的,修改为PS1="%n@%m%1~%#"其它的zsh中转义变量%T系统时间(时:分)%*系统时间(时:分:秒)%D系统日期(年-月-日)%n你的用户名%B-%b开始到结束使用粗体打印%......
  • js 添加和移除disabled属性
    //js的方式//动态修改元素disabled属性functiondisableTest(element,val){document.getElementById(element).disabled=val;}document.getElementById("uid").disabled="";//启用document.getElementById("uid").disabled="disabled"......
  • FortiGate在AWS上配置IPsec方法
    FortiGate在AWS上配置IPsec方法项目背景需求描述架构图如架构图所示,客户有北京和香港两个AWS环境,已经通过专线打通。现在需求是在北京和香港各部署一台Fortigate作为分流使用,北京客户的访问流量如果是要到海外则通过专线到香港的Fortigate出去。测试步骤北京区和宁夏区部署Fortiga......
  • ubuntu22.04问题:Method https has died unexpectedly!
    问题当我们执行update的时候,有时候会遇到下面这种情况apt-getupdate命中:1http://mirrors.tuna.tsinghua.edu.cn/ubuntujammyInRelease命中:2http://mirrors.tuna.tsinghua.edu.cn/ubuntujammy-updatesInRelease命中:3http://mirrors.tuna.tsinghua.edu.cn/ubuntuj......
  • 在最新更新的 Windows 系统中使用 .net 程序调用一些 https 接口时出现错误:请求被中止
    这是因为出于安全原因,新更新的系统中会默认禁用一些已经过时不安全的加密协议如:SSL3.0、TLS1.0、TLS1.1等但并不是所有接口服务器都已经更新支持了更新的协议所以在确认安全的情况下,可以将这些旧的协议再次启用,以达到兼容旧接口调用的目的方法1:注意:这个修改会在系统全局......