【转】GPIO输入与输出设置

【转】GPIO输入与输出设置,第1张

原文链接

GPIO(也称为通用输入/输出)是控制器中最简单也是最重要的配置。但即便如此,IO也有各种各样的类型和配置选项,有输入,输出,上拉,下拉,推挽等。虽然我们天天都和它打交道,但是你真的了解其中的配置吗?

输入模式

通常,GPIO输入主要通过以下三种方式之一进行配置:

● 高阻抗 (Hi-Z,也称为浮动floating)

● 上拉 (Pull-up,内部电阻连接到VCC)

● 下拉 (Pull-down,内部电阻连接到地)

当Input port被处在高阻抗的模式下,若没有外部讯号源进来的话,此时是无法确定port的状态(不能确定现在处在高电位或低电位),除非有外部讯号来驱动电路。换句话说,Input floating,这个Input电位状态完全是由外部讯号来决定,没有讯号驱动的话,就会呈现高阻抗状态。

如果我们需要这个port有一个明确的预设状态时,必须借助pull-up(pull-down)resistor来做调整,在pull-up resistor(pull-up外接高电压,pull-down通常会接地)的作用之下,让port的维持在明确的高电压状态(pull-down则是让port维持在低电压状态)。

至于具体电阻的大小,一般在芯片手册中都有详细的描述。在实际配置中,除了要考虑port口内的上下拉电阻大小,还需要考虑MCU外围电路所带来的影响。

输出模式

GPIO的输出模式,常见的有开漏输出(Open-Drain)、推挽输出(Push-Pull)与开集输出(Open-Collector)。其中开漏输出和开集输出,这两种输出的原理和特性基本是类似的,区别在于一个是使用MOS管,其中的"漏"指的就是MOS管的漏极;另一个使用三极管,其中的"集"指的就是三极管的集电极。这两者其实都是和推挽输出相对应的输出模式,由于使用MOS管的情况较多,很多时候就用"开漏输出"这个词代替了开漏输出和开集输出。

● 推挽输出:一般是指两个MOSFET分别受两互补信号的控制,总是在一个MOS管导通时另一个MOS管截止。(推挽输出的最大特点是可以真正的输出高电平和低电平,且两种电平下都有驱动能力)。

Push - 当连接到晶体管栅极的内部信号(见上图)设置为低逻辑电平(逻辑0)时,PMOS晶体管被激活,电流从VDD流到输出引脚。NMOS晶体管无效(开路)且不导通。

Pull - 当连接到晶体管栅极的内部信号被设置为高逻辑电平(逻辑1)时,NMOS晶体管被激活(闭合)并且电流开始从输出引脚流到GND。同时,PMOS晶体管无效(开路)且不导通电流。看起来推挽输出十分完美,对高低电平都有相当不错的输出能力。但推挽输出的一个缺点是,如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害。这也是为什么推挽输出不能实现" 线与"的原因。

● 开漏输出:顾名思义,就是从MOSFET的漏极输出的电路,要得到高电平状态需要加上拉电阻才行。适合做电流型的驱动,其吸收电流的能力比较强(开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平)。

开漏输出的这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。

开漏输出最常用于通信接口,其中多个器件连接在同一线路上(例如I2C等)。当连接到线路的器件的所有输出都处于Hi-Z状态时,通过上拉将线路驱动到默认逻辑1电平。任何器件都可以使用其开漏输出将线路拉至逻辑0,并且所有器件都可以看到此电平。

FT 5V容忍(33V,可以忍受5V)

推挽输出

可以输出强高低电平,连接数字器件

开漏输出

只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合做电流型的驱动,其吸收电流的能 力相对较强(一般20mA以内)。

每个GPIO端口的寄存器(一共有10个:4个32位配置寄存器,2个32位数据寄存器)

端口模式寄存器 (GPIOx_MODER)

端口输出类型寄存器 (GPIOx_OTYPER)

端口输出速度寄存器 (GPIOx_OSPEEDR)

端口上拉下拉寄存器 (GP|IOx_PUPDR)

端口输入数据寄存器 (GPIOx_IDR)

端口输出数据寄存器 (GPIOx_ODR)

端口置位/复位寄存器 (GPIOx_BSRR)

端口配置锁寄存器 (GPIOx_LCKR)

复用功能寄存器X2 (低位 GPIOx_AFRL & 高位 GPIOx_AFRH)

每组10个寄存器,可控制16位

所有I/O口都可以作为中断输入。

未完待续!

第一段:在OpenWrt中,配置GPIO中断需要在设备树中指定相应的GPIO引脚。这可以通过编辑设备树文件(dts)来完成。在设备树中,需要指定GPIO的编号、中断类型和中断触发方式。

第二段:首先,需要找到设备树中的GPIO节点,通常位于“/soc/gpio@XXX”路径下。在节点中,需要添加“interrupts”属性来定义中断类型和中断触发方式。例如,以下代码表示使用边缘触发方式的下降沿中断:

interrupts = <0 15 2>;

第三段:其中,第一个数字0表示中断类型,0代表使用IRQ号,1代表使用GPIO编号。第二个数字15是中断号,可以在设备树文件中找到。第三个数字2表示边缘触发方式,0表示低电平触发,1表示高电平触发,2表示下降沿触发,3表示上升沿触发。

第四段:完成设备树文件的编辑后,需要重新编译设备树并更新内核。然后,就可以在应用程序中使用GPIO中断了。例如,可以使用GPIO库的gpio_request()函数来请求GPIO资源,然后使用gpio_irq_request()函数注册中断处理函数,最后使用gpio_irq_enable()函数使能中断。在中断处理函数中,可以根据需要执行相应的 *** 作,比如读取GPIO状态、更新数据等。

一、gpio用途

General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,人们利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO产品能够提供额外的控制和监视功能。

每个GPIO端口可通过软件分别配置成输入或输出。Maxim的GPIO产品线包括8端口至28端口的GPIO,提供推挽式输出或漏极开路输出。提供微型3mm x 3mm QFN封装。

不同系统间的GPIO的确切作用不同。通用常有下面几种:

1输出值可写(高=1,低=0)。一些芯片也可以选择驱动这些值的方式,以便支持“线-或”或类似方案(开漏信号线)。

2输入值可读(1,0)。一些芯片支持输出管脚回读,这在线或的情况下非常有用(以支持双向信号线)。GPIO控制器可能具有一个输入防故障/防反跳逻辑,有时还会有软件控制。

3输入经常被用作中断信号,通常是边沿触发,但也有可能是电平触发。这些中断可以配置为系统唤醒事件,从而将系统从低功耗模式唤醒。

4一个GPIO经常被配置为输入/输出双向,根据不同的产品单板需求,但也存在单向的情况。

5大多是GPIO可以在获取到spinlock自旋锁时访问,但那些通过串行总线访问的通常不能如此 *** 作(休眠的原因)。一些系统中会同时存在这两种形式的GPIO。

6在一个给定单板上,每个GPIO用于一个特定的目的,如监控MMC/SD卡的插入/移除,检查卡写保护状态,驱动LED,配置发送器,串行总线位拆,触发一个硬件看门狗,触发一个开关之类的。

二、GPIO使用方法

 

要使用GPIO,系统首先要分配一个GPIO,使用gpio_request() 为系统分配一个GPIO。

接下来要做的一件事是标示GPIO的方向,通常在使用GPIO建立一个platform_device时(位于单板的setup代码中)。

返回0标示成功,或是一个负的errno错误码。它应该被检查,因为get/set调用没有错误返回,且可能会有错误配置。你通常应该在线程上下文中使用这些调用。虽然如此,对于spinlock-safe的GPIO,在tasking使能之前使用也是可以的,作为一个早期的单板建立。

对于输出GPIO,value参数提供了初始输出值。这有助于避免系统启动过程中的信号干扰。

为了与GPIO早期的接口兼容,设置一个GPIO的方向,隐性要求申请GPIO。这个兼容性从可选的gpiolib架构中移除了。

为了与GPIO早期的接口兼容,设置一个GPIO的方向,隐性要求申请GPIO。这个兼容性从可选的gpiolib架构中移除了。

如果GPIO号码无效或是指定的GPIO不能使用对应模式 *** 作的话,设置方向会失败。依靠boot固件设置好GPIO的方向通常不是一个好主意,因为boot的功能可能没有通过验证(除了boot linux)。(类似的,单板setup代码可能需要将管脚复用为一个GPIO,和配置为合适的上拉/下拉)

在单片机控制系统中,按键通常使用GPIO引脚连接,以便单片机能够读取按键的状态并作出相应的响应。按键连接的方式通常有两种:短接方式和上拉/下拉电阻方式。

短接方式

短接方式是将按键连接到单片机的两个相邻的GPIO引脚上,当按键被按下时,两个引脚就会短接在一起,形成一个电路,单片机可以通过检测引脚之间的电平变化来检测按键的状态。这种连接方式需要使用输入模式的GPIO引脚,具体的配置 *** 作如下:

(1)选择相邻的两个GPIO引脚,一个用于连接按键的一端,另一个用于连接按键的另一端。

(2)将这两个GPIO引脚的工作模式设置为输入模式。

(3)为这两个GPIO引脚配置上拉电阻或下拉电阻,以确保在按键未被按下时,GPIO引脚处于稳定状态。

上拉/下拉电阻方式

上拉/下拉电阻方式是将按键连接到单片机的一个GPIO引脚上,并在按键与单片机之间添加一个上拉或下拉电阻。当按键未被按下时,上拉/下拉电阻会使GPIO引脚处于稳定状态,当按键被按下时,GPIO引脚的电平会发生变化,单片机可以检测到按键的状态。这种连接方式需要使用输入模式的GPIO引脚,具体的配置 *** 作如下:

(1)选择一个GPIO引脚用于连接按键。

(2)将这个GPIO引脚的工作模式设置为输入模式。

(3)为这个GPIO引脚配置上拉电阻或下拉电阻,以确保在按键未被按下时,GPIO引脚处于稳定状态。

需要注意的是,配置GPIO工作模式时,应该根据按键连接方式选择适当的工作模式和上拉/下拉电阻配置,以确保按键的正常工作。同时,也应该注意防止按键产生抖动等问题,可以通过软件消抖或硬件滤波等方法来解决。

以上就是关于【转】GPIO输入与输出设置全部的内容,包括:【转】GPIO输入与输出设置、GPIO工作原理、openwrtgpio中断dts配置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9525033.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存