重现步骤
庐山派按键GPIO编写按钮亮灯程序;
运行代码后立即亮灯,操作按钮无反应,此时日志输出按钮为高电平;
期待结果和实际结果
GPIO读取正确
软硬件版本信息
庐山派k230
rtos
错误日志
尝试解决过程
尝试其他GPIO(15、16),当IO用作输出没有问题, 用作输入时默认都是高电平;
补充材料
庐山派按键 GPIO
庐山派LED GPIO 低电平亮灯,高电平熄灭
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <signal.h>
#include "sys/ioctl.h"
/* 这两个GPIO分别控制开发板上的,按键和LED灯 */
#define LED_PIN_NUM (62)
#define KEY_PIN_NUM (53)
#define KD_GPIO_HIGH 1
#define KD_GPIO_LOW 0
/* ioctl */
#define GPIO_DM_OUTPUT _IOW('G', 0, int)
#define GPIO_DM_INPUT _IOW('G', 1, int)
#define GPIO_DM_INPUT_PULL_UP _IOW('G', 2, int)
#define GPIO_DM_INPUT_PULL_DOWN _IOW('G', 3, int)
#define GPIO_WRITE_LOW _IOW('G', 4, int)
#define GPIO_WRITE_HIGH _IOW('G', 5, int)
#define GPIO_READ_VALUE _IOW('G', 12, int)
typedef struct kd_pin_mode
{
unsigned short pin;
unsigned short val;
} pin_mode_t;
static bool exit_flag;
static void sig_handler(int sig_no) {
exit_flag = true;
printf("exit sig = %d\n", sig_no);
}
int main(void)
{
int fd, ret = 0;;
pin_mode_t led, key;
signal(SIGINT, sig_handler);
signal(SIGPIPE, SIG_IGN);
fd = open("/dev/gpio", O_RDWR);
if (fd < 0) {
perror("open /dev/gpio err\n");
return -1;
}
key.pin = KEY_PIN_NUM;
ret = ioctl(fd, GPIO_DM_INPUT_PULL_DOWN, &key);
if (ret) {
perror("set key pin mode fail\n");
ret = -1;
goto out;
}
led.pin = LED_PIN_NUM;
ret = ioctl(fd, GPIO_DM_OUTPUT, &led);
if (ret) {
perror("set led pin mode fail\n");
ret = -1;
goto out;
}
do {
ret = ioctl(fd, GPIO_READ_VALUE, &key);
printf("key read value: %hd\n", key.val);
if (ret || exit_flag) {
break;
}
if (key.val == KD_GPIO_HIGH) {
ret = ioctl(fd, GPIO_WRITE_LOW, &led);
// printf("Key press -> light on\n");
} else {
ret = ioctl(fd, GPIO_WRITE_HIGH, &led);
}
usleep(100000);
} while (1);
out:
close(fd);
return ret;
}