GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口 通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 并且F4系列是基于Cortex-M4内核
GPIO的复用:
STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 比如说串口 就是GPIO复用为串口.
配置:
1.引脚号: GPIO_Pin
2. 工作模式: GPIO_Mode
3. 配置速度: GPIO_Speed
4.输出/输入的方式: GPIO_OType
5.有无上拉电阻 : GPIO_PuPd
分析每个配置的参数:
1. 引脚号 参数 (17 个)
GPIO_Pin_x (0--15)
2. 工作模式 (4个参数)
typedef enum
{
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 */
}GPIOMode_TypeDef;
GPIO_Mode_IN 端口为输入模式
GPIO_Mode_OUT 端口为输出模式
GPIO_Mode_AF 端口为 复用模式
GPIO_Mode_AN 端口 为 GPIO模拟模式
解释:
复用模式: STM32有很多内置外设,这些外设的外部引脚都是与GPIO复用的。一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。(简单来说 ,这个口子,我同时需要做 输出和输入, 这就是复用 )
GPIO模拟模式:引脚信号直接连接模拟输入,实现对外部信号的采集,可以收集 0~Vss 的电压 值。 (简单点, ADC DAC 数模转换,模数转换的 专用模式 )
3.速度 参数
typedef enum
{
GPIO_Low_Speed = 0x00, /*!< Low speed */
GPIO_Medium_Speed = 0x01, /*!< Medium speed */
GPIO_Fast_Speed = 0x02, /*!< Fast speed */
GPIO_High_Speed = 0x03 /*!< High speed */
}GPIOSpeed_TypeDef;
/* Add legacy definition */
#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
GPIO_Low_Speed 速度为 2MHZ
GPIO_Medium_Speed 速度为 25MHZ
GPIO_Fast_Speed 速度为 50MHZ
GPIQ_High_Speed 速度为 100MHZ
4.输出/输入的方式: 2个参数
typedef enum
{
GPIO_OType_PP = 0x00,
GPIO_OType_OD = 0x01
}GPIOOType_TypeDef;
GPIO_OType_PP 推挽输出 (推挽输出既可以输出高电平也可以输出低电平。)
GPIO_OType_OD 开漏输出 (只能输出低电平,要想输出高电平必须要接上拉电阻)
5.有无上拉电阻 : (3个参数)
typedef enum
{
GPIO_PuPd_NOPULL = 0x00,
GPIO_PuPd_UP = 0x01,
GPIO_PuPd_DOWN = 0x02
}GPIOPuPd_TypeDef;
GPIO_PuPd_NOPULL ( 浮空)
GPIO_PuPd_UP (上拉电阻) (开始的时候这个 端口的 电平是高电平)
GPIO_PuPd_DOWN (下拉电阻) (开始的时候这个端口的 电平是低电平)
6.配置输入输出模式有下面几点值得注意:
作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
7.配置为 八种工作模式
4种输入模式
(1)GPIO_Mode_IN_FLOATING 浮空输入
(2)GPIO_Mode_IPU 上拉输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_AIN 模拟输入
4种输出模式
(5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
(6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
(7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
(8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)
8. 开始配置 8种模式
1. GPIO_Mode_IN_FLOATING 浮空输入
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_IN ; // 输入模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd=GPIO_PuPd_NOPULL ; // 浮空电阻
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOE,&GIOSTRUCT);
2.GPIO_Mode_IPU 上拉输入
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_IN ; // 输入模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd=GPIO_PuPd_UP ; // 上拉电阻
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOE,&GIOSTRUCT);
3.GPIO_Mode_IPD 下拉输入
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_IN ; // 输入模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd=GPIO_PuPd_DOWN ; // 下拉电阻
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOE,&GIOSTRUCT);
4.GPIO_Mode_AIN 模拟输入
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_AN ; // 输入模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd= 随意 ; //
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOE,&GIOSTRUCT);
5.GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_OUT ; // 输出模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd= 上拉/下拉 ; //
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_OD;
GPIO_Init(GPIOE,&GIOSTRUCT);
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_AF ; // 输出模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd= 上拉/下拉 ; //
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_OD;
GPIO_Init(GPIOE,&GIOSTRUCT);
6.GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_AF ; // 输出模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd= 上拉/下拉 ; //
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_OD;
GPIO_Init(GPIOE,&GIOSTRUCT);
7.GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_OUT ; // 输出模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd= 上拉/下拉 ; //
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOE,&GIOSTRUCT);
8.GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)
//1.配置时钟: 给个心跳。 选择需要的时钟频率
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GIOSTRUCT;
//2.配置功能: 功能太多。 选择GPIO功能;
GIOSTRUCT.GPIO_Mode=GPIO_Mode_AF ; // 复用模式
GIOSTRUCT.GPIO_Pin=GPIO_Pin_8 |GPIO_Pin_9 ;//引脚
GIOSTRUCT.GPIO_PuPd= 上拉/下拉 ; //
GIOSTRUCT.GPIO_Speed=GPIO_Low_Speed;//配置速度
//外部无上拉电阻选择推挽输出, 外部有上拉电阻选择开漏输出
GIOSTRUCT.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOE,&GIOSTRUCT);