八种引脚功能分别为:
1.GPIO_Mode_AIN 模拟输入
2.GPIO_Mode_IN_FLOATING浮空输入
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复用推挽输出

模拟输入:GPIO_Mode_AIN     
用作内部AD采样,通常情况下,测量范围0v-3.3v。 悬空的时候任会测量到1.5v左右的电压,这是引脚特性不必担心。只能测量正电压,不能测量交流电压,采样速率可根据1/(采样时间+12.5)/AD时钟频来计算.

浮空输入:GPIO_Mode_IN_FLOATING
在该模式下,引脚悬空时IO电平状态不确定,可能导致状态误判。在使用的时候完全由外部输入决定,为了解决这一问题,个人感觉使用该模式的时候不要悬空,最好外接上拉或者下拉电阻,这样可以使用时确切知道当前引脚状态是什么。该模式通常用于外部按键输入。

下拉输入和上拉输入  GPIO_Mode_IPD  GPIO_Mode_IPU
这两个很好理解  IO内部下拉 上拉电阻输入,根据需求进行选择。

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

推挽输出:GPIO_Mode_Out_PP   
一般只用于输出高低电平  IO输出0,接GND    IO 输出1,接VCC ,读输入是未知的

复用推挽输出 :  GPIO_Mode_AF_PP
主要用在片内外设功能 如I2C的scl和 sda

复用开漏输出:GPIO_Mode_AF_OD  
主要用在片内外设功能(TX1,MOSI,MISO.SCK.SS)
(对于复用这一块还是有点迷糊,我得再找找资料)
关于库函数调用及其说明
/******************************************************************************
GPIO_DeInit(GPIO_TypeDef*GPIOx);
功能:将外设GPIOx 寄存器重设为缺省值
参数:GPIOx:x 可以是A,B ,C ,D 或者E,来选择GPIO外设
例子:GPIO_DeInit(GPIOA);
*******************************************************************************
/******************************************************************************
GPIO_AFIODeInit(void);
功能:将复用功能(重映射事件控制和EXTI设置)重设为缺省值 
参数:无 
例子:GPIO_AFIODeInit();
*******************************************************************************
/******************************************************************************
GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef* GPIO_InitStruct);
功能:根据GPIO_InitStruct中指定的参数初始化外设GPIOx 寄存器
参数:GPIOx:x 可以是A,B ,C ,D 或者E,来选择GPIO外设 
     GPIO_InitStruct:指向结构 GPIO_InitTypeDef 的指针,包含了外设GPIO的配置信息
例子:GPIO_InitTypeDefGPIO_InitStructure; 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; 
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
     GPIO_Init(GPIOA, &GPIO_InitStructure); //Configure all the GPIOA inInput Floating mode
*******************************************************************************
/******************************************************************************
GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
功能:把GPIO_InitStruct中的每一个参数按缺省值填入 
参数:GPIO_InitStruct:指向结构 GPIO_InitTypeDef 的指针,待初始化
例子:GPIO_InitTypeDefGPIO_InitStructure; 
     GPIO_StructInit(&GPIO_InitStructure); //Initialize the GPIO InitStructure parameters
*******************************************************************************
/****************************************************************************
GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,u16 GPIO_Pin);
功能:读取指定端口管脚的输入
参数:GPIOx :x 可以是A,B ,C ,D 或者E,来选择GPIO外设 
     GPIO_Pin:待读取的端口位
返回值: 输入端口管脚值 
例子:ReadValue=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
//Readsthe seventh pin of the GPIOB and           store it in ReadValue variable
*******************************************************************************
/******************************************************************************
 GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
功能:读取指定的GPIO端口输入
参数:GPIOx:x 可以是A,B ,C ,D 或者E,来选择GPIO外设
返回值: GPIO输入数据端口值 
例子:u16ReadValue;
ReadValue=GPIO_ReadInputData(GPIOA);//Readthe GPIOC input data port and store it in ReadValue  variable
*******************************************************************************
/******************************************************************************
GPIO_ReadOutputDataBit();
功能:读取指定端口管脚的输出
参数:GPIOx :x 可以是A,B ,C ,D 或者E,来选择GPIO外设 
     GPIO_Pin:待读取的端口位 
返回值:输出端口管脚值
例子:u8ReadValue;
    ReadValue=GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);//Reads the seventhpin of the GPIOB and      store it inReadValue variable
*******************************************************************************
/******************************************************************************
 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
功能:读取指定的GPIO端口输出 
参数:GPIOx :x 可以是A,B ,C ,D 或者E,来选择GPIO外设 
返回值:GPIO输出数据端口值
例子:u16ReadValue;
ReadValue=GPIO_ReadOutputData(GPIOC);//Readthe GPIOC output data port and store it in ReadValue 
         variable
*******************************************************************************
/******************************************************************************
GPIO_SetBits(GPIO_TypeDef*GPIOx, u16 GPIO_Pin);
功能:设置指定的数据端口位
参数:GPIOx :x 可以是A,B ,C ,D 或者E,来选择GPIO外设
    GPIO_Pin:待设置的端口位 
例子:GPIO_SetBits(GPIOA,GPIO_Pin_10 | GPIO_Pin_15);//Set the GPIOA port pin 10 and pin 15
*******************************************************************************
/******************************************************************************GPIO_ResetBits(GPIO_TypeDef*GPIOx, u16 GPIO_Pin);
功能:清除指定的数据端口位
参数:GPIOx :x 可以是A,B ,C ,D 或者E,来选择GPIO外设 
     GPIO_Pin:待清除的端口位 
例子:GPIO_ResetBits(GPIOA,GPIO_Pin_10 | GPIO_Pin_15);//Clears the GPIOA port pin 10 and pin 15 
*******************************************************************************
/******************************************************************************
GPIO_WriteBit(GPIO_TypeDef*GPIOx, u16 GPIO_Pin, Bit Action Bit Val);
功能:设置或者清除指定的数据端口位
参数:GPIOx :x 可以是A,B ,C ,D 或者E,来选择GPIO外设 
     GPIO_Pin:待设置或者清除指的端口位
     Bit Val: 该参数指定了待写入的值 该参数必须取枚举Bit Action 的其中一个值
Bit RESET: 清除数据端口位 
     Bit SET: 设置数据端口位 
例子:GPIO_WriteBit(GPIOA,GPIO_Pin_15, Bit SET);//Set the GPIOA port pin 15
*******************************************************************************
/******************************************************************************
GPIO_Write(GPIO_TypeDef*GPIOx, u16 PortVal);
功能:向指定GPIO数据端口写入数据
参数:GPIOx :x 可以是A,B ,C ,D 或者E,来选择GPIO外设
    PortVal:  待写入端口数据寄存器的值  
例子:GPIO_Write(GPIOA,0x1101); //Write data to GPIOA data port
*******************************************************************************
/******************************************************************************
GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, u16GPIO_Pin);
功能:锁定GPIO管脚设置寄存器 
参数:GPIOx :x 可以是A,B ,C ,D 或者E,来选择GPIO外设
     GPIO_Pin:待锁定的端口位 该参数可以取GPIO_Pin_x(x 可以是 0-15)的任意组合
例子:GPIO_PinLockConfig(GPIOA,GPIO_Pin_0 | GPIO_Pin_1); //Lock GPIOA Pin0 and Pin1
*******************************************************************************
/******************************************************************************
GPIO_EventOutputConfig(u8 GP IO_PortSource,u8 GPIO_PinSource)
功能:选择GPIO管脚用作事件输出 
参数:GPIO_PortSource:  选择用作事件输出的 GPIO端口 
    GPIO_PinSource :事件输出的管脚 ,该参数可以取GPIO_PinSourcex(x可以是 0-15)  
例子:GPIO_EventOutputConfig(GPIO_PortSourceGPIOE,GPIO_PinSource5); //Selects the GPIOE pin 5 for       EVENT output 
*******************************************************************************
/******************************************************************************
GPIO_EventOutputCmd(FunctionalStateNewState) ;
功能:使能或者失能事件输出
参数:NewState: 事件输出的新状态 这个参数可以取:ENABLE 或者DISABLE
例子:GPIO_EventOutputConfig(GPIO_PortSourceGPIOC,GPIO_PinSource6); 
 
GPIO_EventOutputCmd(ENABLE);//Enable Event Ouput to the GPIOC pin 6 
 
******************************************************************************* 
 
/******************************************************************************
GPIO_PinRemapConfig(u32GPIO_Remap, FunctionalState NewState) ;
 
功能:改变指定管脚的映射 
 
参数:GPIO_Remap: 选择重映射的管脚 
 
      NewState: 管脚重映射的新状态 这个参数可以取:ENABLE 或者DISABLE 
 
例子:GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE);//I2C1_SCL on PB.08, I2C1_SDA on PB.09 
 
******************************************************************************* 
 
/******************************************************************************GPIO_EXTILineConfig(u8GPIO _PortSource, u8  GPIO_PinSource) ; 
 
功能:选择GPIO管脚用作外部中断线路 
 
参数:GPIO_PortSource:  选择用作外部中断线源的 GPIO端口 
 
      GPIO_PinSource :待设置的外部中断线路 
 
例子:GPIO_EXTILineConfig(GPIO_PortSource_GPIOB,GPIO_PinSource8);//Selects PB.08 as EXTI Line 8 
 
***********************************