本文配套原码工程已上传至
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);<