zoukankan      html  css  js  c++  java
  • 什么是GPIO?

    什么是GPIO?
    GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。
    接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。
        在实际的MCU中,GPIO是有多种形式的。比如,有的数据寄存器可以按照位寻址,有些却不能按照位寻址,这在编程时就要区分了。比如传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,很多mcu把glue logic等集成到芯片内部,增强了系统的稳定性能,比如GPIO接口除去两个标准寄存器必须具备外,还提供上拉寄存器,可以设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设计中,外围电路就可以简化不少。
    S3c2410有117pin的GPIO(GPA-GPH),这么多的IO口,其实很多是复合功能的,既可以作为普通的IO口使用,也可以作为特殊外设接口。除第一组只能用于输出外,其他均可以通过写控制寄存器,实现输入/输出和第二功能。
    我们用到的GPIO是GPF,8位的IO。和51单片机差不多,控制8个LED和按键,但要分时设置IO口为输入或者是输出。对IO寄存器的操作是通过读取或写入“/dev/gpf/0”文件来完成的,这是一个GPIO的驱动,写好后加载到内核,才能使GPF工作。
    安装GPF驱动:编译s3c2410-gpf.c(驱动文件)为.o的文件,传到开发板,用insmod载入 insmod s3c2410-gpf.o
    insmod
      Linux指令:insmod——载入模块
      insmod 就是install module的缩写
      功能说明:载入模块。
      语法:insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]
      说明:Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。
      参数:
      -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
      -k 将模块设置为自动卸除。
      -m 输出模块的载入信息。
      -o<模块名称> 指定模块的名称,可使用模块文件的文件名。
      -p 测试模块是否能正确地载入kernel。
      -s 将所有信息记录在系统记录文件中。
      -v 执行时显示详细的信息。
      -x 不要汇出模块的外部符号。
    -X 汇出模块所有的外部符号,此为预设值。

    注意:在开发板上跑的GPIO程序用arm-linux-gcc编译时要加上参数:
    -I/(kernel所在路径)/kernel/include   包含额外的头文件

    常用的函数:open,write,read,close,ioctl

    先打开文件:fd=open(“/dev/gpf/0”,O_RDWR);
    设置IO属性:ioctl(fd,GPIO_SET_MULTI_PIN_IN,0X0F);//低四位为输入
    输入数据:  write(fd,&buf,1); //buf前要加取地址符,只写1个字节
    读出数据:  read(fd,&buf,1);

    ioctl
    函数原型:
    int ioctl(int fd, unsigned long int cmd,n);
    功能:设置I/O设备的属性
    参数:fd : 文件或设备句柄,通常由open函数返回       
            cmd : 驱动程序控制命令
    返回值:成功返回0,失败返回错误码
    相关头文件:<unistd.h>
    参数:GPIO_SET_MULTI_PIN_OUT  将n中为1的位的引脚设置为输出
          GPIO_SET_MULTI_PIN_IN   将n 中为1的位的引脚设置为输入


  • 相关阅读:
    Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
    mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
    mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)
    mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)
    Linux编程 21 shell编程(环境变量,用户变量,命令替换)
    Linux编程 20 shell编程(shell脚本创建,echo显示信息)
    mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)
    Linux编程 19 编辑器(vim 用法)
    (网页)angularjs中的interval定时执行功能(转)
    (网页)在SQL Server中为什么不建议使用Not In子查询(转)
  • 原文地址:https://www.cnblogs.com/qinkai/p/2431527.html
Copyright © 2011-2022 走看看