ZYNQ的GPIO与AXI GPIO在代码使用上的对比分析
1. 头文件区别
AXI GPIO
#include "xgpio.h" // AXI GPIO驱动
#include "xparameters.h" // 设备参数定义
GPIO
#include "xgpiops.h" // PS GPIO驱动
#include "xparameters.h" // 设备参数定义
2. 初始化流程对比
AXI GPIO初始化
XGpio GPIOInstance;
// 1. 初始化
XGpio_Initialize(&GPIOInstance, XPAR_AXI_GPIO_0_DEVICE_ID);
// 2. 设置方向(input/output)
XGpio_SetDataDirection(&GPIOInstance, Channel, Direction);
// Channel: 1或2
// Direction: 1=输入, 0=输出
GPIO
XGpioPs psGpioInstancePtr;
XGpioPs_Config *GpioConfigPtr;
// 1. 查找配置
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
// 2. 初始化配置
XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
// 3. 设置引脚方向
XGpioPs_SetDirectionPin(&psGpioInstancePtr, PinNumber, Direction);
// PinNumber: MIO 0-53, EMIO 54+
// Direction: 1=输出, 0=输入
// 4. 使能输出(如果是输出模式)
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, PinNumber, 1);
3. 数据读写操作对比
AXI GPIO操作
// 读取
u32 value = XGpio_DiscreteRead(&GPIOInstance, Channel);
// 写入
XGpio_DiscreteWrite(&GPIOInstance, Channel, Data);
GPIO
// 读取
u32 value = XGpioPs_ReadPin(&psGpioInstancePtr, PinNumber);
// 写入
XGpioPs_WritePin(&psGpioInstancePtr, PinNumber, Value);
4. 主要区别总结
特性 | AXI GPIO | GPIO |
---|---|---|
控制器类型 | PL端AXI接口 | PS端处理器集成 |
初始化步骤 | 2步 | 4步 |
通道概念 | 有(Channel 1/2) | 无 |
引脚编号 | 通道based | 绝对编号 |
配置查找 | 不需要 | 需要 |
方向设置 | 通道级别 | 引脚或bank级别 |
输出使能 | 不需要单独设置 | 需要单独设置 |
5. 适用场景
AXI GPIO适用于:
- PL端的GPIO控制
- 需要批量控制多个引脚
- 对时序要求较高的场合
GPIO适用于:
- PS端直接控制的GPIO
- MIO引脚控制
- EMIO扩展引脚控制
- 需要单独控制每个引脚的场合
6. 注意事项
-
地址范围:
- AXI GPIO: 0x4XXX_XXXX
- PS GPIO: 0xE000_XXXX
-
方向定义:
- AXI GPIO: 1=输入, 0=输出
- GPIO: 1=输出, 0=输入
-
性能考虑:
- AXI GPIO通过总线访问,延迟较大
- PS GPIO直接访问,延迟较小