STM32 GPIO使用方法
一、STM32 GPIO简介
GPIO即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
以STM32F407为例,其为F4系列是基于Cortex-M4内核 ,共有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口 通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。
STM32 GPIO的复用:
STM32 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。stm32怎么使用printf 比如说串口 就是GPIO复用为串口。
二、GPIO的工作模式
1、4种输入模式
(1)GPIO_Mode_IN_FLOATING 浮空输入
(2)GPIO_Mode_IPU 上拉输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_AIN 模拟输入
2、4种输出模式
(1)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
(2)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
(3)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
(4)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)
3、4种最大输出速度
(1)2MHZ (低速)
(2)25MHZ (中速)
(3)50MHZ (快速)
(4)100MHZ (高速)
关于它们的定义,都在 stm32f4xx_gpio.h 中,都为结构体形式的定义
三、GPIO内部结构
a、保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁
b、上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平
c、TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号 也就是高低电平 并且是TTL电平协议 这也是为什么STM32是TTL电平协议的原因
d、 P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式 P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭
注:
VDD_FT 代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V (在芯片数
据手册的引脚定义中,会看到有“I/O电平”一列 有FT即为支持5V)
开漏输出和推挽输出的区别:
推挽输出:
可以输出强高低电平,连接数字器件,推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.
开漏输出:
可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平 合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平
推挽输出电路: 其中IN端输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当IN端输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平
开漏输出电路:IN端输出低电平时,三极管导通,使输出接地,IN端输出高电平时,三极管截止,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须接上拉电阻,
四、STM32中如何选用IO模式:
1、 上拉输入、下拉输入可以用来检测外部信号;例如,按键等;
2、模拟输入 ——应用ADC模拟输入,或者低功耗下省电
3、开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。
4、 推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。
5、复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
6、复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
五、STM32的GPIO配置方法
1.使能GPIO的AHB时钟,使用函数:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
2、配置GPIO工作模式,使用GPIO_Init()函数设置工作模式
数据类型说明
typedef struct
{
uint32_t GPIO_Pin; //引脚配置
GPIOMode_TypeDef GPIO_Mode; //GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF(备用),GPIO_Mode_AN(模拟)
GPIOSpeed_TypeDef GPIO_Speed;// GPIO_Speed_2MHz,GPIO_Speed_25MHz,GPIO_Speed_50MHz,GPIO_Speed_100MHz
GPIOOType_TypeDef GPIO_OType; // GPIO_OType_PP(推挽),GPIO_OType_OD(开漏)
GPIOPuPd_TypeDef GPIO_PuPd; GPIO_PuPd_NOPULL(无),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
}GPIO_InitTypeDef;
3、备用功能配置(除ADC和DAC外的所有非GPIO功能),使用函数
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
* This GPIO_AF can be one of the following values:
* @arg GPIO_AF_RTC_50Hz: Connect RTC_50Hz pin to AF0 (default after reset)
* @arg GPIO_AF_MCO: Connect MCO pin (MCO1 and MCO2) to AF0 (default after reset)
* @arg GPIO_AF_TAMPER: Connect TAMPER pins (TAMPER_1 and TAMPER_2) to AF0 (default after reset)
* @arg GPIO_AF_SWJ: Connect SWJ pins (SWD and JTAG)to AF0 (default after reset)
* @arg GPIO_AF_TRACE: Connect TRACE pins to AF0 (default after reset)
* @arg GPIO_AF_TIM1: Connect TIM1 pins to AF1
* @arg GPIO_AF_TIM2: Connect TIM2 pins to AF1
* @arg GPIO_AF_TIM3: Connect TIM3 pins to AF2
* @arg GPIO_AF_TIM4: Connect TIM4 pins to AF2
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论