最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
给大家整理的电子书资料:
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
EDGE_FALLING,
EDGE_BOTH,
};
typedef uint8_t edge_t;
int gpio_export(int gpio);
int gpio_unexport(int gpio);
int gpio_set_active(int gpio, active_level_t active);
int gpio_active_low(int gpio);
int gpio_active_high(int gpio);
int gpio_set_edge(int gpio, edge_t edge);
int gpio_edge_none(int gpio);
int gpio_edge_rising(int gpio);
int gpio_edge_falling(int gpio);
int gpio_edge_both(int gpio);
int gpio_set_direction(int gpio, gpio_dir_t dir);
int gpio_direction_input(int gpio);
int gpio_direction_output(int gpio);
void gpio_set_value(int gpio, int value);
int gpio_get_value(int gpio);
#endif /* __GPIO_H__ */
**gpio.c:**
#include “gpio.h”
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
/*
gpio 编号计算
index = GPIOn_IOx = (n-1)*32 + x
例如蜂鸣器使用的引脚编号为:index = GPIO1_19 = (1-1)*32 +19 = 19。
又例如GPIO4_IO20的编号为:index = GPIO4_IO20 = (4-1)*32+20=116。
*/
int gpio_export(int gpio)
{
int fd;
char gpio_path[100] = {0};
/* GPIO目录路径 */
sprintf(gpio_path, “/sys/class/gpio/gpio%d”, gpio);
/* 判断GPIO目录是否存在 */
if (access(gpio_path, F_OK) == 0) return 0;
if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY)))
{
perror("open error");
return -1;
}
/\* 导出 gpio \*/
char gpio_str[10] = {0};
sprintf(gpio_str, "%d", gpio);
int len = strlen(gpio_str);
if (len != write(fd, gpio_str, len))
{
perror("write error");
return -2;
}
return 0;
}
int gpio_unexport(int gpio)
{
int fd;
fd = open(“/sys/class/gpio/unexport”, O_WRONLY);
if(fd < 0)
return -1;
char gpio_str[10] = {0};
sprintf(gpio_str, "%d", gpio);
write(fd, gpio_str, strlen(gpio_str));
close(fd);
return 0;
}
static int gpio_cfg_attr(int gpio, char *attr, char *val)
{
int fd;
char path[100] = {0};
sprintf(path, “/sys/class/gpio/gpio%d/%s”, gpio, attr);
if (0 > (fd = open(path, O_WRONLY)))
{
perror(“open error”);
return -1;
}
int len = strlen(val);
if (len != write(fd, val, len))
{
perror("write error");
close(fd);
return -2;
}
close(fd);
return 0;
}
int gpio_set_direction(int gpio, gpio_dir_t dir)
{
char dirs[10] = {0};
if (dir == GPIO_DIR_OUTPUT)
{
sprintf(dirs, “%s”, “out”);
}
else
{
sprintf(dirs, “%s”, “in”);
}
return gpio_cfg_attr(gpio, “direction”, dirs);
}
int gpio_direction_output(int gpio)
{
return gpio_set_direction(gpio, GPIO_DIR_OUTPUT);
}
int gpio_direction_input(int gpio)
{
return gpio_set_direction(gpio, GPIO_DIR_INPUT);
}
int gpio_set_active(int gpio, active_level_t active)
{
char active_str[10] = {0};
if (active == ACTIVE_LOW)
{
gpio\_cfg\_attr(gpio, "active\_low", "0");
}
else
{
gpio\_cfg\_attr(gpio, "active\_low", "1");
}
}
int gpio_active_low(int gpio)
{
return gpio_cfg_attr(gpio, “active_low”, “0”);
}
int gpio_active_high(int gpio)
{
return gpio_cfg_attr(gpio, “active_low”, “1”);
}
int gpio_set_edge(int gpio, edge_t edge)
{
int ret;
edge_t edge_index[4] = {EDGE_NONE, EDGE_RISING, EDGE_FALLING, EDGE_BOTH};
char str_edge_index[4][10] = {{“none”}, {“rising”}, {“falling”}, {“both”}};
for (int i = 0; i < 4; i++)
{
if (edge == edge_index[i])
{
ret = gpio_cfg_attr(gpio, “edge”, str_edge_index[i]);
break;
}
}
return ret;
}
int gpio_edge_none(int gpio)
{
return gpio_set_edge(gpio, EDGE_NONE);
}
int gpio_edge_rising(int gpio)
{
return gpio_set_edge(gpio, EDGE_RISING);
}
int gpio_edge_falling(int gpio)
{
return gpio_set_edge(gpio, EDGE_FALLING);
}
int gpio_edge_both(int gpio)
{
return gpio_set_edge(gpio, EDGE_BOTH);
}
void gpio_set_value(int gpio, int value)
{
char val[10] = {0};
if (value == 0)
{
sprintf(val, “%d”, 0);
}
else
{
sprintf(val, “%d”, 1);
}
gpio\_cfg\_attr(gpio, "value", val);
}
int gpio_get_value(int gpio)
{
char gpio_path[100] = {0};
char vals[5] = {0};
int fd;
sprintf(gpio_path, "/sys/class/gpio/gpio%d/value", gpio);
if (0 > (fd = open(gpio_path, O_WRONLY)))
{
perror("open error");
return -1;
}
if (0 > read(fd, vals, sizeof(vals)))
{
perror("read error");
close(fd);
return -1;
}
int value = atoi(vals);
return value;
}
## 使用控制GPIO蜂鸣器
**GPIO编号的计算:**
index = GPIOn_IOx = (n-1)*32 + x
例如蜂鸣器使用的引脚编号为:index = GPIO1_19 = (1-1)*32 +19 = 19。
又例如GPIO4_IO20的编号为:index = GPIO4_IO20 = (4-1)*32+20=116。
**beep.h:**
#ifndef __BEEP_H__
#define __BEEP_H__
int beep_init(void);
int beep_on(void);
int beep_off(void);
int beep_deinit(void);
#endif /* __BEEP_H__ */
**beep.c:**
#include “gpio.h”
#include “beep.h”
#define BEEP_GPIO_INDEX 19
int beep_init(void)
{
int ret;
ret = gpio_export(BEEP_GPIO_INDEX);
ret = gpio_direction_output(BEEP_GPIO_INDEX);
return ret;
}
int beep_on(void)
{
gpio_set_value(BEEP_GPIO_INDEX, 1);
return 0;
}
int beep_off(void)
{
gpio_set_value(BEEP_GPIO_INDEX, 0);
return 0;
}
int beep_deinit(void)
{
gpio_set_value(BEEP_GPIO_INDEX, 0);
return gpio_unexport(BEEP_GPIO_INDEX);
}
#include “stdio.h”
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <poll.h>
#include <stdint.h>
#include <sys/select.h>
#include “beep.h”
void sleep_ms(unsigned int ms)
{
struct timeval delay;
delay.tv_sec = 0;
delay.tv_usec = ms * 1000;
select(0, NULL, NULL, NULL, &delay);
}
int main(int argc, char **argv)
{
beep_init();
int cnt = 0;
while (1)
{
beep\_on();
sleep\_ms(500);
beep\_off();
sleep\_ms(500);
if (++cnt >= 40)
break;
}
beep\_deinit();
return 0;
}
## 中断
对于使用中断可以使用poll多路复用IO监测中断是否触发,poll事件有POLLIN、POLLOUT、POLLERR、POLLPRI 等,其中 POLLIN 和 POLLOUT 表示普通优先级数据可读、可写。中断就是一种高优先级事件,需要使用 `POLLPRI` ,当中断触发时表示有高优先级数据可被读取。
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
![](https://img-blog.csdnimg.cn/img_convert/e888c7e2b3c6709969581f2ab602dd6f.png)
给大家整理的电子书资料:
![](https://img-blog.csdnimg.cn/img_convert/ccbeba887e0f2a1765e9da608bfd8a18.png)
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
# 资料预览
给大家整理的视频资料:
[外链图片转存中...(img-k2IgI6wG-1715807091591)]
给大家整理的电子书资料:
[外链图片转存中...(img-ZR1fXZjg-1715807091592)]
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**