如何实现gpio口模式的配置

如何实现gpio口模式的配置,第1张

一、 STM32的输入输出管脚有下面8种(4输入 2输出 2复用输出)可能的配置:\x0d\\x0d\ ① 浮空输入_IN_FLOATING\x0d\\x0d\ ② 带上拉输入_IPU \x0d\\x0d\ ③ 带下拉输入_IPD \x0d\\x0d\ ④ 模拟输入_AIN\x0d\\x0d\ ⑤ 开漏输出_OUT_OD \x0d\\x0d\ ⑥ 推挽输出_OUT_PP\x0d\\x0d\ ⑦ 复用功能的推挽输出_AF_PP\x0d\\x0d\ ⑧ 复用功能的开漏输出_AF_OD\x0d\\x0d\ 11 I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口 的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。\x0d\\x0d\ 输出速度又称输出驱动电路的响应速度,可理解为:输出驱动电路的带宽,即一个驱动电路可以不失真地通过信号的最大频率。\x0d\\x0d\ 如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。如果信号频率为10MHz,而你配置了2MHz的带宽,则10MHz的方波很可能就变成了正弦波。就好比是公路的设计时速,汽车速度低于设计时速时,可以平稳地运行,如果超过设计时速就会颠簸,甚至翻车。\x0d\\x0d\ 关键是: GPIO的引脚速度跟应用相匹配,速度配置越高,噪声越大,功耗越大。\x0d\\x0d\ 带宽速度高的驱动器耗电大、噪声也大,带宽低的驱动器耗电小、噪声也小。使用合适的驱动器可以降低功耗和噪声。\x0d\ GPIO的引脚速度跟应用匹配(推荐10倍以上)。比如:\x0d\\x0d\ 111 对于串口,假如最大波特率只需1152k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。\x0d\\x0d\ 112 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。\x0d\\x0d\ 113 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。\x0d\\x0d\ 12 GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。\x0d\\x0d\ 13 在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。\x0d\\x0d\ 14 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。\x0d\\x0d\ 15 GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。\x0d\\x0d\二、GPIO的翻转速度指:输入/输出寄存器的0 ,1 值反映到外部引脚(APB2上)高低电平的速度手册上指出GPIO最大翻转速度可达18MHz。通过简单的程序测试,用示波器观察到的翻转时间是综合的时间,包括取指令的时间、指令执行的时间、指令执行后信号传递到寄存器的时间(这其中可能经过很多环节,比如AHB、APB、总线仲裁等),最后才是信号从寄存器传输到引脚所经历的时间。如有上拉电阻,其阻值越大,RC延时越大,即逻辑电平转换的速度越慢,功耗越大。 \x0d\\x0d\三、在STM32中如何配置片内外设使用的IO端口\x0d\\x0d\ 首先,一个外设经过 ①配置输入的时钟和 ②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。\x0d\\x0d\ 对应到外设的输入输出功能有下述三种情况:\x0d\\x0d\ ① 外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。\x0d\ ② 外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。\x0d\ ③ ADC对应的管脚:配置管脚为模拟输入。\x0d\\x0d\ 如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。\x0d\\x0d\四、 通用IO端口(GPIO)初始化\x0d\\x0d\ 41 GPIO初始化\x0d\\x0d\ 411 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能APB2总线外设时钟;\x0d\\x0d\ 412 RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位。\x0d\\x0d\ 42 置各个PIN端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)。\x0d\\x0d\ 43GPIO初始化完成。\x0d\\x0d\五、 的GPIO *** 作函数\x0d\\x0d\uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);//读GPIO某一位的输入\x0d\\x0d\uint16_t GPIO_ReadInputData(GPIO_TypeDef GPIOx);//读GPIO的输入\x0d\\x0d\uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);//读GPIO某一位的输出\x0d\\x0d\uint16_t GPIO_ReadOutputData(GPIO_TypeDef GPIOx);//读GPIO的输出\x0d\\x0d\void GPIO_SetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);//将GPIO的某个位置位\x0d\\x0d\void GPIO_ResetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);//将GPIO的某个位复位\x0d\\x0d\void GPIO_WriteBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//写GPIO的某个位\x0d\\x0d\void GPIO_Write(GPIO_TypeDef GPIOx, uint16_t PortVal);//写GPIO\x0d\\x0d\ 六、管脚的复用功能 重映射\x0d\\x0d\1、复用功能:内置外设是与I/O口共用引出管脚(不同的功能对应同一管脚)\x0d\\x0d\STM32 所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。\x0d\\x0d\2、重映射功能:复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功 能的引出脚位是可通过程序改变到其他的引脚上!\x0d\\x0d\直接好处:PCB电路板的设计人员可以在需要的情况下,不必把某些信号在板上绕一大圈完成联接,方便了PCB的设计同时潜在地减少了信号的交叉干扰。\x0d\\x0d\如:USART1: 0: 没有重映像(TX/PA9,RX/PA10); 1: 重映像(TX/PB6,RX/PB7)。\x0d\\x0d\(参考AFIO_MAPR寄存器介绍)[0,1为一寄存器的bit值]\x0d\\x0d\注 下述复用功能的引出脚具有重映射功能:\x0d\\x0d\ - 晶体振荡器的引脚在不接晶体时,可以作为普通I/O口\x0d\\x0d\ - CAN模块; - JTAG调试接口;- 大部分定时器的引出接口; - 大部分USART引出接口\x0d\\x0d\ - I2C1的引出接口; - SPI1的引出接口;\x0d\\x0d\举例:对于STM32F103VBT6,47引脚为PB10,它的复用功能是I2C2_SCL和 USART3_TX,表示在上电之后它的默认功能为PB10,而I2C2的SCL和USART3的TX为它的复用功能;另外在TIM2的引脚重映射后,TIM2_CH3也成为这个引脚的复用功能。\x0d\\x0d\(1)要使用STM32F103VBT6的47、48脚的USART3功能,则需要配置47脚为复用推挽输出或复用开漏输出,配置48脚为某种输入模式,同时使能USART3并保持I2C2的非使能状态。\x0d\\x0d\(2)使用STM32F103VBT6的47脚作为TIM2_CH3,则需要对TIM2进行重映射,然后再按复用功能的方式配置对应引脚。

STM32F1的IO口模式有很多种,需要按照设计进行配置,IO的 *** 作还是比较简单的

STM32的内部IO口结构为:

寄存器的配置说明:

寄存器的复位值为:0X4444 4444(0100 0100 0100 0100 0100 0100 0100 0100),

即IO口默认为浮空输入,

STM32 的 CRL 控制着每组 IO 端口(A~G)的低 8 位的模式。

每个 IO 端口的位占用 CRL 的 4 个位,高两位为 CNF,低两位为 MODE。这里我们可以记住几个常用的配置,比如 0X0 表示模拟输入模式(ADC 用)、0X3 表示推挽输出模式(做输出口用,50M 速率)、0X8 表示上/下拉输入模式(做输入口用)、0XB 表示复用输出(使用 IO 口的第二功能,50M 速率)。

GPIO 相关的函数和定义分布在固件库文件stm32f10x_gpioc 和头文件stm32f10x_gpioh 文件中。

  void GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_InitStruct); //初始化

 这个函数有两个参数,第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。

  GPIO口的结构体为:

    typedef struct

{

  uint16_t GPIO_Pin;            /!< Specifies the GPIO pins to be configured

                                              This parameter can be any value of @ref GPIO_pins_define /

  GPIOSpeed_TypeDef GPIO_Speed;  /!< Specifies the speed for the selected pins

                                                    This parameter can be a value of @ref GPIOSpeed_TypeDef /

  GPIOMode_TypeDef GPIO_Mode;    /!< Specifies the operating mode for the selected pins

                                                    This parameter can be a value of @ref GPIOMode_TypeDef /

}GPIO_InitTypeDef;/ /端口,速度,模式

初始化过程:

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructureGPIO_Pin = GPIO_Pin_5; //LED0-->PB5 端口配置

GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz; //速度50MHz

GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数配置 GPIO

关于GPIO口的几种 *** 作说明:

1、uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin)

比如我要读 GPIOA5 的电平状态,那么方法是:

GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); //返回值为1或0

2、void GPIO_Write(GPIO_TypeDef GPIOx, uint16_t PortVal);

//BSRR 寄存器是端口位设置/清除寄存器

该函数一般用来往一次性一个 GPIO 的多个端口设值。

如GPIOA->BSRR=1<<1; //GPIOA的第一个端口设置为1

3、void GPIO_SetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);

      void GPIO_ResetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) ;

//BRR 寄存器是端口位清除寄存器。

如: GPIO_SetBits(GPIOB, GPIO_Pin_5); //输出1

        GPIO_ResetBits (GPIOB, GPIO_Pin_5); //输出0

所以最后的程序为:

H文件:定义

#ifndef __LED_H

#define __LED_H

#include "commonh"

#include "stm32f10xh"

#define ON  0

#define OFF 1

//宏定义

#define LED0(a) if (a) \

GPIO_SetBits(GPIOG,GPIO_Pin_13);\

else \

GPIO_ResetBits(GPIOG,GPIO_Pin_13)

#define LED1(a) if (a) \

GPIO_SetBits(GPIOG,GPIO_Pin_14);\

else \

GPIO_ResetBits(GPIOG,GPIO_Pin_14)

#define LED2(a) if (a) \

GPIO_SetBits(GPIOG,GPIO_Pin_15);\

else \

GPIO_ResetBits(GPIOG,GPIO_Pin_15)

void LED_Init(void);//初始化

#endif

C文件:初始化 *** 作

#include "ledh" 

void LED_Init(void)

{   

  GPIO_InitTypeDef  GPIO_InitStructure;//IO口结构体

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);//IO口时钟使能

  GPIO_InitStructureGPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;//IO口管脚

  GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_PP; //输出模式

  GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;//输出速度

  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化

  GPIO_SetBits(GPIOG,GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);//默认值

}

主函数main:执行 *** 作

#include "ledh"

#include "commonh"

int main(void)

{

delay_init();//延时函数初始化,其他C文件中定义

 LED_Init();     //初始化

while(1)

{

LED0(0);    // *** 作

delay_ms(500);

LED0(1);

delay_ms(500);

 }

}

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

短接方式

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

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

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

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

上拉/下拉电阻方式

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

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

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

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

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

GPIO的功能描述

每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。

GPIO端口的每个位可以由软件分别配置成多种模式。

-输入浮空

-输入上拉

-输入下拉

-模拟输入

-开漏输出

-推挽式输出

-推挽式复用功能

-开漏复用功能

每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。

下图给出了一个I/O端口位的基本结构。

姓名:杨秀青 学号:21011210121 学院:通信工程学院

转自 Cortex-M3里GPIO几个概念必须搞清楚 - ARM技术论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfanscom)

嵌牛导读本文会对 Cortex-M3里GPIO几个概念 进行介绍

嵌牛鼻子GPIO 输入输出 配置

嵌牛提问GPIO常见的输入输出有哪些特点以及配置是怎样的呢?

嵌牛正文

最近在看 数据手册 的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多:

(1)GPIO_Mode_AIN 模拟输入

(2)GPIO_Mode_IN_FLOA ti NG 浮空输入

(3)GPIO_Mode_IPD 下拉输入

(4)GPIO_Mode_IPU 上拉输入

(5)GPIO_Mode_Out_OD 开漏输出

(6)GPIO_Mode_Out_PP 推挽输出

(7)GPIO_Mode_AF_OD 复用开漏输出

(8)GPIO_Mode_AF_PP 复用推挽输出

对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总结:

一、推挽输出: 可以输出高、低电平,连接数字器件;推挽结构一般是指两个 三极管 分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的 电源 决定。

推挽 电路 是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形 放大 任务,电路工作时,两只对称的功率 开关 管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

二、开漏输出: 输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点:

1、利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经上拉电阻、MOSFET到GND。IC内部仅需很小的栅极驱动电流。

2、一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变 传输 电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的速度。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)

3、开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小 时延 时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

4、可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系,即“线与”。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。

关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS ;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。

三、浮空输入: 对于浮空输入,一直没找到很权威的解释,只好从以下图中去理解了

由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。

四、上拉输入/下拉输入/模拟输入: 这几个概念很好理解,从字面便能轻易读懂。

五、复用开漏输出、复用推挽输出: 可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)

六、总结在 STM32 中选用IO模式

1、浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1

2、带上拉输入GPIO_IPU——IO内部上拉电阻输入

3、带下拉输入GPIO_IPD—— IO内部下拉电阻输入

4、模拟输入GPIO_AIN ——应用ADC模拟输入,或者低功耗下省电

5、开漏输出GPIO_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能

6、推挽输出GPIO_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的

7、复用功能的推挽输出GPIO_AF_PP ——片内外设功能(I2C的SCL,SDA)

8、复用功能的开漏输出GPIO_AF_OD——片内外设功能(TX1,MOSI,MISOSCKSS)

七、STM32设置实例:

1、模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

2、如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD;

八、通常有5种方式使用某个引脚功能,它们的配置方式如下:

1、作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。

2、作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。

3、作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。

4、作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。

5、作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。

注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。比如要使用STM32F103VBT6的47、48脚的USART3功能,则需要配置47脚为复用推挽输出或复用开漏输出,配置48脚为某种输入模式,同时使能USART3并保持I2C2的非使能状态。如果要使用STM32F103VBT6的47脚作为TIM2_CH3,则需要对TIM2进行重映射,然后再按复用功能的方式配置对应引脚。

本人只讲思路:(1)首先你要明确你的按键是上拉接法还是下拉接法;(2)要明确按键是输入设备,所以按键接在PA1上,你要根据按键硬件电路的上拉或下拉接法来确定PA1这个GPIO口的输入方式,按键硬件上是上拉接入,PA1就配置上拉输入,同理,下拉对应下拉;(3)然后写程序,首先写GPIO初始化程序:包括使能时钟、输入模式设置、速度设置、上下拉设置;(4)在写按键检测程序之前要明确检测上升沿还是检测下降沿:如果按键在硬件上是上拉接法,则按下按键会产生负脉冲按键信号,按键检测程序则检测下降沿即可。如果是下拉接法,则当按键按下则产生正脉冲按键信号,按键检测程序则检测上升沿即可。(5)根据(4)中所述,写按键检测上升沿或者下降沿的按键检测程序,并且在按键检测程序中应该采用延时程序实现10至20ms的延时处理按键的抖动,目的是为了消除按键产生的机械抖动,专业说法叫做按键的消抖。(6)在按键检测程序内部,当按键检测成功,则执行自己设定的变量自加1的这一行代码。以上六步就可以实现君所需功能。

此篇为 《树莓派使用基础》 中,RPIGPIO Input功能高级应用技巧。GPIO的简单使用请参考博文 树莓派3B+ GPIO输入输出使用

目前有几种途径可以在程序中获得 GPIO 的输入信息。

如果在输入针脚上没有连接任何元件,那么它将是“浮动(float)”的。换句话说,因为没有连接任何元件,在按下按钮或开关之前,读取的值是没有意义的。由于电源的波动,获取到的值可能会有很大的变化。

为了解决这个问题,我们需要使用 上拉/下拉电阻 。这样,我们就可设定输入的默认值了。在这里,可以使用硬件或软件对电阻进行上拉/下拉。使用硬件方式,将一个 10K 的电阻连接在输入通道与 33V(上拉)或 0V(下拉)之间是常用的做法。而 RPiGPIO 也允许您通过软件的方式对配置 Broadcom SOC 来达到目的:

或者

通道编号是基于所使用的编号系统所指定的(BOARD 或 BCM)。

边缘的定义为电信号从 LOW 到 HIGH(上升临界值)或从 HIGH 到 LOW(下降临界值)状态的改变。正常情况下,对于输入的值来说,我们更关心的是输入的状态是否发生了改变。这种状态上的改变是很重要的。

为了避免程序在忙于处理其它的事物时而错过了按下按钮的 *** 作,这里有两种方法可以解决:

在检测到边缘时执行线程回调函数

注意,可以输入 GPIORISING、GPIOFALLING、GPIOBOTH 对边缘进行检测。这种方式的优点是占用 CPU 资源很少,因此系统可以有充裕的资源处理其它事物。

RPiGPIO 在第二条线程中执行回调函数。这意味着回调函数可以同您的主程序同时运行,并且可以立即对边缘进行响应。例如:

如果需要多个回调函数:

注意,在该示例中,回调函数为顺序运行而不是同时运行。这是因为当前只有一个进程供回调使用,而回调的运行顺序是依据它们被定义的顺序。

可能会注意到,每次按钮按下时,回调 *** 作被调用不止一次。这种现象被称作“开关抖动(switch bounce)”。这里有两种方法解决开关抖动问题:

或者

由于某种原因,若不希望程序检测边缘事件,可以将它停止:

原文链接

参考链接

以上就是关于如何实现gpio口模式的配置全部的内容,包括:如何实现gpio口模式的配置、GPIO口的使用——跑马灯、单片机控制系统中,按键应如何连接不同连接方式,配置gpio工作模式时应如何等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10104898.html

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

发表评论

登录后才能评论

评论列表(0条)

保存