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