6483|6

1560

帖子

24

TA的资源

五彩晶圆(初级)

楼主
 

BB Black 入门基础之初识GPIO [复制链接]

本帖最后由 lonerzf 于 2014-1-15 09:05 编辑

今天的任务不是很多,主要也就介绍下如何简单操作GPIO口工作,并且点亮LED灯。
建议操作前先把 BeagleBone Black 系统参考手册看一遍。不多,一会儿就看完了。

直接上正题。
我们要做的LED灯小电原理图如下


没错,今天就要对GPIO_12这个IO口进行控制。请做好准备,不管是面包板还是万用板,反正赶紧搭起来就对了。{:soso_e120:}

下面把P8 P9的IO口贴出来吧。



今天我们要对P8口的GPIO1_12进行操作。3V3和GND也是板子提供的。
注意:
为了在linux下操作某一引脚, 引脚值通常为 通道号x32+该通道上的引脚编号。
这里GPIO1_12为例,就是 1x32+12 =44.
关于GPIO,大家可以参考Linux的gpio接口手册。也就是说Linux下基本上也是差不多这么操作GPIO口的,就像下面这些代码(摘自Linux gpio.txt)。
/sys/class/gpio/
        "export" ... Userspace may ask the kernel to export control of
                a GPIO to userspace by writing its number to this file.
                Example:  "echo 19 > export" will create a "gpio19" node
                for GPIO #19, if that's not requested by kernel code.
        "unexport" ... Reverses the effect of exporting to userspace.
                Example:  "echo 19 > unexport" will remove a "gpio19"
                node exported using the "export" file.

相关操作函数
        /* export the GPIO to userspace */
        int gpio_export(unsigned gpio, bool direction_may_change);

        /* reverse gpio_export() */
        void gpio_unexport();

        /* create a sysfs link to an exported GPIO node */
        int gpio_export_link(struct device *dev, const char *name,
                unsigned gpio);

        /* change the polarity of a GPIO node in sysfs */
        int gpio_sysfs_set_active_low(unsigned gpio, int value);

我们这里操作系统已经封装好啦,各位就不要纠结再往下的东西了.以后用到了再深入也不急嘛。
gpio接口手册链接在这里(论坛放链接需要审核,而我写帖子总会修改几次,这里就不给管理员们添麻烦了{:soso_e100:})。


然后看看它们都在哪里。


好了。硬件部分就介绍到这里。

下面看我们如何对BB Black操作的


  1. cd /sys/class/gpio/         进入GPIO文件夹
复制代码
可以看到,该文件夹下有 文件或文件夹 export  gpiochip0  gpiochip32  gpiochip64  gpiochip96  unexport
只有四个GPIOCHIP,其他的没有啊,那没有我们怎么操作呢?
不急,我们这么操作。
  1. echo 44 > export
复制代码
这样就新建了一个引脚值为44的GPIOCHIP文件夹。
  1. cd gpio44/
复制代码
然后发现有这几个文件/文件夹
active_low  direction  edge  power  subsystem  uevent  value
先确定方向direction,这里参数应该是out或in。或者你要是不守规矩的,high或者low也勉强可以用。。。
  1. echo out > direction
复制代码
这里其他几个文件就先不介绍了,老实说,我们不是很清楚,用到了的时候再说吧。有同学知道的补充下啊。{:soso_e100:}

然后就是IO口的开关了。
  1. echo 1 > value            //IO口置高
  2. echo 0 > value            //IO口置低
复制代码
操作截图如下:


上实物图:
我这条件差是差了点,但好在这些基本的东西还是有的。






那个代码添加功能太折腾人,我这就不用了。各位辛苦一下,自个粘贴复制。
eclipse 里边写一个 IO口闪烁的函数。

#define MAX 64

int gpioLEDFlash(int gpioPin, int times)
{
FILE* LEDHandle = NULL;
char setValue[4], GPIONum[4], GPIOValue[MAX], GPIODirection[MAX];
cout<< "GPIO LED Flash Pin:" << gpioPin << " Start" << endl;

sprintf(GPIONum, "%d", gpioPin); //IO口的值 咱们之前用的是44对吧?
sprintf(GPIOValue, "/sys/class/gpio/gpio%d/value", gpioPin);//要追加的文本
sprintf(GPIODirection, "/sys/class/gpio/gpio%d/direction", gpioPin);//IO口操作方向

//export the gpio pin
if( ( LEDHandle = fopen("/sys/class/gpio/export", "ab") ) == NULL) //使用该IO口
{
  printf("cannot export gpio pin.\n");
  return -1;
}
strcpy(setValue, GPIONum);
fwrite(&setValue, sizeof(char), sizeof(setValue) - 1 , LEDHandle); //这里其实就是导出要使用的IO口,同 echo 44 > export .简单吧,嘿嘿。
fclose(LEDHandle);

//set the direction of the gpio pin
if( ( LEDHandle = fopen(GPIODirection, "rb+") ) == NULL)
{
  printf("cannot open direction handle.\n");
  return -2;
}
strcpy(setValue, "out");
fwrite(&setValue, sizeof(char), sizeof(setValue) - 1, LEDHandle); //不用多说了,配置IO方向。
fclose(LEDHandle);

//Flash the LED times
times *= 2; //为什么要*2,一亮一灭是一个循环。
for(int i = 0; i<= times; i ++)
{
  if( ( LEDHandle = fopen(GPIOValue, "rb+") ) == NULL ) //更不必多说,value 0/1
  {
   printf("cannot open value handle.\n");
   return -3;
  }
  if(i%2 == 0)
  {
   strcpy(setValue, "0");
  }
  else
  {
   strcpy(setValue, "1");
  }
  fwrite(&setValue, sizeof(char), sizeof(setValue) - 1, LEDHandle);
  fclose(LEDHandle);
  sleep(1);
}

//Unexport the pin
if( (LEDHandle = fopen("/sys/class/gpio/unexport", "ab")) == NULL) //回收该GPIO
{
  printf("cannot unexport the GPIO pin.\n");
  return -4;
}
strcpy(setValue, GPIONum);
fwrite(&setValue, sizeof(char), sizeof(setValue) - 1, LEDHandle);
fclose(LEDHandle);
cout<< "GPIO LED Flash Pin:" << gpioPin << " End." << endl;
return 0;
}


然后主函数调用

int main()
{
gpioLEDFlash(44, 10);//循环10次
return 0;
}

运行结果


这个视频就不放了吧。
效果就在附件里。 LED VID.rar (7.31 MB, 下载次数: 53)

注意,需要使用管理员权限,如果想要调试,请用root用户登录。




今天计先到这里吧。有问题的地方欢迎批评指正。{:soso_e100:}


最新回复

楼主用的调试程序的软件是啥  有木有在linux下调试程序的软件  推荐个呗  谢楼主啦  详情 回复 发表于 2014-1-15 17:23

赞赏

2

查看全部赞赏

点赞 关注(1)
个人签名这孩子,成熟的象征,理智的典范。
 

回复
举报

1560

帖子

24

TA的资源

五彩晶圆(初级)

沙发
 
额,还没写完呢就给好评啦。代码都没贴出来。不过还是谢谢shower.xu qinkaiabc两位给我加分。{:soso_e100:}
个人签名这孩子,成熟的象征,理智的典范。
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

板凳
 
俺一直在跟着你学呢,{:soso_e112:}{:soso_e179:}{:soso_e179:}

点评

哈哈,谢谢支持。有问题的地方请务必指出,一起学习,一起进步。  详情 回复 发表于 2014-1-15 09:00
 
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

4
 
ou513 发表于 2014-1-15 08:30
俺一直在跟着你学呢,

哈哈,谢谢支持。有问题的地方请务必指出,一起学习,一起进步。
个人签名这孩子,成熟的象征,理智的典范。
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

5
 
楼主 感谢哈  有一个问题  就是export gpio后 在响应的gpio文件夹下会有个edge文件  这个是配置gpio中断的 把gpio中断配置为input模式 再配置gpio的中断了触发方式 就可以使用中断了  但是中断即便触发了 也没有相应的中断处理程序  怎么给这个gpio弄上相应的中断处理程序   这个问题我在弄 有成果了也贴出来
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

6
 
楼主用的调试程序的软件是啥  有木有在linux下调试程序的软件  推荐个呗  谢楼主啦

点评

不是eclipse +gdb吗?或者你也可以用Qt。  详情 回复 发表于 2014-1-15 17:51
 
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

7
 
wk123 发表于 2014-1-15 17:23
楼主用的调试程序的软件是啥  有木有在linux下调试程序的软件  推荐个呗  谢楼主啦

不是eclipse +gdb吗?或者你也可以用Qt。
个人签名这孩子,成熟的象征,理智的典范。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表