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的位的引脚设置为输入


  • 相关阅读:
    对于dll(动态链接库)的理解
    Java中异常发生时代码执行流程
    使用Gitea搭建git服务
    python-grpc
    Docker环境变量设置
    pandas操作excel
    docker笔记
    flask笔记
    索引原理
    视图、触发器、事务、存储过程
  • 原文地址:https://www.cnblogs.com/qinkai/p/2431527.html
Copyright © 2011-2022 走看看