本文配套原码工程已上传至

https://download.csdn.net/download/botao_li/10909283



AXI_GPIO

AXI GPIO模块将PL端连接的GPIO信号通过AXI接口与PS模块连接,PS通过AXI接口的地址映射对PL端的GPIO信号进行读写等控制

与EMIO可以实现相同的功能,区别主要在于EMIO对于少数GPIO接口进行单独的控制,而AXI GPIO可以对多个GPIO接口合并成的总线进行整体读写控制



Block Design

建立zcu102的Vivado工程,建立Block Design,添加zynq模块,2个AXI GPIO模块和1个ILA模块(用于debug)

zynq模块保持默认设置并添加uart0,uart1用于串口调试,以及pl至ps的中断用于响应按钮操作

在这里插入图片描述

在这里插入图片描述

其实1个axi_gpio模块可以定义2个GPIO通道独立工作,为了演示操作,本试验使用的2个axi_gpio模块都只使用其中1个通道

配置图中GPIO通道在SDK编程的API函数中被认为是1通道,GPIO2通道在API中被认为是2通道

将axi_gpio_0模块双击设置为led输出,使用Board Interface可以不用手动添加管脚约束

在这里插入图片描述

将axi_gpio_1模块设置为按钮输入,使用Board Interface可以不用手动添加管脚约束

在这里插入图片描述

使能中断会添加ip2intc_irpt端口,将此端口连接至PS模块的PL中断输入端口即可在SDK中响应当前axi_gpio模块的中断


注意:axi_gpio的中断会在任一GPIO接口数值变化时产生一段时间的高电平,无论数值由0变1还是由1变0,因此按钮按下并弹起实际会产生2次中断的高电平

ILA模块的添加即用于验证上述说明,

使用Block Design的自动连线及手动连线后,Block Design内容如下图所示:

在这里插入图片描述

对Block Design先Generate Output Products,再Create HDL Wrapper

在Flow Navigator中选择Generate Bitstream,直到完成(由于使用Board Interface配置2个axi_gpio,因此不用进行手动管脚约束)

在File菜单选择Export Hardware,勾选Include Bitstream

之后在File菜单选择Launch SDK



SDK

进入SDK后,以Empty Application模板建立工程(为演示操作才选Empty,HelloWorld模板更方便)

在这里插入图片描述

在BSP工程上点击右键,选择Board Support Package Settings

在这里插入图片描述

在standalone页设置标准输入输出为uart0,用于串口调试

在这里插入图片描述

在axi_gpio_test工程的src文件夹上右键选择新建source file

在这里插入图片描述

在弹出窗口中设置源文件名和生成模板,注意文件名需要加上.c扩展名,模板选择C source

在这里插入图片描述

双击打开建立的main.c文件,写入代码

具体编程原理可以查看代码注释或者从BSP工程的system.mss文件导入示例工程查看

#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"

//在中断中赋值控制LED闪烁模式
//中断中控制的标志变量用volatile声明表示不用cache
volatile u8 mode = 0;

//中断函数声明为static,可以加快速度
static void handler_btn(void* Callback)
{
   
	//在XScuGic_Connect设置XGpio对象指针作为参数送入
	XGpio* g = (XGpio*)Callback;

	//读出按钮状态
	u32 r;
	r = XGpio_DiscreteRead(g, 1);
	printf("%08x\n\r", r);<



版权声明:本文为botao_li原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/botao_li/article/details/86242850