通用
如果需要 GPIO 中断, 需要打开 arm core 中的 pl-ps 中断. 如下图
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
简单读写
#include <stdio.h>
#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;
}
linux 下操作方式
ls /sys/class/gpio/
export gpiochip1019 gpiochip1023 gpiochip901 unexport
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);
}
正文完