AXI GPIO 2——ZYNQ学习笔记
AXI GPIO同一通道混合输入输出使用示例
硬件设计
xdc约束
set_property -dict {PACKAGE_PIN M17 IOSTANDARD LVCMOS33} [get_ports uart_rxd]
set_property -dict {PACKAGE_PIN L17 IOSTANDARD LVCMOS33} [get_ports uart_txd]set_property -dict {PACKAGE_PIN P20 IOSTANDARD LVCMOS33} [get_ports {axi_gpio_tri_io[0]}]
set_property -dict {PACKAGE_PIN P21 IOSTANDARD LVCMOS33} [get_ports {axi_gpio_tri_io[1]}]
set_property -dict {PACKAGE_PIN K21 IOSTANDARD LVCMOS33} [get_ports {axi_gpio_tri_io[2]}]
set_property -dict {PACKAGE_PIN J20 IOSTANDARD LVCMOS33} [get_ports {axi_gpio_tri_io[3]}]
main.c
#include <stdio.h>
#include "axi_gpio.h"int main(){u32 axi_reg_data = 0;axi_gpio_config();out_axi_gpio(1,0);axi_reg_data = read_axi_reg();printf("AXI GPIO S\r\n");printf("axi reg = %p\r\n",axi_reg_data);return 0;
}
axi_gpio.c
#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "xil_exception.h"
#include "xscugic.h"
#include "axi_gpio.h"XGpio AXI_Gpio ;
extern XScuGic Intc ;#define GPIO_CHANNEL1 1 //AXI GPIO 通道号#define AXI_GPIO_ID XPAR_GPIO_0_DEVICE_ID //AXI GPIO 器件ID//axi gpio 初始化
void axi_gpio_config(void){XGpio_Initialize(&AXI_Gpio, AXI_GPIO_ID); //初始化AXI GPIOXGpio_SetDataDirection(&AXI_Gpio,GPIO_CHANNEL1,0x0000000C); //设置对应通道为0011输出输入LED_ON;
}//读取通道当前状态
u32 read_axi_reg(void){return XGpio_DiscreteRead(&AXI_Gpio,GPIO_CHANNEL1);
}//输出函数
//bit_pos:要修改的数据位
//value:要修改的数据
void out_axi_gpio(u32 bit_pos,u8 value){u32 out_data;out_data = modify_bit(read_axi_reg(),bit_pos,value);XGpio_DiscreteWrite(&AXI_Gpio,GPIO_CHANNEL1,out_data);
}//掩码与数据改变
//data:要修改的原数据
//bit_pos:要修改的数据位
//value:要修改的数据
u32 modify_bit(u32 data, u32 bit_pos, u8 value){u32 mask = 1U << bit_pos; // 创建指定位的掩码if (value) {data |= mask; // 设置该位为1} else {data &= ~mask; // 设置该位为0}return data;
}
axi_gpio.h
#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"extern XGpio AXI_Gpio ;#define GPIO_CHANNEL1 1 //AXI GPIO 通道号#define LED_ON XGpio_DiscreteWrite(&AXI_Gpio,GPIO_CHANNEL1,0X00000003) //控制IO输出1
#define LED_OFF XGpio_DiscreteWrite(&AXI_Gpio,GPIO_CHANNEL1,0X00000000) //控制IO输出0void axi_gpio_config(void);
u32 read_axi_reg(void);
u32 modify_bit(u32 data, u32 bit_pos, u8 value);
void out_axi_gpio(u32 bit_pos,u8 value);