|
本帖最后由 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引脚到用户空间:
- echo “506” > /sys/class/gpio/export
- echo “493” > /sys/class/gpio/export
复制代码
4、设置GPIO方向:
- echo “in” > /sys/class/gpio/gpio506/direction
- echo “out” > /sys/class/gpio/gpio493/direction
复制代码
5、设置中断触发方式:
支持 none、rising、falling、both
-> 例如,设置为下降沿触发:
- echo “falling” > /sys/class/gpio/gpio506/edge
复制代码
6、C语言应用测试例程:
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <poll.h>
- #define GPIO_NUM "506"
- #define GPIO_PATH "/sys/class/gpio/gpio" GPIO_NUM "/value"
- int main() {
- int fd;
- struct pollfd pfd;
- // 打开GPIO值文件
- fd = open(GPIO_PATH, O_RDONLY);
- if (fd < 0) {
- perror("Failed to open GPIO value file");
- return -1;
- }
- // 初始化poll结构
- pfd.fd = fd;
- pfd.events = POLLPRI; // 监听优先级事件
- printf("Waiting for GPIO %s interrupt...\n", GPIO_NUM);
- while (1) {
- // 使用poll监听中断事件
- int ret = poll(&pfd, 1, -1); // 阻塞等待事件
- if (ret < 0) {
- perror("Poll failed");
- break;
- } else if (ret == 0) {
- printf("Poll timed out\n");
- } else {
- // 读取GPIO值
- lseek(fd, 0, SEEK_SET); // 移动文件指针到文件开头
- char value[2];
- read(fd, value, 2);
- printf("Interrupt detected! GPIO value: %s\n", value);
- }
- }
- close(fd);
- return 0;
- }
复制代码
7、编译应用程序:
- gcc gpio_interrupt_demo.c -o gpio_interrupt_demo
复制代码
测试流程:
1、执行应用测试demo,监测GPIO中断事件:
2、控制GPIO1_5输出高低电平给GPIO0_2:
- echo "0" > /sys/class/gpio/gpio493/value
- echo "1" > /sys/class/gpio/gpio493/value
- echo "0" > /sys/class/gpio/gpio493/value
- echo "1" > /sys/class/gpio/gpio493/value
复制代码
3、测试结果:
-> 当GPIO1_5输出的电平从1到0变化时,应用测试demo打印 “interrupt detected! GPIO value: 0” 则表示下降沿中断可以正常触发并被正常监测,GPIO中断功能测试通过
|
|