GPIO 引脚
GPIO 定义
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,其接脚可以供使用者由程控自由使用,PIN 脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO)
GPIO 8 种工作模式
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出
1、上拉输入、下拉输入可以用来检测外部信号;例如,按键等;
2、浮空输入模式,由于输入阻抗较大,一般把这种模式用于标准通信协议的 I2C、USART 的接收端;
3、普通推挽输出模式一般应用在输出电平为 0 和 3.3V 的场合。而普通开漏输出模式一般应用在电平不匹配的场合, 如需要输出 5V 的高电平,就需要在外部一个上拉电阻,电源为 5V,把 GPIO 设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出 5V 电平。
4、对于相应的复用模式(复用输出来源片上外设),则是根据 GPIO 的复用功能来选择,如 GPIO 的引脚用作串口的输出(USART/SPI/CAN),则使用复用推挽输出模式。如果用在 I2C、SMBUS 这些需要线与功能的复用场合,就使用复用开漏模式。
5、在使用任何一种开漏模式时,都需要接上拉电阻。
手写库文件 函数 GPIO
1.使能IO口时钟。调用库函数中的 RCC_APB2PeriphColockCmd(); 注意:不同IO口,调用时钟使能函数不一样。
2.初始化IO口模式。调用函数GPIO_Init()
3.操作IO口,输出高低电平
GPIO_SetBits();
GPIO_ResetBits();
手写寄存器版 函数 GPIO
1.使能IO口时钟。配置寄存器RCC_APB2ENR.
2.初始化IO口模式。配置寄存器 GPIOx_CRH/CRL
3.操作IO口,输出高低电平。配置寄存器GPIOX_ODR 或者 BSRR/BRR.
Cube MX 相关配置
GPIO_Input-输入引脚
GPIO_Output-输出引脚
配置引脚
对于输入引脚,可以配置的就是
GPIO Pull-up/Pull-down
。这分别对应的就是
Pull-up
(输入上拉)与
Pull-down
(输入下拉)。
Pull-up:
输入上拉就是把电位拉高,比如拉到
Vcc
。上拉就是将不确定的信号通过一
个电阻嵌位在高电平。电阻同时起到限流的作用。弱强只是上拉电阻的阻值不同,没有
什么严格区分。
Pull-down:
输入下拉就是把电压拉低,拉到
GND
。与上拉原理相似。
简单的说,如果你希望你的引脚平时处于高电平用于检测低电平,你就使用
Pull-up
。
如果你希望你的引脚平时处于低电平用于检测高电平,你就使用
Pull-down
。
图
1.2:
配置输出引脚
GPIO output level->
初始化输出电平
GPIO mode->
输出方式
->
开漏或推挽输出
GPIO Pull-up/Pull-down->
上拉或下拉输出
Maximum output speed
选中
GPIO
管脚的速率
User Label 给引脚命名,方便修改程序
I/O
口的输出模式下,有
3
种输出速度可选
(Low-2MHz
、
Medium-10MHz
、
High-
50MHz)
,这个速度是指
I/O
口驱动电路的响应速度而不是输出信号的速度,输出信号的
速度与程序有关(芯片内部在
I/O
口的输出部分安排了多个响应速度不同的输出驱动电
路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱
动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需
要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的
EMI
性能。当然
如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输
出信号。
举个栗子:
1
、
USART
串口,若最大波特率只需
115.2k
,那用
2M
的速度就够了,既省电也噪声
小。
2
、
I2C
接口,若使用
400k
波特率,若想把余量留大些,可以选用
10M
的
GPIO
引
脚速度。
3
、
SPI
接口,若使用
18M
或
9M
波特率,需要选用
50M
的
GPIO
的引脚速度。
keil5 代码
void
HAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);
//
初始化引脚
void
HAL_GPIO_DeInit(GPIO_TypeDef*GPIOx,uint32_tGPIO_Pin);
//
重置引脚
IO
口操作相关
HAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
//读取电平状态
HAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState);
//
设置引脚状态
HAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin); //反转电平
HAL_GPIO_LockPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin); //
锁定引脚状态