STM32 GPIO使用方法
一、STM32 GPIO简介
GPIO即通用I/O(输入/输出)端口,是STM32可控制的引脚STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
STM32F407为例,其为F4系列是基于Cortex-M4内核 ,共有7IO。分别为GPIOA~GPIOG,每组IO16IO口,共有112IO  通常称为 PAxPBxPCxPDxPExPFxPGx,其中x0-15
 STM32 GPIO的复用:
STM32 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。    比如说串口  就是GPIO复用为串口。
二、GPIO的工作模式
14种输入模式
1GPIO_Mode_IN_FLOATING 浮空输入
2GPIO_Mode_IPU 上拉输入
3GPIO_Mode_IPD 下拉输入
4GPIO_Mode_AIN 模拟输入
24种输出模式
1GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
2GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
3GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
4GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)
34种最大输出速度
12MHZ  (低速)
225MHZ  (中速)
350MHZ  (快速)
4100MHZ  (高速)
关于它们的定义,都在  stm32f4xx_gpio.h 中,都为结构体形式的定义
三、GPIO内部结构
a、保护二极管:  IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁
b、上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平
c、TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为01的数字信号    也就是高低电平  并且是TTL电平协议  这也是为什么STM32TTL电平协议的原因
d、 P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有推挽输出开漏输出的模式    P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭
注: 
 VDD_FT  代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V (在芯片
数据手册的引脚定义中,会看到有“I/O电平”一列  有FT即为支持5V)
开漏输出和推挽输出的区别:
推挽输出:
可以输出强高低电平,连接数字器件,推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.
开漏输出:
可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平  合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平
推挽输出电路: 其中IN端输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当IN端输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平 
开漏输出电路:IN端输出低电平时,三极管导通,使输出接地,IN端输出高电平时,三极管截止,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须接上拉电阻,
四、STM32中如何选用IO模式:
1 上拉输入、下拉输入可以用来检测外部信号;例如,按键等;
2、模拟输入 ——应用ADC模拟输入,或者低功耗下省电
3、开漏输出一般应用在I2CSMBUS通讯等需要"线与"功能的总线电路中。
4 推挽输出模式一般应用在输出电平为03.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。
5、复用功能的推挽输出_AF_PP ——片内外设功能(I2CSCL,SDA
6、复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS
五、STM32的GPIO配置方法
1.使能GPIO的AHB时钟,使用函数:   
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
2、配置GPIO工作模式,使用GPIO_Init()函数设置工作模式
丰田ft-hs数据类型说明
typedef struct
{
  uint32_t GPIO_Pin;              //引脚配置
GPIOMode_TypeDef GPIO_Mode;  //GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF(备用),GPIO_Mode_AN(模拟)
 
GPIOSpeed_TypeDef GPIO_Speed;// GPIO_Speed_2MHz,GPIO_Speed_25MHz,GPIO_Speed_50MHz,GPIO_Speed_100MHz
GPIOOType_TypeDef GPIO_OType;   // GPIO_OType_PP(推挽),GPIO_OType_OD(开漏)
GPIOPuPd_TypeDef GPIO_PuPd;     GPIO_PuPd_NOPULL(无),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
}GPIO_InitTypeDef;
3、备用功能配置(除ADC和DAC外的所有非GPIO功能),使用函数
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
*          This GPIO_AF can be one of the following values:
  *            @arg GPIO_AF_RTC_50Hz: Connect RTC_50Hz pin to AF0 (default after reset) 
  *            @arg GPIO_AF_MCO: Connect MCO pin (MCO1 and MCO2) to AF0 (default after reset) 
  *            @arg GPIO_AF_TAMPER: Connect TAMPER pins (TAMPER_1 and TAMPER_
2) to AF0 (default after reset) 
  *            @arg GPIO_AF_SWJ: Connect SWJ pins (SWD and JTAG)to AF0 (default after reset) 
  *            @arg GPIO_AF_TRACE: Connect TRACE pins to AF0 (default after reset)
  *            @arg GPIO_AF_TIM1: Connect TIM1 pins to AF1
  *            @arg GPIO_AF_TIM2: Connect TIM2 pins to AF1
  *            @arg GPIO_AF_TIM3: Connect TIM3 pins to AF2
  *            @arg GPIO_AF_TIM4: Connect TIM4 pins to AF2