Fork me on GitHub
0%

GPIO

简介

GPIO:General Purpose Input Output,通用输入输出,简称为“IO口”,芯片与外围设备交互的硬件接口

基本结构

以下图片来自STM32的GPIO硬件电路图

image

施密特触发器:在正向递增和负向递减两个方向有不同的阈值,有一定的抗干扰能力,外部的小扰动不会导致cpu误判,直至剧烈变化或者真的有电平的变化。

工作模式

输入(4)

  1. 浮空输入:多用于外部按键输入,io状态不确定完全由外部输入决定
  2. 上拉输入:IO口输入设定为高电平输入(1),检测低电平或下降沿
  3. 下拉输入:IO口输入设定为低电平输入(0)
  4. 模拟输入:ADC模拟输入,测量外部电压幅值不通过TTL

输出(4)

  1. 推挽输出:输出高低电平
  2. 开漏输出:只有一个NMOS导通,只能输出低电平+高阻态,不能输出高电平;当NMOS导通输出低电平,截至输出高阻态。用作线与,电平不匹配的场合,外部上拉
  3. 复用推挽输出:需要输出高低电平的其他模式,如:spi uart
  4. 复用开漏输出:普通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
2
3
4
5
6
导出节点:  echo 20 > /sys/class/gpio/export
设置方向: echo [out / in] > /sys/class/gpio/gpio20/direction
设置值: echo [0 / 1] > sys/class/gpio/gpio19/value
设置触发模式:echo [none / rising / falling / both] > sys/class/gpio/gpio19/edge
翻转属性: echo [0 / 1] > sys/class/gpio/gpio19/active_low
移除节点: echo 20 > /sys/class/gpio/unexport

注意事项

  • direction
    如果内核不支持改变 GPIO 的方向,或者在导出时内核代码没有明确允许用户空间可以重新配置 GPIO 方向, 那么这个属性将不存在。
  • value
    输出时,控制高低电平;输入时,获取高低电平
  • edge
    控制中断触发模式,引脚被配置为中断后可以使用poll() 函数监听引脚
    非中断引脚、上升沿触发、下降沿触发、边沿触发
  • active_low
    用于翻转电平,当外部有效信号与GPIO有效信号不一致(即0可能表示有效,1也有可能表示有效)

查看GPIO配置

不同的厂商对于GPIO配置结果的查看方式有所不同,以下以Ingenic-x2000为例对应相关的手册可以确定相应的IO状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/# cat /sys/devices/platform/apb/10010000.pinctrl/dump_gpio

// 结果如下图, 下面会有每一个GPIO状态
REG |+++GPA++|+++GPB++|+++GPC++|+++GPD++|

INL |0c3fffff|67f6036f|0110fef4|0f7fffff|
INT |02b00000|30440000|00000081|00000100|
MSK |194fcfff|ce0a0040|74ff0076|003ffeff|
PAT1 |0265cfff|f6440000|77efc0fb|003ffbff|
PAT0 |0f8a3000|1033efc0|88100005|00000400|
EDG |3fffff00|f6037f00|10fff400|7fffff00|
PLUP |14000000|41800000|00200001|00000100|
PLDWN |00000000|800000c0|00100002|00000000|
FLAG |00000000|00000000|00000000|00000000|

相关功能

在低功耗场景下,系统休眠以后部分硬件时钟可能关闭。但是GPIO不依赖时钟,故可以配置IO作为中断源对CPU进行唤醒