简介
GPIO:General Purpose Input Output,通用输入输出,简称为“IO口”,芯片与外围设备交互的硬件接口
基本结构
以下图片来自STM32的GPIO硬件电路图
施密特触发器:在正向递增和负向递减两个方向有不同的阈值,有一定的抗干扰能力,外部的小扰动不会导致cpu误判,直至剧烈变化或者真的有电平的变化。
工作模式
输入(4)
- 浮空输入:多用于外部按键输入,io状态不确定完全由外部输入决定
- 上拉输入:IO口输入设定为高电平输入(1),检测低电平或下降沿
- 下拉输入:IO口输入设定为低电平输入(0)
- 模拟输入:ADC模拟输入,测量外部电压幅值不通过TTL
输出(4)
- 推挽输出:输出高低电平
- 开漏输出:只有一个NMOS导通,只能输出低电平+高阻态,不能输出高电平;当NMOS导通输出低电平,截至输出高阻态。用作线与,电平不匹配的场合,外部上拉
- 复用推挽输出:需要输出高低电平的其他模式,如:spi uart
- 复用开漏输出:普通i2c处于该模式
GPIO寄存器
通用寄存器
以stm32为例
- GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)
- GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A…I)
- GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A…I/)
- GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A…I/)
- GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A…I)
- GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A…I)
- GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A…I)
GPIO Shadow
由于设置某个模式的过程中配置的不只是一个寄存器,配置过程中就可能出现别的状态的产生,导致错误。而使用shadow寄存器,可以先将所有需要配置的寄存器分别设置进去,但不生效,直至全部设置完毕,再指定GPID即要映射的组上去生效!避免了中间非必要状态的产生。
用户层应用
配置GPIO
在内核导出 gpio 节点的前提下, 可以操作/sys/class/gpio 节点, 控制 gpio 输入输出
1 | 导出节点: echo 20 > /sys/class/gpio/export |
注意事项
- direction
如果内核不支持改变 GPIO 的方向,或者在导出时内核代码没有明确允许用户空间可以重新配置 GPIO 方向, 那么这个属性将不存在。 - value
输出时,控制高低电平;输入时,获取高低电平 - edge
控制中断触发模式,引脚被配置为中断后可以使用poll() 函数监听引脚
非中断引脚、上升沿触发、下降沿触发、边沿触发 - active_low
用于翻转电平,当外部有效信号与GPIO有效信号不一致(即0可能表示有效,1也有可能表示有效)
查看GPIO配置
不同的厂商对于GPIO配置结果的查看方式有所不同,以下以Ingenic-x2000为例对应相关的手册可以确定相应的IO状态
1 | / |
相关功能
在低功耗场景下,系统休眠以后部分硬件时钟可能关闭。但是GPIO不依赖时钟,故可以配置IO作为中断源对CPU进行唤醒