zoukankan      html  css  js  c++  java
  • ZYNQ系列学习GPIO实验

     GPIO实验

    一、实验原理

    调用GPIO实现PS对引脚的控制

    二、实验步骤

    1、建立工程

    这部分是ivado的操作内容,这里不做过多说明。

    2、添加ZYNQ处理器IP

    在左侧菜单栏中双击Create Block Design(bd为文件),在跳出的Diagram界面添加IP核processing_system7_0(点击中间的加号后输入zynq即可筛选出来)

    3、配置IP核

    勾选UART1用于调试,设置DDR用于下载,具体的配置方式根据相应的芯片做出设置。

    4、添加两个GPIO与总线连接的IP核

    AXI-GPIO核添加和内核添加类似,直接调用IP核的库就行。

    5、设置输入与输出的GPIO-AXI核类型

    输入:

    输出:

    6、自动连接和自动

    在Diagram框内出现Run Block Automation 和 Run Connection Automation两个选项,先后再前,依次执行,得到的效果图·:

    7、生成例化

    在资源界面顶层文件右击》generate Productor,默认生成即可。再右击选择Create HDL  wrapped即可得到自动例化的文件。

    8、配置引脚

    双击open elaborated design,打开引脚管理器IO ports(2019的默认在右下角),根据原理图选择管脚。注意使用开发板的管教电压。

    9、综合映射生成bit文件

    这里本来有三个个步骤,但是可以合在一起执行。直接点击左下角的generate Bitstream即可得到bit文件。这里需要比较长的时间,需要耐心等待。映射也是需要做的。

    这里说明一下bit文件的作用。

    生成好的bit文件可以在file》export中输出hardware,生成的hardware可以使用sdk或者vitis平台读取,形成自定义的硬件平台。换言之,截至到这一步,所有的硬件设备已经调用完成,不能再添加硬件设计了。下面的都是基于软件的设计,不能修改硬件。所以这里需要检查所有的硬件设计是否达标。由于这里设计简单,就不做仿真了,使用过的全是IP核,具有保障。

    成功的标志是生成xsa文件。

    这里总是出现licence不支持的情况,如果使用是下载的licence的话,到licence管理器中刷新后重启软件好像可以解决,不确定。

    10、vitis读取硬件

    在2019之前的版本使用的是SDK,可以自动调用,新出的vitis好像不行,需要自己引用文件。

    11、新建application project

    在file》new 》application project中新建一个文件。

    需要更改的设置就是platform

    这里的选择Create a new platform from hardware,使用添加(加号)选择vivado生成的xsa文件(默认位于工程目录下,在生成的时候可以自己设置)

    还有就是在不熟悉软件的架构之前可以使用hello word 模板,可以有效缩短时间。

    12、编写代码

    找到主文件(工程名.c),写入代码。

    由于这部分不做代码设计的实验,就先找了一份代码作为测试:

    #include <stdio.h>
    #include "platform.h"
    #include "xparameters.h"
    #include "xscugic.h"
    #include "xil_exception.h"
    #include "xgpio.h"
    #include <unistd.h> // usleep()
    #include <stdbool.h> // bool
    #define LED_DEVICE_ID XPAR_AXI_GPIO_1_DEVICE_ID
    #define KEY_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID
    XGpio LEDInst;
    XGpio KEYInst;
    u8 key_value_pre=0;
    u8 key_value_now=0;
    int main()
    {
    init_platform();
    int status;
    status = XGpio_Initialize(&KEYInst, KEY_DEVICE_ID); // initial KEY
    if(status != XST_SUCCESS) return XST_FAILURE;
    status = XGpio_Initialize(&LEDInst, LED_DEVICE_ID); // initial LED
    if(status != XST_SUCCESS)return XST_FAILURE;
    XGpio_SetDataDirection(&KEYInst, 1, 1); // set KEY IO direction as in
    XGpio_SetDataDirection(&LEDInst, 1, 0); // set LED IO direction as out
    XGpio_DiscreteWrite(&LEDInst, 1, 0x0);// at initial, all LED turn off
    printf(">>> Press PL KEY1 ~ KEY4 one by one, and check the PL LED1 ~ LED4
    ");
    while(1)
    {
    usleep(100000); // 0.1s sleep, to debounce, in common, the meta-state will sustain no more than 20ms
    key_value_pre=key_value_now;
    key_value_now= XGpio_DiscreteRead(&KEYInst, 1) & 0x0F;
    XGpio_DiscreteWrite(&LEDInst, 1, key_value_now);
    if(key_value_pre!=key_value_now) printf("key state_changed!
    ");
    }
    cleanup_platform();
    return 0;
    }

    注:以上代码源自小熊猫学堂

    13、调试代码

     首先要搭建该工程的调试环境,使用小锤子图标可以实现。

    先debug编译,再运行。编译时选择板上编译。这两个操作就是对应调试虫和开始键,接触过的人就应该知道。由于这个设计中加入了串口,所以还要加入端口,端口设置就不用多说了,做过串口实验的就会。根据这个可以得到调试的结果。如果要下载的话则调用flash即可。

    三、实验结果

    串口显示结果:

    开发板显示结果:

     视频连接

  • 相关阅读:
    (待续)【转载】 Deep Reinforcement Learning Doesn't Work Yet(这里有一篇深度强化学习劝退文)
    【转载】 深度强化学习走入「死胡同」,继续死磕电子游戏还是另辟蹊径?
    【转载】 Docker-关于docker cpu的限制后,实际效果的研究
    个人常用的 matplotlib 绘图模板
    【转载】共轭梯度法(视频讲解) 数值分析6(3共轭梯度法) ——苏州大学
    【转载】 向量,标量对向量求导数
    【转载】 Linux Hang Task 简介
    AOC U2790PC对比上一代的AOC U2790PQU怎么样?
    屏幕ppi
    ubuntu杀死进程
  • 原文地址:https://www.cnblogs.com/electricdream/p/12875592.html
Copyright © 2011-2022 走看看