社区导航

 

搜索
查看: 3396|回复: 8

[经验] BB Black 入门基础之GPIO中断

[复制链接]

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2014-1-15 10:15 | 显示全部楼层 |阅读模式
本帖最后由 lonerzf 于 2014-1-18 21:25 编辑

有了上次 BB Black 入门基础之初识GPIO 的基础,今天的内容就轻松多了。咱们使用poll()来轮询设备,配置GPIO中断,接着控制LED灯。
参考资料是 derek molly 在YouTube上的视频介绍(不方便发链接,自己搜吧),以及BridgeRun的GPIO实现程序。
同样地,为了减少管理员的工作量,链接以截图形式给出。
b.png
d.png

前期准备
a.png
不管是面包板还是万用板还是印制电路板还是别的,只要有类似功能的都可以。
今天要做的就是读入按键部分的高低电平信号,并控制LED灯亮灭。


GPIO操作步骤大致总结如下:
1 在文件系统中配置内核GPIO支持。这点我们不需要做了。直接在/sys/class/gpio 可用。
如果你非知道怎么在sysfs中配置,我们再进一步学习交流。

elinux.org/GPIO上写着是这么配置的

Symbol: GPIO_SYSFS [=y]
  Prompt: /sys/class/gpio/... (sysfs interface)
    Defined at drivers/gpio/Kconfig:51
    Depends on: GPIOLIB && SYSFS && EXPERIMENTAL
     Location:
      -> Kernel configuration
        -> Device Drivers
         -> GPIO Support (GPIOLIB [=y])

e.png

f.png
当然,这部分现就不做展开了。别忘了咱们的目的,先入门再说吧。


2 导出我们需要操作并且可用的GPIO口。

3 配置GPIO的direction 为in 或 out。

4 配置GPIO作为中断源(如果有需要) 。需要配置上下沿触发rising, falling,或者both,即两者都触发中断。
注意:如果配置了GPIO作为中断源,那么程序对于该GPIO的value的读取会一直被阻塞,直到有相应的中断发生。

好了,下面介绍程序部分。
咱们的核心程序是poll()。这里就简单介绍下吧,深入的我也不会了。

//下面的都是个人总结,难免有误。如有错误请指正。

poll函数原型如下:
int poll(struct pollfd fds[], nfds_t nfds, int timeout);

返回值:
-1 表示有错误.一种可能是调用被中断。
0 表示在文件描述符就绪之前调用超时。
>0 表示一个或多个文件描述符就绪,在revents域中可以读取返回值.

参数:
参数fds  文件描述符数组。
它是一个如下结构体
struct pollfd
{
int fd;             /* File descriptor */
short events;   /* Requested events bit mask */
short revents;  /* Returned events bit mask */
};
参数nfds_t  unsigned int类型数据, 表示poll()中共需要轮询处理的文件描述符的个数。
参数timeout 超时时间, 单位毫秒。timeout = -1,则持续等待; timeout=0,直接运行而不等待;timeout>0,则等待timeout时间。

关于pollfd 结构体,也简单介绍下。
events 和revents这两个域都是 bit masks 操作,下表列举了每个域中的各种值。

g.png
第一组的几位和输入事件相关
第二组的几位和输出事件相关
第三组的几位返回的是文件描述符的附加信息。
最后一个位保留

这里可能对POLLIN和POLLPRI疑惑比较大,我当时也是,找了好多资料都没怎么讲到。
就近似这么理解吧:
POLLPRI用于高优先级数据输入,也就是紧急数据的读物,POLLIN处理的是普通数据。

补充:
blog.csdn.net/jnu_simba/article/details/8806654
这篇博客讲得不错,关于文件描述符的。下面摘录其中一部分:

用户程序不能直接访问内核中的文件描述符表,而只能使用文件描述符表的索引 (即0 1 2 3 ...),这些索引就称为文件描述符(File Descriptor),用int型变量保存。当调用open打开一个文件或创建一个新文件时,内核分配一个文件描述符并返回给用户程序,该文件描述符表项中的指针指向新打开的文件。当读写文件时,用户程序把文件描述符传给read 或write ,内核根据文件描述符找到相应的表项,再通过表项中的指针找到相应的文件。

默认情况下(没有重定向),每个进程的标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)都指向控制终端,因为在程序启动时(在main函数还没开始执行之前)会自动把控制终端打开三次,分别赋给三个FILE*指针stdin、stdout和stderr,这三个文件指针是libc中定义的全局变量,这三个文件的描述符分别是0、1、2,保存在相应的FILE结构体中。进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示器上。头文件unistd.h 中有如下的宏定义来表示这三个文件描述符:
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2


好了,有了前面的铺垫,上代码。
改编自BridgeRun的源程序。
源程序在这里 Gpio-int-test.rar (2.03 KB, 下载次数: 40)
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2014-1-15 10:19 | 显示全部楼层
嘿嘿  看到楼主的帖 盼着看下一集了

点评

谢谢。我发帖总要改几次,显得比较慢。不过,又进步了一点。  详情 回复 发表于 2014-1-15 19:24

不管是哪年,都要加油!继续为中国电子行业做出小小的贡献吧! 扣扣 1206973913



回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-1-15 17:25 | 显示全部楼层
给力的楼主 哈哈

点评

谢谢支持。  详情 回复 发表于 2014-1-15 18:34


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2014-1-15 18:34 | 显示全部楼层
wk123 发表于 2014-1-15 17:25
给力的楼主 哈哈

谢谢支持。
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2014-1-15 19:24 | 显示全部楼层
soso 发表于 2014-1-15 10:19
嘿嘿  看到楼主的帖 盼着看下一集了

谢谢。我发帖总要改几次,显得比较慢。不过,又进步了一点。
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

1186

TA的帖子

3

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2014-1-15 20:03 | 显示全部楼层


回复

使用道具 举报

2143

TA的帖子

24

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2014-1-15 20:10 | 显示全部楼层
你是干劲十足啊,可惜我是归心似箭

点评

我这也是把之前学的东西趁着放假前整理出来,年后就真的什么都忘了。哈哈。  详情 回复 发表于 2014-1-15 21:44


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2014-1-15 21:44 | 显示全部楼层
shower.xu 发表于 2014-1-15 20:10
你是干劲十足啊,可惜我是归心似箭

我这也是把之前学的东西趁着放假前整理出来,年后就真的什么都忘了。哈哈。
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-8-4 15:11 | 显示全部楼层
看了都很给力


回复

使用道具 举报

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

关闭

站长推荐上一条 1/8 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-10 14:11 , Processed in 0.285637 second(s), 34 queries , Gzip On, MemCache On.

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