AXI GPIO 2——ZYNQ学习笔记

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);