回答

收藏

[评测分享] 【米尔-STM32MP135入门级开发板 测评】5.GPIO控制

#板卡评测 #板卡评测 2215 人阅读 | 0 人回复 | 2023-09-16

本帖最后由 az158 于 2023-9-16 14:41 编辑

对于一个板子来说,性能强大只是其中的一部分,更重要的一环就是它的生态,也就是资料的多少。

米尔STM32MP135开发板的资料还是比较全面,今天先来试一试它的GPIO控制。

1.文件操作GPIO
首先是导出引脚

GPIO 的测试是通过文件系统 sysfs 接口来实现的,
首先是引脚编号的计算。
根据 #define PIN_NO(port, line) (((port) - 'A') * 0x10 + (line))进行计算
其中 port 为 gpio 端口,line 为该 gpio 对应引脚,((port)-'A')代表 ASCII 码相减。
如 PF14对应的 pin 引脚编号为IN_NO('F',14)=(0x46-0x41)*0x10+14=(70-65)*16+14=94。

执行导出命令,
  1. echo 94 > /sys/class/gpio/export
复制代码
导出成功后会在/sys/class/gpio/目录下生成 PF14 这个目录。


设置引脚输出
  1. echo "out" > /sys/class/gpio/PF14/direction
复制代码

可以使用
  1. cat /sys/class/gpio/PF14/direction
复制代码
查看IO方向


通过向/sys/class/gpio/PF14/value写入1或0即可控制IO

2.libgpiod操作GPIO

libgpiod提供了一个C库和工具,用于与linux GPIO字符设备进行交互(gpiod代表GPIO设备)。

列出系统上存在的所有gpiochips
  1. gpiodetect
复制代码


列出指定gpiochip的所有行、其名称、使用者及其设置
  1. gpioinfo
复制代码


读取指定 GPIO行值(如果已请求该行,则无效)。然后将配置为输入。
  1. gpioget gpiochip0 10
复制代码


设置指定 GPIO 行的值,可能保持行导出,并等待超时、用户输入或信号(如果已请求该行,则无效)。
  1. gpioset gpiochip0 10=0
复制代码

参照上面编写一个控制PA14输出的代码
  1. #include <errno.h>
  2. #include <fcntl.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/ioctl.h>
  7. #include <unistd.h>

  8. #include <linux/gpio.h>

  9. int main(int argc, char **argv)
  10. {
  11.         struct gpiohandle_request req;
  12.         struct gpiohandle_data data;
  13.         char chrdev_name[20];
  14.         int fd, ret;

  15.         strcpy(chrdev_name, "/dev/gpiochip0");

  16.         /*  Open device: gpiochip0 for GPIO bank A */
  17.         fd = open(chrdev_name, 0);
  18.         if (fd == -1) {
  19.                 ret = -errno;
  20.                 fprintf(stderr, "Failed to open %s\n", chrdev_name);

  21.                 return ret;
  22.         }

  23.         /* request GPIO line: GPIO_A_14 */
  24.         req.lineoffsets[0] = 14;
  25.         req.flags = GPIOHANDLE_REQUEST_OUTPUT;
  26.         memcpy(req.default_values, &data, sizeof(req.default_values));
  27.         strcpy(req.consumer_label, "led_gpio_a_14");
  28.         req.lines  = 1;

  29.         ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req);
  30.         if (ret == -1) {
  31.                 ret = -errno;
  32.                 fprintf(stderr, "Failed to issue GET LINEHANDLE IOCTL (%d)\n",
  33.                         ret);
  34.         }
  35.         if (close(fd) == -1)
  36.                 perror("Failed to close GPIO character device file");

  37.         /*  Start led blinking */
  38.         while(1) {

  39.                 data.values[0] = !data.values[0];
  40.                 ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);
  41.                 if (ret == -1) {
  42.                         ret = -errno;
  43.                         fprintf(stderr, "Failed to issue %s (%d)\n",
  44.                                         "GPIOHANDLE_SET_LINE_VALUES_IOCTL", ret);
  45.                 }
  46.                 sleep(1);
  47.         }

  48.         /*  release line */
  49.         ret = close(req.fd);
  50.         if (ret == -1) {
  51.                 perror("Failed to close GPIO LINEHANDLE device file");
  52.                 ret = -errno;
  53.         }
  54.         return ret;
  55. }
复制代码

PA14引脚高低变化输出。


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条