ARM使用GPIO

yummy 阅读:437 2022-05-03 14:40:46 评论:0

一、实验目的

新建一个FPGA工程,调用ZYNQ处理器,然后导出硬件到SDK开发,然后使用软件驱动GPIO的输入输出。

二、ZYNQ工程建立

三、新建bd以及ZYNQ处理器IP调用

image.png

1.打开IP Catalog,Search输入GPIO,添加 AXI_GPIO:(添加IP也可以通过点击Diagram 上面的+号来添加):

2.我们添加两个AXI_GPIO,其中,axi_gpio_0用于输入IO,axi_gpio_1用于输出

image.png


3.设置axi_gpio_0,勾选全部为输入,GPIO宽度1,其余不变,点击OK:

image.png

4.设置axi_gpio_1,勾选全部为输出,GPIO宽度4,其余不变,点击OK

image.png

4.点击Diagram上方的Run Conection Automation自动连接信号:

image.png

5.弹出的界面,勾选所有的模块,表示全部都需要自动连接,点击OK

image.png

6.自动连接后多出两个模块,这两个模块分别是系统自动生成的复位控制模块,和AXI总线互联模块。由于AXI_gpio模块需要用到AXI总线协议接口处理器通信。

image.png

7.点击Run Block Automation 生成ZYNQ对外的管脚,包括DDR3和其他引脚

image.png

8.默认勾选左边唯一一个IP,也就是ZYNQ IP还未连接,点击Ok自动连接对外引脚

image.png

10.最后,可以点击规整布线图标,重新布局:

image.png

11.完成之后,按下ctrl+s保存设置,回到source窗口,生成输出文件和生成顶层文件。 生成输出

image.png

12.生成顶层:

image.png

13.完成之后点击工程管理栏->RTL ANALYSIS->Open Elaborated Design,然后切换视图 到I/O Planing分配管脚视图,分配管脚。分配完成之后管脚如下,我们按ctrl+s保存管脚约束 文件,文件名为gpio_input_output

image.png

14.工程管理栏直接点击生成比特文件。等待生成完成,生成完成之后,菜单栏File- >Export->Export Hardware导出硬件。我们的硬件部分设计到此结束。接下来我们开始软件 SDK开发,进行代码编写,debug。导出硬件需要勾选包含bit文件:

image.png

15.工程管理栏直接点击生成比特文件。等待生成完成,生成完成之后,菜单栏File- >Export->Export Hardware导出硬件。我们的硬件部分设计到此结束。接下来我们开始软件 SDK开发,进行代码编写,debug。导出硬件需要勾选包含bit文件:

image.png

image.png

四、SDK下的代码开发

1. 我们启动SDK。在工具栏File ->Launch SDK启动。 启动SDK后,可以看到默认带的一个硬件描述工程。我们新建一个app工程。File->New- >Application Project,然后,工程名gpio_input_output,点击NEXT:

image.png

2. 接下来工程模板选helloword工程模板。如果不能选,说明ZYNQ的IP设置中串口未勾 选,请重新在VIVADO中打开ZYNQ勾选串口1然后复位设计,删掉顶层例化,重新生成,在 生成比特文件,最后,删掉SDK目录重新导出硬件,启动sdk重复操作。

image.png

3.我们编辑gpio_input_output工程中的helloword.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\n");

    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!\n");

    }


    cleanup_platform();

    return 0;

}

4. 然后,等待SDK自动编译完成。一定要等待编译结束。SDK在新建helloword模板代码工程结束它 就自动编译,不需要手动编译。每次修改完代码,按一下ctrl+s保存即可重新编译,编译进度在右下角 会显示,以及Console窗口也会打印便已结束信息。一般第一次新建工程自动编译会比较慢,后面修改 代码都是增量编译,只重新编译修改的代码文件,就很快。

image.png

image.png

5.配置烧写FPGA。当debug启动,代码已下载到芯片,可以看到菜单栏下的 符号可用。这个时 候,我们点击小虫子 右边的下拉选项,选择Debug Configuration,进入debug配置,设 置如下:

image.png

image.png

6.然后DEBUG第二页的Application也检查一下,跟下图保持一致,表示编译的文件运 行在这个cpu核上:

image.png

7.然后点击小虫子 DEBUG,弹出的对话框均选择OK,等待再次debug就绪。然后,我们 打开terminal配置模式serial,串口号,波特率,然后连接。点击 开始debug。这个时候 我们观察开发板的D1已经亮起。我们按下KEY2,D1熄灭,terninal打印输出按钮状态已经发生 变化。

image.png









本文 zblog模板 原创,转载保留链接!网址:https://www.xn--zqqs03dbu6a.cn/?id=49

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。