查看: 868|回复: 0

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

[复制链接]
  • TA的每日心情
    慵懒
    2024-3-10 16:58
  • 签到天数: 223 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2023-9-16 14:34:52 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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 这个目录。
    微信截图_20230916141552.png

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

    可以使用
    1. cat /sys/class/gpio/PF14/direction
    复制代码
    查看IO方向
    微信截图_20230916141722.png

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

    2.libgpiod操作GPIO

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

    列出系统上存在的所有gpiochips
    1. gpiodetect
    复制代码
    微信截图_20230916142312.png

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

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

    设置指定 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 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 20:38 , Processed in 0.126284 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.