AXI GPIO同一通道混合输入输出使用示例
硬件设计


xdc约束
Swift
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
cs
#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
cs
#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 GPIO
XGpio_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
cs
#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输出0
void 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);