GPIO(General Purpose Input Output 通用功能输入输出)

第一章 GPIO(General Purpose Input Output 通用功能输入输出)

1.1、GPIO内部结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UuaTcPWW-1672056960969)(assets/1672053591299.png)]

1.2、GPIO可配置功能

1.2.1输入功能

cpu可以获取该gpio的外部电路输入的一个电平状态

输入模式:

  • 浮空输入(Input Floating):不接上拉电阻也不接下拉电阻。

    ​ 上拉电阻: 经过一个小阻值的电阻,接入到VDD
    ​ 下拉电阻: 经过一个小阻值的电阻,接入到VSS(GND)

    ​ 在这种情况下,IO引脚的状态完全由外部输入所决定。

  • 上拉输入(Input pull-up):通过上拉电阻,接入VDD

    ​ 输入引脚内部接一个上拉电阻,
    ​ 此时,IO引脚没有外部输入信号时,CPU也能获得一个 高电平(1),
    ​ 唯有在外部电路输入低电平信号时,CPU读取到的才是低电平(0)。

  • 下拉输入(Input pull-down):通过下拉电阻,接入 VSS

    ​ 输入引脚内部接一个下拉电阻,
    ​ 此时,IO引脚没有外部输入信号时,CPU也能获得一个 低电平(0)。
    ​ 唯有在外部电路输入高电平信号是,CPU读取到的才是高电平(1)。

  • 模拟输入(Input analog):

    ​ 该引脚被设置为模拟输入时,能够获取到模拟信号

1.2.2 输出功能

CPU可以往该GPIO口输出一个电平状态(相当于可以控制外部电路工作状态)

输出模式:

  • 推挽输出(PP:push-pull):

    ​ CPU可以向外部电路输出高电平也可以输出低电平

  • 开漏输出(OD:open-drain):

    ​ 不输出电压.
    ​ CPU写0时,引脚接VSS(GND)
    ​ CPU写1时,悬空 (如果用户接了上拉电阻,则在CPU写1时,IO口会接到用户的上拉电阻上)

1.2.3 复用功能

复用功能是指GPIO口用作其它的外设功能口线

​ 比如:
​ I2C USART SPI等等

1.3 GPIO使用步骤

  • 使能GPIO分组时钟(GPIO分组都是处于AHB1总线上)
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
			用来配置AHB1总线上的外设时钟
			@RCC_AHB1Periph				指定要使能AHB1总线上的哪个外设
				@arg RCC_AHB1Periph_GPIOA:       GPIOA clock
              	@arg RCC_AHB1Periph_GPIOB:       GPIOB clock 
              	@arg RCC_AHB1Periph_GPIOC:       GPIOC clock
              	@arg RCC_AHB1Periph_GPIOD:       GPIOD clock
              	@arg RCC_AHB1Periph_GPIOE:       GPIOE clock
              	@arg RCC_AHB1Periph_GPIOF:       GPIOF clock
              	@arg RCC_AHB1Periph_GPIOG:       GPIOG clock
              	@arg RCC_AHB1Periph_GPIOG:       GPIOG clock
              	@arg RCC_AHB1Periph_GPIOI:       GPIOI clock					
				.....
				
			@NewState					指定该设备的时钟的状态
				ENABLE				使能,为该外设提供时钟
				DISABLE				禁止
				
			例子:使能GPIOE/GPIOF组的时钟
			RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOE,ENABLE);
  • 初始化GPIO

    void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
    			@GPIOx					指定要初始化的GPIO属于哪个组
    				GPIOA/GPIOB....GPIOI
    				
    			@GPIO_InitTypeDef		指向GPIO初始化信息结构体
    				typedef struct
    				{
    					uint32_t GPIO_Pin;
    						//指定要初始化的GPIO引脚(可以位或上多个)
    						#define GPIO_Pin_0                 ((uint16_t)0x0001)  /* Pin 0 selected */
    						#define GPIO_Pin_1                 ((uint16_t)0x0002)  /* Pin 1 selected */
    						#define GPIO_Pin_2                 ((uint16_t)0x0004)  /* Pin 2 selected */
    						#define GPIO_Pin_3                 ((uint16_t)0x0008)  /* Pin 3 selected */
    						#define GPIO_Pin_4                 ((uint16_t)0x0010)  /* Pin 4 selected */
    						#define GPIO_Pin_5                 ((uint16_t)0x0020)  /* Pin 5 selected */
    						#define GPIO_Pin_6                 ((uint16_t)0x0040)  /* Pin 6 selected */
    						#define GPIO_Pin_7                 ((uint16_t)0x0080)  /* Pin 7 selected */
    						#define GPIO_Pin_8                 ((uint16_t)0x0100)  /* Pin 8 selected */
    						#define GPIO_Pin_9                 ((uint16_t)0x0200)  /* Pin 9 selected */
    						#define GPIO_Pin_10                ((uint16_t)0x0400)  /* Pin 10 selected */
    						#define GPIO_Pin_11                ((uint16_t)0x0800)  /* Pin 11 selected */
    						#define GPIO_Pin_12                ((uint16_t)0x1000)  /* Pin 12 selected */
    						#define GPIO_Pin_13                ((uint16_t)0x2000)  /* Pin 13 selected */
    						#define GPIO_Pin_14                ((uint16_t)0x4000)  /* Pin 14 selected */
    						#define GPIO_Pin_15                ((uint16_t)0x8000)  /* Pin 15 selected */
    						#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /* All pins selected */
    
    					GPIOMode_TypeDef GPIO_Mode;
    						//指定要配置的GPIO口的模式
    						GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */
    							输入模式
    						
    						GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */
    							输出模式
    						
    						GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
    							复用模式
    						
    						GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
    							模拟输入模式
    
    					GPIOSpeed_TypeDef GPIO_Speed;
    						//指定要配置的GPIO口的速率
    						#define  GPIO_Speed_2MHz    GPIO_Low_Speed    
    						#define  GPIO_Speed_25MHz   GPIO_Medium_Speed 
    						#define  GPIO_Speed_50MHz   GPIO_Fast_Speed 
    						#define  GPIO_Speed_100MHz  GPIO_High_Speed  
    
    					GPIOOType_TypeDef GPIO_OType;
    						//指定要配置的GPIO口的输出类型
    						GPIO_OType_PP = 0x00,
    							输出推挽
    						
    						GPIO_OType_OD = 0x01
    							输出开漏
    
    					GPIOPuPd_TypeDef GPIO_PuPd;
    						//指定要配置的GPIO口的上下拉选择
    						GPIO_PuPd_NOPULL = 0x00,
    							悬空
    						
    						GPIO_PuPd_UP     = 0x01,
    							上拉
    						
    						GPIO_PuPd_DOWN   = 0x02
    							下拉
    					
    				}GPIO_InitTypeDef;
    				
    		例子:将PF9/PF10配置成输出推挽
    			GPIO_InitTypeDef g;
    			g.GPIO_Pin		= GPIO_Pin_9 | GPIO_Pin_10;
    			g.GPIO_Mode		= GPIO_Mode_OUT;
    			g.GPIO_Speed	= GPIO_Speed_50MHz;
    			g.GPIO_OType	= GPIO_OType_PP;
    			g.GPIO_PuPd		= GPIO_PuPd_NOPULL;
    			GPIO_Init(GPIOF,&g);
    
  • 输入/输出

    1. 输入:从配置好的GPIO引脚中获取外部电路状态

      uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
      				获取指定的GPIO分组输入数据寄存器中的值并通过返回值返回
      					@GPIOx			指定GPIO分组
      									GPIOA/GPIOB...GPIOI
      					@return			返回获取达到的GPIO分组的输入数据寄存器中的数据
      									返回值类型:uint16_t --> unsigned short
      									这个16bit的值分别对应该GPIO分组的16个GPIO引脚的输入电平状态
      									bit0 ---> 0号的引脚的电平状态
      									bit1 ---> 1号的引脚的电平状态
      									..
      									bit15 ---> 15号的引脚的电平状态
      
      uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
      				获取指定的GPIO引脚的电平状态
      					@GPIOx			指定GPIO分组
      									GPIOA/GPIOB...GPIOI
      				
      					@GPIO_Pin		指定要获取电平状态的引脚的编号
      									GPIO_Pin_0...GPIO_Pin_15
      					
      					@return			返回指定的GPIO引脚的电平状态
      									0		表示该GPIO口输入低电平
      									1		表示该GPIO口输入高电平
      																
      uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
      				uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
      				
      
    2. 输出:CPU通过GPIO向外部输出一个电平

      void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
      				用来向指定的GPIO分组输出电平
      				
      void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
      				用来向指定的某一个GPIO输出电平
      					@GPIOx			指定GPIO分组
      									GPIOA/GPIOB...GPIOI
      		
      					@GPIO_Pin		指定要输出电平的引脚的编号
      									GPIO_Pin_0...GPIO_Pin_15
      
      					@BitVal			指定要输出的电平值
      									Bit_RESET		输出低电平
      									Bit_SET			输出高电平
      									
      				GPIO_WriteBit(GPIOF,GPIO_Pin_9,(BitAction)0);//PF9-->0
      
      void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
      				将指定的GPIO引脚的输出状态翻转(1-->0or0-->1)
      					@GPIOx			指定GPIO分组
      									GPIOA/GPIOB...GPIOI
      		
      					@GPIO_Pin		指定要输出电平的引脚的编号
      									GPIO_Pin_0...GPIO_Pin_15
      			
      void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
      				用来将指定的GPIO口引脚输出高电平
      
      void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
      				用来将指定的GPIO口引脚输出低电平
      				
      
### 回答1: GPIO通用输入/输出)是一种常见的设备接口,在计算机和电子设备中广泛使用。它是一组能够通过编程进行控制和读取的数字引脚,可以连接到各种外部设备上。 通常情况下,计算机系统通过位于主板上的GPIO控制器芯片来提供GPIO接口。GPIO通道的数量和特性可能因设备而异,但通常都包含一些输入和输出引脚。输入引脚用于接收外部设备发送的信号,比如按钮按下、传感器检测到的信号等。输出引脚用于控制外部设备的状态,比如点亮LED灯、控制继电器等。 在软件编程方面,我们可以使用操作系统提供的GPIO库或者编程语言的相关函数来实现对GPIO的控制。这些函数可以设置引脚的工作模式(输入或输出)、读取引脚的状态(高电平或低电平)以及设置引脚的状态(输出高电平或低电平)。通过编写相应的代码,我们可以实现与外部设备之间的交互。 GPIO的应用非常广泛。它可以用于连接各种传感器和执行器,如温度传感器、湿度传感器、光线传感器、运动探测器等。通过读取传感器的信号,我们可以获取环境的相关数据。通过控制执行器,我们可以实现对外部设备的控制,如开关电灯、控制电机转动等。 总之,GPIO是一种通用的、灵活的设备接口,可以在计算机和电子设备中进行输入和输出的控制和读取。通过编程,我们可以与各种外部设备进行连接和通信,实现众多应用场景。 ### 回答2: GPIO是一种通用输入/输出接口,广泛应用于嵌入式系统和物联网设备中。它可以连接各种传感器、执行器和外设,实现与外界的数据交互。 GPIO的主要作用是提供一个程序控制的接口,使嵌入式系统可以读取外部的输入信号,或者向外部输出控制信号。通过GPIO,嵌入式系统可以与各种传感器进行通信,获取环境中的信息。例如,可以通过GPIO连接温度传感器,读取当前的温度值;可以连接光照传感器,获取室内或室外的光照强度。同时,GPIO也可以连接执行器,实现对外部设备的控制。比如,可以通过GPIO控制LED灯的亮灭,或者控制电机的转动。 GPIO的使用非常灵活,可以通过软件进行配置和控制。通常,GPIO会被配置为输入模式或输出模式。在输入模式下,GPIO用于读取外部信号的状态,例如读取按键的按下情况。在输出模式下,GPIO用于向外部发送控制信号,例如给LED灯提供开关信号。通过修改GPIO的状态和引脚配置,嵌入式系统可以实现不同的功能需求。 总之,GPIO作为一种通用输入/输出接口,在嵌入式系统和物联网设备中起到了非常重要的作用。它通过连接各种传感器和外设,实现了与外界的通信和数据交互。同时,GPIO的灵活性和可编程性,使得嵌入式系统可以根据需要进行配置和控制,满足各种不同的应用需求。 ### 回答3: GPIO通用输入/输出)是一种可以通过编程控制的数字引脚,可用于输入或输出数字信号。GPIO通常用于连接外部设备,如传感器、执行器或其他电子元件,以便与计算机或嵌入式系统进行数据交互。 GPIO的工作方式是基于二进制系统,它可以配置为输入或输出模式。在输入模式下,GPIO可以检测外部设备的电平状态,例如开关的开/关状态或传感器的触发信号。在输出模式下,GPIO可以向外部设备发送电压信号,例如驱动电机或控制LED灯。 在使用GPIO时,我们可以通过编程的方式来控制引脚的状态。通过设置引脚的状态,我们可以读取输入信号的状态或者发送输出信号到外部设备。这种灵活的控制方式使得GPIO在嵌入式系统和物联网应用中广泛使用。 使用GPIO需要根据具体的硬件平台和编程语言来进行配置和控制。在树莓派等单板计算机中,我们可以使用Python等高级语言来编写GPIO的控制代码。在嵌入式系统中,我们可以使用C/C++等低级语言来操作GPIO的寄存器以实现控制。 总之,GPIO是一种通用的输入/输出接口,它可以连接外部设备,并通过编程方式实现与计算机或嵌入式系统的数据交互。它在各种应用中都起着重要的作用,从简单的按钮控制到复杂的传感器和执行器控制都可以通过GPIO来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值