龙芯久久派的GPIO怎么配置

关于 GPIO 开发的介绍

我们使用 sysfs 接口来操作 GPIO,这是 Linux 系统提供的一种用户空间访问和控制 GPIO 的方法。

GPIO 的基本操作流程

  1. GPIO 的导出与取消导出

    • 通过 /sys/class/gpio 目录进行操作
    • 使用 export 文件导出 GPIO
    • 使用 unexport 文件取消导出
  2. 示例:导出 GPIO 19

    1
    echo 19 > /sys/class/gpio/export

    导出后会在 /sys/class/gpio 下创建 gpio19 目录

  3. GPIO 的配置与控制

    • direction 文件:设置 GPIO 方向
    • value 文件:控制 GPIO 电平状态
  4. 实际操作示例

    1
    2
    3
    # 设置 GPIO 19 为输出并置高电平
    echo out > /sys/class/gpio/gpio19/direction
    echo 1 > /sys/class/gpio/gpio19/value

GPIO 属性文件说明

  1. direction 文件可选值

    • in: 输入模式
    • out: 输出模式(默认低电平)
    • low: 输出模式(默认低电平)
    • high: 输出模式(默认高电平)
  2. value 文件

    • 0: 低电平
    • 1: 高电平
  3. edge 文件(中断配置)

    • none: 禁用中断
    • rising: 上升沿触发
    • falling: 下降沿触发
    • both: 双边沿触发

库的设计

为了方便地在C/C++开发中使用 GPIO, 我们设计了一个简单的库,提供了以下功能:

1
2
3
4
5
6
int gpio_export(int pin); // 导出 GPIO
int gpio_unexport(int pin); // 取消导出 GPIO
int gpio_direction(int pin, int dir); // 设置 GPIO 方向
int gpio_read(int pin); // 读取 GPIO 电平
int gpio_write(int pin, int value); // 写入 GPIO 电平
int gpio_edge(int pin, int edge); // 设置 GPIO 中断触发方式

在使用时,只需要引入头文件 gpio.h 即可,无需关心底层的操作细节。

库的使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "gpio.h"

#define LED 83

int main(void)
{
gpio_export(LED);
gpio_direction(LED, 1);

while (1)
{
gpio_write(LED, 1);
sleep(1);
gpio_write(LED, 0);
sleep(1);
}

gpio_unexport(LED);
return 0;
}

请注意,使用 GPIO 时需要 root 权限,可以通过 sudo 命令运行程序。

至于PWM的使用也是类似:

PWM的PATH在/sys/class/pwm/

你可以通过以下命令来操作PWM:

1
2
3
4
echo 0 > /sys/class/pwm/pwmchip0/export #导出PWM0
echo 1000000 > /sys/class/pwm/pwmchip #设置PWM周期为1s
echo 500000 > /sys/class/pwm/pwmchip #设置PWM占空比为50%
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable #使能PWM

同样的,我们也提供了一个简单的库来操作PWM:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int gpio_export(int pin); // 导出 GPIO
int gpio_unexport(int pin); // 取消导出 GPIO
int gpio_direction(int pin, int dir); // 设置 GPIO 方向
int gpio_read(int pin); // 读取 GPIO 电平
int gpio_write(int pin, int value); // 写入 GPIO 电平
int gpio_edge(int pin, int edge); // 设置 GPIO 中断触发方式

enum GPIO_DIRECTION {
INPUT = 0,
OUTPUT = 1
};

enum GPIO_VALUE {
LOW = 0,
HIGH = 1
};

enum GPIO_EDGE {
NONE = 0,
RISING = 1,
FALLING = 2,
BOTH = 3
};

希望这个库能够帮助你更方便地使用GPIO和PWM。