zynq gpio linux,zynq AXI GPIO使用

本文围绕Zynq GPIO在Linux环境下的操作展开。介绍了GPIO中断需打开arm core中的pl - ps中断,详细讲解了xgpio函数的API,包括初始化、设置输入输出、读写等操作。还给出了简单读写示例,以及在Linux下查看GPIO控制器和简单写GPIO的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通用

如果需要GPIO中断,需要打开arm core中的pl-ps中断.如下图

056dd450306e56d4ec535c06031f248a.gif

API详情

xgpio函数

int XGpio_Initialize(XGpio * InstancePtr, u16 DeviceId)

名称

代码

解释

函数名

XGpio_Initialize

初始化GPIO

参数1

XGpio * InstancePtr

指向GPIO实例的指针

参数2

u16 DeviceId

ID号,自动生成,在xparameters.h文件中定义

返回值

int

成功与否

void XGpio_SetDataDirection(XGpio *InstancePtr, unsigned Channel,u32 DirectionMask)

名称

代码

解释

函数名

XGpio_SetDataDirection

设置GPIO为输入/输出

参数1

XGpio * InstancePtr

指向GPIO实例的指针

参数2

unsigned Channel

待设置GPIO的通道(Vivado中设置gpio IP时的设置通道,为1或2)

参数3

u32 DirectionMask

方向设置。0:output;1:input

u32 XGpio_DiscreteRead(XGpio * InstancePtr, unsigned Channel)

名称

代码

解释

函数名

XGpio_DiscreteRead

读取GPIO的值

参数1

XGpio * InstancePtr

指向GPIO实例的指针

参数2

unsigned Channel

通道号,同上一函数

返回值

u32

最多32位的实际值

void XGpio_DiscreteWrite(XGpio * InstancePtr, unsigned Channel, u32 Data)

名称

代码

解释

函数名

XGpio_DiscreteWrite

写GPIO

参数1

XGpio * InstancePtr

指向GPIO实例的指针

参数2

unsigned Channel

通道号,同上一函数

参数3

u32 Data 需要写的值

简单操作

在xparameters.h中相关宏定义

/* Definitions for peripheral LED */

#define XPAR_LED_BASEADDR 0x41200000

#define XPAR_LED_HIGHADDR 0x4120FFFF

#define XPAR_LED_DEVICE_ID 0 // 外设 设备ID

#define XPAR_LED_INTERRUPT_PRESENT 0

#define XPAR_LED_IS_DUAL 0

/* Definitions for peripheral SW */

#define XPAR_SW_BASEADDR 0x41210000

#define XPAR_SW_HIGHADDR 0x4121FFFF

#define XPAR_SW_DEVICE_ID 1 // 外设 设备ID

#define XPAR_SW_INTERRUPT_PRESENT 1 // 中断号

#define XPAR_SW_IS_DUAL 0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

/* Definitions for peripheral LED */

#define XPAR_LED_BASEADDR 0x41200000

#define XPAR_LED_HIGHADDR 0x4120FFFF

#define XPAR_LED_DEVICE_ID 0  // 外设 设备ID

#define XPAR_LED_INTERRUPT_PRESENT 0

#define XPAR_LED_IS_DUAL 0

/* Definitions for peripheral SW */

#define XPAR_SW_BASEADDR 0x41210000

#define XPAR_SW_HIGHADDR 0x4121FFFF

#define XPAR_SW_DEVICE_ID 1          // 外设 设备ID

#define XPAR_SW_INTERRUPT_PRESENT 1  // 中断号

#define XPAR_SW_IS_DUAL 0

简单读写

#include

#include "platform.h"

#include "xil_printf.h"

#include "xparameters.h"

#include "xgpio.h"

int main() {

int Status;

XGpio Gpio_led, Gpio_sw;

u32 swVal;

init_platform();

Status = XGpio_Initialize(&Gpio_led, XPAR_LED_DEVICE_ID);

if (Status != XST_SUCCESS) {

xil_printf("Gpio Initialization Failed\r\n");

return XST_FAILURE;

}

Status = XGpio_Initialize(&Gpio_sw, XPAR_SW_DEVICE_ID);

if (Status != XST_SUCCESS) {

xil_printf("Gpio Initialization Failed\r\n");

return XST_FAILURE;

}

XGpio_SetDataDirection(&Gpio_led, 1, 0x00); // 全部为输出

XGpio_SetDataDirection(&Gpio_sw, 1, 0xFF); // 全部为输入

while( 1 )

{

swVal = XGpio_DiscreteRead( &Gpio_sw, 1 ); // 读取 AXI_GPIO中第一个通道中的值

XGpio_DiscreteWrite( &Gpio_led, 1, swVal ); // 不解释

}

cleanup_platform();

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

#include

#include "platform.h"

#include "xil_printf.h"

#include "xparameters.h"

#include "xgpio.h"

intmain(){

intStatus;

XGpioGpio_led,Gpio_sw;

u32swVal;

init_platform();

Status=XGpio_Initialize(&Gpio_led,XPAR_LED_DEVICE_ID);

if(Status!=XST_SUCCESS){

xil_printf("Gpio Initialization Failed\r\n");

returnXST_FAILURE;

}

Status=XGpio_Initialize(&Gpio_sw,XPAR_SW_DEVICE_ID);

if(Status!=XST_SUCCESS){

xil_printf("Gpio Initialization Failed\r\n");

returnXST_FAILURE;

}

XGpio_SetDataDirection(&Gpio_led,1,0x00);// 全部为输出

XGpio_SetDataDirection(&Gpio_sw,1,0xFF);// 全部为输入

while(1)

{

swVal=XGpio_DiscreteRead(&Gpio_sw,1);// 读取 AXI_GPIO中第一个通道中的值

XGpio_DiscreteWrite(&Gpio_led,1,swVal);// 不解释

}

cleanup_platform();

return0;

}

linux下操作方式

ls /sys/class/gpio/

export gpiochip1019 gpiochip1023 gpiochip901 unexport

root@hello:# cat /sys/class/gpio/gpiochip1019/label

/amba_pl/gpio@41210000

1

2

3

4

5

6

ls/sys/class/gpio/

exportgpiochip1019gpiochip1023gpiochip901unexport

root@hello:# cat /sys/class/gpio/gpiochip1019/label

/amba_pl/gpio@41210000

可以看到有 三个GPIO控制器. 其中gpiochip1019的基址为41210000,根据基址可以找到对应的硬件GPIO是哪个.. 其中1019表示了该GPIO的端口号, 如果该控制器上存在多个IO,则1020表示该控制器第二个IO,1021表示第三个…..

简单写GPIO的方式如下:

int valuefd, exportfd, directionfd;

// 打开控制器,创建gpio1020这个GPIO

exportfd = open("/sys/class/gpio/export", O_WRONLY);

if (exportfd < 0)

{

printf("Cannot open GPIO to export it\n");

exit(1);

}

write(exportfd, "1020", 5);

close(exportfd);

// 配置方向

directionfd = open("/sys/class/gpio/gpio1020/direction", O_RDWR);

if (directionfd < 0)

{

printf("Cannot open GPIO direction it\n");

exit(1);

}

write(directionfd, "out", 4);

close(directionfd);

// 写值

valuefd = open("/sys/class/gpio/gpio1020/value", O_RDWR);

if (valuefd < 0)

{

printf("Cannot open GPIO value\n");

exit(1);

}

while (1)

{

sleep(1);

write(valuefd,"3", 2);

sleep(1);

write(valuefd,"0", 2);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

intvaluefd,exportfd,directionfd;

// 打开控制器,创建gpio1020这个GPIO

exportfd=open("/sys/class/gpio/export",O_WRONLY);

if(exportfd<0)

{

printf("Cannot open GPIO to export it\n");

exit(1);

}

write(exportfd,"1020",5);

close(exportfd);

// 配置方向

directionfd=open("/sys/class/gpio/gpio1020/direction",O_RDWR);

if(directionfd<0)

{

printf("Cannot open GPIO direction it\n");

exit(1);

}

write(directionfd,"out",4);

close(directionfd);

// 写值

valuefd=open("/sys/class/gpio/gpio1020/value",O_RDWR);

if(valuefd<0)

{

printf("Cannot open GPIO value\n");

exit(1);

}

while(1)

{

sleep(1);

write(valuefd,"3",2);

sleep(1);

write(valuefd,"0",2);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值