找回密码
 立即注册
搜索
热搜: 飞腾 龙芯 固件
查看: 817|回复: 0

飞腾平台Linux系统下GPIO中断测试参考

[复制链接]

21

主题

0

回帖

128

积分

超级版主

积分
128
发表于 2025-3-24 10:25:09 | 显示全部楼层 |阅读模式
本帖最后由 alittle 于 2025-3-25 18:04 编辑

功能测试说明:
      
      在Linux系统中,通过sysfs接口导出指定的GPIO引脚,并将其配置为输入方向以及所需的中断触发方式(例如上升沿、下降沿等)。随后,编写一个简单的用户空间程序(以C语言为例),利用poll或select机制来监听该GPIO的中断事件。程序运行后,一旦GPIO引脚的电平变化符合设定的触发方式,系统便会生成中断信号。程序检测到中断后,会读取GPIO的值并打印相关信息,以此验证GPIO中断功能是否正常。

准备工作:

1、选择GPIO管脚:
      
      -> 选择一个支持中断的GPIO管脚,例如GPIO506(对应GPIO0_2)
      -> 再选择一个GPIO输出的管脚用于向测试管脚输出电平,例如GPIO493(对应GPIO1_5)

2、硬件连接:
      
      -> 在板卡上,使用杜邦线将GPIO0_2管脚与GPIO1_5管脚短接

3、导出GPIO引脚到用户空间:
  1. echo “506” > /sys/class/gpio/export
  2. echo “493” > /sys/class/gpio/export
复制代码

4、设置GPIO方向:
  1. echo “in” > /sys/class/gpio/gpio506/direction
  2. echo “out” > /sys/class/gpio/gpio493/direction
复制代码

5、设置中断触发方式:
      支持 none、rising、falling、both
      -> 例如,设置为下降沿触发:
  1. echo “falling” > /sys/class/gpio/gpio506/edge
复制代码

6、C语言应用测试例程:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <poll.h>

  6. #define GPIO_NUM "506"
  7. #define GPIO_PATH "/sys/class/gpio/gpio" GPIO_NUM "/value"

  8. int main() {
  9.     int fd;
  10.     struct pollfd pfd;

  11.     // 打开GPIO值文件
  12.     fd = open(GPIO_PATH, O_RDONLY);
  13.     if (fd < 0) {
  14.         perror("Failed to open GPIO value file");
  15.         return -1;
  16.     }

  17.     // 初始化poll结构
  18.     pfd.fd = fd;
  19.     pfd.events = POLLPRI; // 监听优先级事件

  20.     printf("Waiting for GPIO %s interrupt...\n", GPIO_NUM);

  21.     while (1) {
  22.         // 使用poll监听中断事件
  23.         int ret = poll(&pfd, 1, -1); // 阻塞等待事件
  24.         if (ret < 0) {
  25.             perror("Poll failed");
  26.             break;
  27.         } else if (ret == 0) {
  28.             printf("Poll timed out\n");
  29.         } else {
  30.             // 读取GPIO值
  31.             lseek(fd, 0, SEEK_SET); // 移动文件指针到文件开头
  32.             char value[2];
  33.             read(fd, value, 2);
  34.             printf("Interrupt detected! GPIO value: %s\n", value);
  35.         }
  36.     }

  37.     close(fd);
  38.     return 0;
  39. }
复制代码

7、编译应用程序:
  1. gcc gpio_interrupt_demo.c -o gpio_interrupt_demo
复制代码

测试流程:

1、执行应用测试demo,监测GPIO中断事件:
  1. ./gpio_interrupt_demo
复制代码

2、控制GPIO1_5输出高低电平给GPIO0_2:
  1. echo "0" > /sys/class/gpio/gpio493/value
  2. echo "1" > /sys/class/gpio/gpio493/value
  3. echo "0" > /sys/class/gpio/gpio493/value
  4. echo "1" > /sys/class/gpio/gpio493/value
复制代码

3、测试结果:
     
      -> 当GPIO1_5输出的电平从1到0变化时,应用测试demo打印 “interrupt detected! GPIO value: 0” 则表示下降沿中断可以正常触发并被正常监测,GPIO中断功能测试通过










您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|锋微固件

GMT+8, 2025-6-16 23:03 , Processed in 0.059945 second(s), 22 queries .

快速回复 返回顶部 返回列表