STM32F1入门2-GPIO
-
Hunto STM32培训系列
文档及源码Github地址:hunto/learning_STM32
STM32培训2 —— GPIO
一、 STM32 GPIO输出模式
1. 推挽输出
可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
2. 开漏输出
输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点:
-
利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经上拉电阻、MOSFET到GND。IC内部仅需很小的栅极驱动电流。
-
一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。
-
开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。
关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。
3. 复用开漏输出、复用推挽输出
可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
这么多输出模式,怎么选?
- 绝大多数情况下,使用推挽输出,高电平输出电压3.3V
- 当需要调节输出电压时,使用开漏输出并外接上拉电阻
二、 GPIO初始化
1. 使能外部时钟
所有外设都需要时钟驱动。STM32相较于51,有多个外设时钟,可以在需要使用它们时独立使能达到省电目的,因此,在使用对应外设的GPIO时,需要对相应时钟进行使能。
- 对应库函数头文件:
stm32f10x_rcc.h
- 使能方法:
/* 使能GPB时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
2. 配置GPIO初始化结构体
GPIO_InitTypeDef
GPIO初始化结构体用于配置GPIO的初始化参数。位于头文件
stm32f10x_gpio.h
中。typedef struct { uint16_t GPIO_Pin; // 需要初始化的GPIO口 ex: GPIO_Pin_0 GPIOSpeed_TypeDef GPIO_Speed; // IO频率 ex: GPIO_Speed_50MHz GPIOMode_TypeDef GPIO_Mode; // IO模式 ex: GPIO_Mode_Out_PP } GPIO_InitTypeDef;
3. 初始化GPIO函数
GPIO_init
- 函数声明
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
- Example
/* GPIO初始化结构体 */ GPIO_InitTypeDef GPIO_InitStructure; /* 要初始化的IO口 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* GPIO模式为推挽输出(Push-Pull) */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* GPIO频率 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 初始化 */ GPIO_Init(GPIOA, &GPIO_InitStructure);
三、 GPIO输出高电平/低电平
-
GPIO_WriteBit
GPIO_WriteBit(GPIO_TypeDef* GPIOx, // GPIO_Port u16 GPIO_Pin, // GPIO_Pin BitAction BitVal) // 设置的值,声明见下方
BitAction声明
typedef enum { Bit_RESET = 0, Bit_SET } BitAction;
Example
GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); // 输出高电平 GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); // 输出低电平 /* 设置多个(使用或运算) */ GPIO_WriteBit(GPIOA, GPIO_Pin_15|GPIO_Pin_14, Bit_SET);
-
GPIO_SetBits
设置IO端口为高电平void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
Example
GPIO_SetBits(GPIOC, GPIO_Pin_0); GPIO_SetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1);
-
GPIO_ResetBits
设置IO端口为高电平void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
Example
GPIO_SetBits(GPIOC, GPIO_Pin_0); GPIO_SetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1);
四、 STM32 GPIO输入模式
1. 上拉输入/下拉输入
- 上拉输入:电压拉高至3.3,断开状态为高电平,连通状态为低电平
- 下拉输入:与上拉输入原理类似,效果相反
2. 浮空输入
浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。
五、 GPIO读取输入电平
1.
GPIO_ReadInputDataBit
u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
返回值:0/1
例:对于按键
- 当输入方式为上拉输入时,接通为0,断开为1
- 下拉输入无效 (或按键的另一端为VCC则有效,接通为1)
-