GPIO基本控制
GPIO(General-Purpose input/output,通用输入/输出接口)
用于感知外部信号(输入模式)和控制外部设备(输出模式)
简单模块:LED,按键,蜂鸣器,温度传感器,使用一个GPIO就可以完成数据的传输/控制
复杂一点的模块OLED,FLASH,六轴传感器需要多个引脚组成“协议”传输数据,USART,IIC,SPI等协议
MCU单片机大都采用引脚复用模式也就是一个GPIO,可以直接控制它输出高低电平,也可以设置为某个协议的引脚之一。此外,一些MCU的引脚,还能设置为ADC模 式读取模拟信号,或者设置为DAC模式输出模拟信号
STM32的GPIO(General Purpose Input/Output,通用输入输出)引脚支持多种工作模式,这些模式通过配置GPIOx_MODER(模式寄存器)、GPIOx_OTYPER(输出类型寄存器)、GPIOx_OSPEEDR(输出速度寄存器)、GPIOx_PUPDR(上下拉/复用功能选择寄存器)、以及GPIOx_AFRx(复用功能选择寄存器,对于复用功能而言)等寄存器来实现。虽然具体数字可能因不同的STM32系列和参考手册而略有不同,但一般而言,STM32的GPIO主要可以配置为以下八种(或类似)工作模式:
输入:
- 模拟输入(Analog Input):
- 在这种模式下,GPIO引脚被配置为模拟信号输入,用于连接模拟传感器或其他模拟信号源。此时,引脚上的模拟信号可以被ADC(模拟数字转换器)读取。
- 浮空输入(Floating Input):
- 浮空输入模式下,引脚处于高阻态,不连接内部上拉或下拉电阻。此时,引脚电平取决于外部电路条件,容易受到噪声影响。
- 上拉输入(Pull-up Input):
- 在上拉输入模式下,引脚内部连接了一个上拉电阻到高电平(通常为VDD)。当外部没有信号连接或信号为低电平时,引脚会被上拉到高电平。这有助于稳定输入信号,减少噪声干扰。
- 下拉输入(Pull-down Input):
- 与上拉输入相反,下拉输入模式下引脚内部连接了一个下拉电阻到低电平(通常为GND)。当外部没有信号连接或信号为高电平时,引脚会被下拉到低电平。
输出:
- 开漏输出(Open-Drain Output):
- 开漏输出模式下,引脚只能输出低电平或高阻态,无法直接输出高电平。当多个开漏输出的引脚连接到一起时,可以实现“线与”功能,即所有引脚都为高阻态时,输出电平由外部上拉电阻决定(外界上拉电阻可以输出高电平)。常用于I2C总线等。
- 开漏输出特性:利用外部电路驱动能力,实现电平转换,方便实现“逻辑与”功能。
- 开漏输出模式下,P-MOS管无效,N-MOS有效。
- 当输出数据寄存器写1,N-MOS断开,输出控制相当于断开,也就是高阻态(所以不能输出高电平)。
- 当输出数据寄存器写0,N-MOS导通,输出控制相当于接VSS,输出为低电平。
- 开漏输出模式下,只有低电平才有驱动能力,高电平无驱动能力,引脚只能输出低电平,可以作为通信协议的驱动方式比如I2C通信的引脚。
- 推挽输出(Push-Pull Output):
- 推挽输出模式下,引脚可以直接驱动外部负载,输出高电平或低电平。这种模式输出电流较大,适用于驱动LED、继电器等负载。
在推挽输出模式下,P-MOS和N-MOS均有效。
- 当输出寄存器写1,上管导通,下管断开,输出控制接到VDD(电源),输出为高电平
- 当输出寄存器写0,上管断开,下管导通,输出控制接到VSS(地面或负极),输出为低电平。
- 复用功能(Alternate Function):
- 复用功能模式下,GPIO引脚被配置为执行特定的外设功能,如SPI、I2C、USART等通信接口的通信引脚。具体复用为哪种功能,通过配置GPIOx_AFRx寄存器来选择。
- 复用开漏输出(Alternate Function Open-Drain Output):
- 这种模式结合了复用功能和开漏输出的特点,引脚被配置为执行特定的外设功能,但输出方式为开漏输出。常用于需要开漏输出的外设接口,如I2C总线接口。
请注意,不是所有的STM32系列都严格遵循上述八种模式分类,但大多数STM32的GPIO都支持类似的功能。具体配置时,应参考具体的STM32系列参考手册。
GPIO的输出速度
STM32的I/O引脚工作再输出模式下时,需要配置I/O引脚的输出速度
该输出速度不是输出信号的速度,而是I/O口驱动电路的响应速度
STM32提供了三个速度,2MHZ,10MHZ,50MHZ
实际开发过程中需要结合实际情况选择合适的响应速度,以兼顾信号的稳定性和低功耗
当设备为高速时,功耗大,噪声大,电磁干扰强
当设备为低速时,功耗低,噪声小,电磁干扰弱
简单外设,比如LED灯,蜂鸣器建议使用2MHZ的输出速度
而复用为IIC,SPI等通信信号时,建议使用10MHZ或50MHZ以提高响应速度。