视频见https://bbs.elecfans.com/jishu_2370228_1_1.html
Milkv写入固件后,上电后LED会自动闪烁,这个是通过开机脚本实现的,我们可以使用以下命令禁用LED闪烁功能
mv /mnt/system/blink.sh /mnt/system/blink.sh_backup && sync
一、脚本方式控制我们继续使用PUTTY向 milkv发送命令,将特殊的数据写入到特殊文件
1、 将管脚编号写入 export文件
echo 440 > /sys/class/gpio/export
2、将out写入direction
echo out > /sys/class/gpio/gpio440/direction
3、将1写入 value 文件
echo 1 > /sys/class/gpio/gpio440/value
此时,我们发现蓝灯变成了常量
4、将0写入value文件
echo 0 > /sys/class/gpio/gpio440/value
蓝灯将熄灭
5、将管脚编号写入 unexport结束操作
echo 440 > /sys/class/gpio/unexport
上述过程就是使用脚本控制GPIO的全过程
二,GPIO管脚编号
GPIO0 对应 linux 组号值为 480
GPIO1 对应 linux 组号值为 448
GPIO2 对应 linux 组号值为 416
GPIO3 对应 linux 组号值为 384
PWR_GPIO 对应 linux 组号值为 352
GPIO 编号 =GPIO 组号值 + 偏移值.
以原理图中 GPIO1_2 管脚为例,GPIO1 对应 GPIO 组号值 448, 偏移值为 2.
因此 GPIO 编号 N 为 448+2=450
三、编程控制
除了使用脚本控制外,我们也可以选择使用编程控制,控制过程和脚本控制过程完全相同,代码如下
#include
#include
#include
#include
#include //define O_WRONLY and O_RDONLY
// LED 引脚
#define SYSFS_GPIO_EXPORT "/sys/class/gpio/export"
#define SYSFS_GPIO_UNEXPORT "/sys/class/gpio/unexport"
#define SYSFS_GPIO_RST_PIN_VAL "440"
#define SYSFS_GPIO_RST_DIR "/sys/class/gpio/gpio440/direction"
#define SYSFS_GPIO_RST_DIR_VAL "out"
#define SYSFS_GPIO_RST_VAL "/sys/class/gpio/gpio440/value"
#define SYSFS_GPIO_RST_VAL_H "1"
#define SYSFS_GPIO_RST_VAL_L "0"
int main()
{
int fd;
int count = 30;
int fp;
int gpio_num=440;//gpio_num 为要操作的 GPIO 编号,该编号等于”GPIO 组号 + 组内偏移号”
printf("Hello Worldy!\r\n");
//步骤 1: 将要操作的 GPIO 编号写到 export:
//向文件"/sys/class/gpio/export"写入要操作的IO口
//GPIO0 对应 linux 组号值为 480
//GPIO1 对应 linux 组号值为 448
//GPIO2 对应 linux 组号值为 416
//GPIO3 对应 linux 组号值为 384
//PWR_GPIO 对应 linux 组号值为 352
//GPIO 编号 =GPIO 组号值 + 偏移值 eg.以原理图中 GPIO1_2 管脚为例,GPIO1 对应 GPIO 组号值 448, 偏移值为 2. 因此 GPIO 编号 N 为 448+2=450
fp = open(SYSFS_GPIO_EXPORT,O_WRONLY);// "w");
if (fp == -1)
{
printf("ERR: export open error.\n");
return EXIT_FAILURE;
}
write(fp, SYSFS_GPIO_RST_PIN_VAL,sizeof(SYSFS_GPIO_RST_PIN_VAL));
close(fp);
//步骤 2: 设置 GPIO 方向:
fp=open(SYSFS_GPIO_RST_DIR,O_WRONLY);
if (fp == -1)
{
printf("ERR: direction open error.\n");
return EXIT_FAILURE;
}
//对于输入:写入"in";,注意大小写,测试过,大写字符程序将不起作用
//对于输出:写入"out";
write(fp, SYSFS_GPIO_RST_DIR_VAL,sizeof(SYSFS_GPIO_RST_DIR_VAL));
close(fp);
//步骤 3: 查看 GPIO 输入值或设置 GPIO 输出值:
fp=open(SYSFS_GPIO_RST_VAL,O_RDWR);
if (fp == -1)
{
printf("ERR: value open error.\n");
return EXIT_FAILURE;
}
int n=1000;
while(n>0)
{
printf("N=%d\r\n",n);
write(fp, SYSFS_GPIO_RST_VAL_H, sizeof(SYSFS_GPIO_RST_VAL_H));
usleep(200000);
write(fp, SYSFS_GPIO_RST_VAL_L, sizeof(SYSFS_GPIO_RST_VAL_L));
usleep(200000);
n--;
if(n%5==0)
usleep(1800000); //暂停1.8秒
}
close(fp);
//步骤 4: 将操作的 GPIO 编号写入 unexport:
fp = open("/sys/class/gpio/unexport",O_WRONLY);// "w");
if (fp == -1)
{
printf("ERR: unexport open error.\n");
return EXIT_FAILURE;
}
//fprintf(fp, "%d",gpio_num);
write(fp, SYSFS_GPIO_RST_PIN_VAL,sizeof(SYSFS_GPIO_RST_PIN_VAL));
close(fp);
return 0;
}
上述代码将以闪烁5次,停2s,再闪烁…有规律的进行闪烁1000次;
本文转载自:https://bbs.elecfans.com/jishu_2370228_1_1.html,作者:worldy_2020