什么是GPIO

 

一、什么是GPIO?
GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。
接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。
    在实际的MCU中,GPIO是有多种形式的。比如,有的数据寄存器可以按照位寻址,有些却不能按照位寻址,这在编程时就要区分了。比如传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,很多mcu把glue logic等集成到芯片内部,增强了系统的稳定性能,比如GPIO接口除去两个标准寄存器必须具备外,还提供上拉寄存器,可以设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设计中,外围电路就可以简化不少。
  
另外需要注意的是,对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。
举个例子,比如像寄存器A(地址假定为0x48000000)写入数据0x01,那么就可以这样设置了。
#define A (*(volatile unsigned long *)0x48000000)
...
     A = 0x01;
...
    这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。上述表达式拆开来分析,首先(volatile unsigned long *)0x48000000的意思是把0x48000000强制转换成volatile unsigned long类型的指针,暂记为p,那么就是#define A *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作。
  
二、S3C2410的GPIO的特点
    s3c2410的GPIO有117pin,下面应该到9 IO ports看看详细部分了。
The S3C2410X has 117 multi-functional input/output port pins. The ports are:
— Port A (GPA): 23-output port
— Port B (GPB): 11-input/output port
— Port C (GPC): 16-input/output port
— Port D (GPD): 16-input/output port
— Port E (GPE): 16-input/output port
— Port F (GPF): 8-input/output port
— Port G (GPG): 16-input/output port
— Port H (GPH): 11-input/output port
    这么多的IO口,其实很多是复合功能的,既可以作为普通的IO口使用,也可以作为特殊外设接口。在程序设计时,要对整体的资源有所规划,初始化时就应该把所有资源安排合理。这样才会避免出现问题。
    现在的8个端口,其寄存器是相似的。除了两个通用寄存器GPxCON、GPxDAT外,还提供了GPxUP用于确定是否使用内部上拉电阻(其中x为A-H,需要注意的是没有GPAUP)。应用的主要步骤就是:
    ·设置GPIO控制寄存器GPxCON
    ·设置GPIO上拉寄存器GPxUP
初始化完成后,就可以通过对GPxDAT的操作来实现相应的应用了。其中,PORT A与PORT B-H在功能选择方面有所不同,GPACON的每一位对应一根引脚(共23pin有效)。当某位设为0,相应引脚为输出引脚,此时往GPADAT中写0/1,可以让引脚输出低电平/高电平;当某位设为1,则相应引脚为地址线,或者用于地址控制,此时GPADAT没有用了。
一般而言,GPACON通常全设为1,以便访问外部存储器件。PORT B-H在寄存器操作方面完全相同。
GPxCON中每两位控制一根引脚:00表示输入,01表示输出,10表示特殊功能,11保留。GPxDAT用于读/写引脚:当引脚设为输入时,读此寄存器可知相应引脚状态是高/低;当引脚设为输出时,写此寄存器相应位可以使相应引脚输出低电平或高电平。GPxUP:某位设为0,相应引脚无内部上拉;为1,相应引脚使用内部上拉。关于特殊功能,那就得结合特殊外设来进行设置了。

 

在 Linux 系统中,GPIO(General Purpose Input/Output,通用输入输出)是一种通用的引脚接口,可以由用户程序控制其高低电平状态或检测外部信号。为了在用户空间操作 GPIO,需要通过 `sysfs` 接口导出(export)特定的 GPIO 引脚。 ### GPIO Export 的作用 1. **资源管理**:导出 GPIO 是为了让内核知道某个 GPIO 正在被用户空间程序使用,从而进行初始化和资源分配[^1]。 2. **安全访问**:通过 `sysfs` 接口导出 GPIO 可以确保对硬件资源的安全访问,防止多个进程同时修改同一个 GPIO。 3. **系统化配置**:提供了一种标准化的方法来配置 GPIO 的方向(输入/输出)、初始值以及中断功能等。 ### 使用方法 #### 1. 导出 GPIO 要导出一个 GPIO 引脚,可以通过向 `/sys/class/gpio/export` 文件写入对应的 GPIO 编号实现: ```bash echo <gpio_number> > /sys/class/gpio/export ``` 例如,导出编号为 52 的 GPIO: ```bash echo 52 > /sys/class/gpio/export ``` 成功导出后,会在 `/sys/class/gpio/` 目录下生成一个新的子目录 `gpio<gpio_number>`,如 `gpio52`。 #### 2. 设置 GPIO 方向 导出后,需要设置该 GPIO 的方向(输入或输出): ```bash echo "in" > /sys/class/gpio/gpio<gpio_number>/direction # 或者 echo "out" > /sys/class/gpio/gpio<gpio_number>/direction ``` 示例: ```bash echo "out" > /sys/class/gpio/gpio52/direction ``` #### 3. 读取或写入 GPIO 值 对于输出方向,可以通过以下命令设置高电平(1)或低电平(0): ```bash echo 1 > /sys/class/gpio/gpio<gpio_number>/value ``` 对于输入方向,可以读取当前值: ```bash cat /sys/class/gpio/gpio<gpio_number>/value ``` #### 4. 配置中断功能(可选) 如果需要使用 GPIO 的中断功能,可以设置触发类型: ```bash echo "rising" > /sys/class/gpio/gpio<gpio_number>/edge # 或者 "falling", "both", "none" ``` 这样可以在用户空间监听该 GPIO 的边沿变化事件。 #### 5. 解除导出(unexport) 当不再需要使用某个 GPIO 时,可以解除导出: ```bash echo <gpio_number> > /sys/class/gpio/unexport ``` 示例: ```bash echo 52 > /sys/class/gpio/unexport ``` ### 示例代码(Shell 脚本) 以下是一个完整的 Shell 脚本示例,展示如何导出、设置并操作 GPIO: ```bash #!/bin/bash GPIO_NUMBER=52 # 导出 GPIO echo $GPIO_NUMBER > /sys/class/gpio/export # 设置方向为输出 echo "out" > /sys/class/gpio/gpio$GPIO_NUMBER/direction # 设置高电平 echo 1 > /sys/class/gpio/gpio$GPIO_NUMBER/value # 等待 1 秒钟 sleep 1 # 设置低电平 echo 0 > /sys/class/gpio/gpio$GPIO_NUMBER/value # 解除导出 echo $GPIO_NUMBER > /sys/class/gpio/unexport ``` ### 注意事项 - 在某些嵌入式平台(如 Toradex Colibri iMX7)上,GPIO 编号可能需要根据数据手册计算得出[^2]。 - 操作 GPIO 通常需要 root 权限,因此执行上述命令时可能需要使用 `sudo`。 - `sysfs` 接口在较新的 Linux 内核版本中逐渐被 `character device` 接口替代,但仍然广泛支持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值