STM32 基于库函数的GPIO配置
一、配置步骤
- 创建一个初始化结构体
- 配置时钟并使能
- 配置需要使用的引脚
- 配置引脚的模式
- 配置引脚速度
- 初始化引脚所在的组
二、GPIO结构体配置
- GPIO_InitTypeDef GPIO_InitStructure; //创建名为 GPIO_InitStructure结构体
- RCC_APB1PeriphClockCmd(各GPIO口对应的时钟|各GPIO口对应时钟,是否使能); //使能时钟
- GPIO_InitStructure.GPIO_Pin=GPIO_PIN_引脚号; //配置需要使用的引脚
- GPIO_IniStructure.GPIO_Mode= ; //配置引脚模式
- GPIO_IniStructure.GPIO_SPEED= ; //配置引脚速度
- GPIO_Init(要初始化的GPIO口,&GPIO_InitStructure); //初始化引脚所在组
三、具体配置步骤
-
创建一个初始化结构体
GPIO_InitTypeDef 结构体名称;
多数习惯命名结构体为GPIO_InitStructure
对于GPIO的初始化都是通过这个结构体的成员函数进行初始化,这样子可以简化初始化步骤 -
配置时钟并使能
RCC_APB1PeriphClockCmd(各GPIO口对应的时钟|各GPIO口对应时钟,是否使能);
RCC_APB2PeriphClockCmd(各GPIO口对应的时钟|各GPIO口对应时钟,是否使能);
STM32有两种时钟
APB1外设时钟使能寄存器(RCC_APB1ENR) 低速APB使能,最大允许频率36MHz
APB2外设时钟使能寄存器(RCC_APB2ENR) 高速APB使能,最大允许频率72MHz
每一组GPIO下面都有16个口,比如说GIPOA下有0-15口
APB2 | TIM 1/8 | USART 1 | SPI 1 | GPIO A-Z | ADC 1-3 | EXTI | AFIO |
---|---|---|---|---|---|---|---|
APB1 | TIM 2-7 | USART 2-5 | UART 4/5 | SPI2/I2S | SPI3/I2S | I2C 1/2 | IWDG |
WWDG | bxCAN | USB | BKP | PWR | DAC |
-
配置需要使用的引脚
GPIO_InitStructure.GPIO_Pin=GPIO_PIN_引脚号
引脚号的设置根据配置时钟的GPIO时钟对应
比如说:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);//使能PB,PE端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0–>PB.5 端口配置
这里只是设定了用第几个端口,但还没设置分组,分组将在最后一步
-
配置引脚的模式
GPIO_IniStructure.GPIO_Mode=GPIO_Mode_IPU 上拉输入 GPIO_Mode_Out_PP 普通推挽输出
GPIO_Mode_IPD 下拉输入 GPIO_Mode_Out_OD 普通开漏输出
GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_AF_PP 复用推挽输出
GPIO_Mod e_AIN 模拟输入模式 GPIO_Mode_AF_OD 复用开漏输出
功能 名称 简述 输入 上拉输入(GPIO_Mode_IPU) 默认状态下(引脚无输入),读得的数据为1,高电平 输入 下拉输入(GPIO_Mode_IPD) 与上拉输入相反,默认为0,低电平 输入 浮空输入(GPIO_Mode_IN_FLOATING) 输入不确定,无上拉和下拉。输入阻抗较大,一般用于标准通信协议如I2CI2C、USART的接收端 输入 模拟输入模式(GPIO_Mod e_AIN) 一般由ADC采集电压信号时将其设置为模拟输入。 输出 普通推挽输出(GPIO_Mode_Out_PP) 输出电平为3.3V 输出 普通开漏输出(GPIO_Mode_Out_OD) 若要输出5V,则需外加上拉电阻,电源为5V。输出为高阻态时,由上拉电阻和电源向外输出5V的高电平 输出 复用推挽输出(GPIO_Mode_AF_PP) 引脚复用功能采用复用模式 输出 复用开漏输出(GPIO_Mode_AF_OD) 复用模式,且加入上拉电阻 忘了在哪一个博客摘出来的了,如果我找回来就会在上面加上链接的
-
配置引脚的速度
GPIO引脚速度有三种选择,分别是2MHz,10Mhz和50Mhz
GPIO_IniStructure.GPIO_SPEED=
GPIO_SPEED_2MHz 2MHz
GPIO_SPEED_10MHz 10MHz
GPIO_SPEED_50Mhz 50Mhz
-
初始化引脚所在的组
GPIO_Init(要初始化的GPIO口,&GPIO初始化结构体);将初始化结构体的地址赋值给GPIO_Init,完成最后的初始化,这一句要放在最后
此处将进行gpio口的分组,还记得第二步的时候初始化的一个端口的值,但是没有指明是哪一组的,现在在此处进行指明
比如初始化GPIOB.5,则最后一句是这样的:GPIO_Init(GPIOB,GPIO_InitStructure);