打印
[STM32WB]

在 Linux 系统中操作 STM32MP1 的 GPIO 接口

[复制链接]
339|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kqh11a|  楼主 | 2024-9-30 21:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 Linux 系统中操作 STM32MP1 的 GPIO 接口
在 Linux 系统中,可以通过文件系统接口访问 GPIO。通常,GPIO 设备在 /sys/class/gpio 目录下表示。

GPIO 操作步骤
导出 GPIO:

使用 echo 命令将 GPIO 引脚导出,以便在 /sys/class/gpio 中使用。
例如,导出 GPIO 22:
bash
复制代码
echo "22" > /sys/class/gpio/export
设置 GPIO 方向:

设置 GPIO 引脚为输入或输出。
例如,将 GPIO 22 设置为输出:
bash
复制代码
echo "out" > /sys/class/gpio/gpio22/direction
控制 GPIO 输出:

控制 GPIO 输出高或低电平。
例如,设置 GPIO 22 为高电平(点亮 LED):
bash
复制代码
echo "1" > /sys/class/gpio/gpio22/value
设置 GPIO 22 为低电平(熄灭 LED):
bash
复制代码
echo "0" > /sys/class/gpio/gpio22/value
读取 GPIO 输入:

对于输入引脚,可以读取其状态:
例如,读取 GPIO 23 的值:
bash
复制代码
cat /sys/class/gpio/gpio23/value
卸载 GPIO:

完成操作后,可以通过卸载 GPIO 来释放资源:
例如:
bash
复制代码
echo "22" > /sys/class/gpio/unexport

使用特权

评论回复
沙发
kqh11a|  楼主 | 2024-9-30 21:33 | 只看该作者
编写 Shell 脚本或 C 程序
示例 1:Shell 脚本控制 LED
下面是一个简单的 Shell 脚本,控制 LED 的亮灭。

bash
复制代码
#!/bin/bash

# 导出 GPIO 22
echo "22" > /sys/class/gpio/export

# 设置为输出
echo "out" > /sys/class/gpio/gpio22/direction

# 控制 LED 亮灭
while true; do
    echo "1" > /sys/class/gpio/gpio22/value  # LED ON
    sleep 1
    echo "0" > /sys/class/gpio/gpio22/value  # LED OFF
    sleep 1
done

# 卸载 GPIO
echo "22" > /sys/class/gpio/unexport

使用特权

评论回复
板凳
kqh11a|  楼主 | 2024-9-30 21:33 | 只看该作者
示例 2:C 程序响应按键输入
下面是一个简单的 C 程序,读取按键输入并控制 LED 灯。

c
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define LED_GPIO "22"
#define BUTTON_GPIO "23"

void export_gpio(const char *gpio) {
    FILE *fp = fopen("/sys/class/gpio/export", "w");
    fprintf(fp, "%s", gpio);
    fclose(fp);
}

void set_direction(const char *gpio, const char *direction) {
    char path[35];
    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%s/direction", gpio);
    FILE *fp = fopen(path, "w");
    fprintf(fp, "%s", direction);
    fclose(fp);
}

void set_value(const char *gpio, const char *value) {
    char path[35];
    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%s/value", gpio);
    FILE *fp = fopen(path, "w");
    fprintf(fp, "%s", value);
    fclose(fp);
}

int get_value(const char *gpio) {
    char path[35];
    char value[3];
    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%s/value", gpio);
    FILE *fp = fopen(path, "r");
    fgets(value, sizeof(value), fp);
    fclose(fp);
    return atoi(value);
}

int main() {
    // 导出 GPIO
    export_gpio(LED_GPIO);
    export_gpio(BUTTON_GPIO);

    // 设置 GPIO 方向
    set_direction(LED_GPIO, "out");
    set_direction(BUTTON_GPIO, "in");

    while (1) {
        // 读取按钮状态
        if (get_value(BUTTON_GPIO) == 1) {
            set_value(LED_GPIO, "1"); // 点亮 LED
        } else {
            set_value(LED_GPIO, "0"); // 熄灭 LED
        }
        usleep(100000); // 100 ms
    }

    // 卸载 GPIO
    set_value(LED_GPIO, "0"); // 熄灭 LED
    export_gpio(LED_GPIO);
    export_gpio(BUTTON_GPIO);

    return 0;

使用特权

评论回复
地板
kqh11a|  楼主 | 2024-9-30 21:33 | 只看该作者
编译程序:

bash
复制代码
gcc -o gpio_control gpio_control.c
运行程序:

bash
复制代码
sudo ./gpio_control
请确保以超级用户权限运行程序,因为访问 /sys/class/gpio 目录需要权限。

使用特权

评论回复
5
kqh11a|  楼主 | 2024-9-30 21:33 | 只看该作者
使用 Device Tree 进行 GPIO 配置
Device Tree 是一种数据结构,用于描述硬件设备和其配置。STM32MP1 使用 Device Tree 来配置 GPIO 接口。

基本方法
查看设备树文件:

设备树源文件(.dts 文件)通常位于 Linux 内核源码的 arch/arm/boot/dts/ 目录下。你可以查看 STM32MP1 的设备树文件,通常命名为 stm32mp157c-dk2.dts。

使用特权

评论回复
6
kqh11a|  楼主 | 2024-9-30 21:33 | 只看该作者
修改设备树配置:

在设备树文件中,可以定义 GPIO 引脚的用途、状态等信息。例如:
dts
复制代码
gpio-keys {
    compatible = "gpio-keys";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_gpio_keys>;

    user_button {
        label = "User Button";
        gpios = <&gpio0 3 GPIO_ACTIVE_LOW>; // GPIO0_3
    };
};

led {
    compatible = "gpio-leds";
    led1 {
        label = "LED1";
        gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>; // GPIO1_22
    };
};

使用特权

评论回复
7
kqh11a|  楼主 | 2024-9-30 21:33 | 只看该作者
重新编译设备树:

修改后,需要重新编译设备树文件:
bash
复制代码
dtc -I dts -O dtb -o stm32mp157c-dk2.dtb stm32mp157c-dk2.dts
将新设备树文件部署到系统:

将编译好的设备树文件放到引导分区或根文件系统中。
重启系统:

重启 STM32MP1 以应用新的设备树配置。

使用特权

评论回复
8
kqh11a|  楼主 | 2024-9-30 21:33 | 只看该作者
在 STM32MP1 上操作 GPIO 接口可以通过 Linux 文件系统进行简单的控制。通过编写 Shell 脚本或 C 程序,可以实现对 LED 灯的控制和响应按键输入。此外,使用 Device Tree 进行 GPIO 配置能够更方便地管理硬件设备,并适应系统变化。通过这些方法,您可以有效地控制 STM32MP1 上的外设,实现各种应用场景。

使用特权

评论回复
9
wangtaohui| | 2024-10-2 20:46 | 只看该作者
对于输入引脚,可以读取其状态: 例如,读取 GPIO 23 的值: bash

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

499

帖子

0

粉丝