GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。

我使用的是正点原子精英STM32F103ZET6开发板 ,开发板共有7组IO口,分别为GPIOA、GPIOB、GPIOC---GPIOG每组IO口有16个IO,共有112个IO;

GPIO共有8种工作方式:

输入模式:

输入浮空、输入上拉、输入下拉、模拟输入

输出模式:

开漏输出、开漏复用功能、推挽输出、推挽复用功能

每组GPIO有3种最大翻转速度:2MHz、110MHz、50MHz

 

android gpio口控制 gpio口模式_android gpio口控制

 

使用库函数编程时,结构体可以选择如下:

typedef enum

{ GPIO_Mode_AIN = 0x0,

  GPIO_Mode_IN_FLOATING = 0x04,

  GPIO_Mode_IPD = 0x28,

  GPIO_Mode_IPU = 0x48,

  GPIO_Mode_Out_OD = 0x14,

  GPIO_Mode_Out_PP = 0x10,

  GPIO_Mode_AF_OD = 0x1C,

  GPIO_Mode_AF_PP = 0x18

}GPIOMode_TypeDef;

 

 

 

android gpio口控制 gpio口模式_android gpio口控制_02

输入浮空模式下,如果该引脚悬空的情况下,该端口的电平是不确定的。当有电平信号进入I/O时,I/O电平状态是完全出外部输入决定。

 

 

android gpio口控制 gpio口模式_输出模式_03

输入上拉模式下,I/O端口悬空时,输入端的电平可以保持在高电平,在输入低电平时,输入端的电平是低电平。

 

android gpio口控制 gpio口模式_复用_04

输入下拉模式与输入上拉模式类似,I/O端口悬空时,输入端的平可以保持在低电平,在输入高电平时,输入端的电平是高电平。

 

android gpio口控制 gpio口模式_上拉_05

模拟输入模式下,输入电流不再经过TTL肖特基触发器,可将外部电压信号直接输入单片机,常外接ADC模块时使用。

 

android gpio口控制 gpio口模式_复用_06

开漏输出模式,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。

 

android gpio口控制 gpio口模式_android gpio口控制_07

开漏复用输出模式与开漏输出模式类似,只是输出的高低电平来自片上外设模块的复用功能输出来决定的。

 

 

 

android gpio口控制 gpio口模式_上拉_08

推挽输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。这里要注意P-MOS管和N-MOS管,当设置输出的值为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的值为低电平的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。

 

android gpio口控制 gpio口模式_上拉_09

推挽复用模式与推挽输出模式类似,只是输出的高低电平来自片上外设模块的复用功能输出来决定的。

 

推挽输出模式可以输出强高低电,可以用来驱动LED等小功率的器件,而开漏模式在悬空时只能输出强低电平,高电平需要上拉电阻,且强弱由上拉电阻阻值决定,好处是可以负载较大功率的器件,输出的电流电压与单片机无关,同时OC门可以实现逻辑与的功能。

 

android gpio口控制 gpio口模式_android gpio口控制_10

跑马灯实验中初始化PB5口,选用的就是推挽输出。