STM32入门教程GPIO.docx
《STM32入门教程GPIO.docx》由会员分享,可在线阅读,更多相关《STM32入门教程GPIO.docx(7页珍藏版)》请在冰豆网上搜索。
![STM32入门教程GPIO.docx](https://file1.bdocx.com/fileroot1/2022-11/20/40b78a8d-c750-4e04-8395-d1abdf849544/40b78a8d-c750-4e04-8395-d1abdf8495441.gif)
STM32入门教程GPIO
STM32GPIO使用方法
一、STM32GPIO简介
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。
STM32GPIO的复用:
STM32有很多的内置外设,这些外设的外部引脚都是与GPIO共用的。
也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
比如说串口就是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()函数设置工作模式
数据类型说明
typedefstruct
{
uint32_tGPIO_Pin; //引脚配置
GPIOMode_TypeDefGPIO_Mode; //GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF(备用),GPIO_Mode_AN(模拟)
GPIOSpeed_TypeDefGPIO_Speed;//GPIO_Speed_2MHz,GPIO_Speed_25MHz,GPIO_Speed_50MHz,GPIO_Speed_100MHz
GPIOOType_TypeDefGPIO_OType; //GPIO_OType_PP(推挽),GPIO_OType_OD(开漏)
GPIOPuPd_TypeDefGPIO_PuPd; GPIO_PuPd_NOPULL(无),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
}GPIO_InitTypeDef;
3、备用功能配置(除ADC和DAC外的所有非GPIO功能),使用函数
voidGPIO_PinAFConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_PinSource,uint8_tGPIO_AF)
* ThisGPIO_AFcanbeoneofthefollowingvalues:
* @argGPIO_AF_RTC_50Hz:
ConnectRTC_50HzpintoAF0(defaultafterreset)
* @argGPIO_AF_MCO:
ConnectMCOpin(MCO1andMCO2)toAF0(defaultafterreset)
* @argGPIO_AF_TAMPER:
ConnectTAMPERpins(TAMPER_1andTAMPER_2)toAF0(defaultafterreset)
* @argGPIO_AF_SWJ:
ConnectSWJpins(SWDandJTAG)toAF0(defaultafterreset)
* @argGPIO_AF_TRACE:
ConnectTRACEpinstoAF0(defaultafterreset)
* @argGPIO_AF_TIM1:
ConnectTIM1pinstoAF1
* @argGPIO_AF_TIM2:
ConnectTIM2pinstoAF1
* @argGPIO_AF_TIM3:
ConnectTIM3pinstoAF2
* @argGPIO_AF_TIM4:
ConnectTIM4pinstoAF2
* @argGPIO_AF_TIM5:
ConnectTIM5pinstoAF2
* @argGPIO_AF_TIM8:
ConnectTIM8pinstoAF3
* @argGPIO_AF_TIM9:
ConnectTIM9pinstoAF3
* @argGPIO_AF_TIM10:
ConnectTIM10pinstoAF3
* @argGPIO_AF_TIM11:
ConnectTIM11pinstoAF3
* @argGPIO_AF_I2C1:
ConnectI2C1pinstoAF4
* @argGPIO_AF_I2C2:
ConnectI2C2pinstoAF4
* @argGPIO_AF_I2C3:
ConnectI2C3pinstoAF4
* @argGPIO_AF_SPI1:
ConnectSPI1pinstoAF5
* @argGPIO_AF_SPI2:
ConnectSPI2/I2S2pinstoAF5
* @argGPIO_AF_SPI3:
ConnectSPI3/I2S3pinstoAF6
* @argGPIO_AF_I2S3ext:
ConnectI2S3extpinstoAF7
* @argGPIO_AF_USART1:
ConnectUSART1pinstoAF7
* @argGPIO_AF_USART2:
ConnectUSART2pinstoAF7
* @argGPIO_AF_USART3:
ConnectUSART3pinstoAF7
* @argGPIO_AF_UART4:
ConnectUART4pinstoAF8
* @argGPIO_AF_UART5:
ConnectUART5pinstoAF8
* @argGPIO_AF_USART6:
ConnectUSART6pinstoAF8
* @argGPIO_AF_CAN1:
ConnectCAN1pinstoAF9
* @argGPIO_AF_CAN2:
ConnectCAN2pinstoAF9
* @argGPIO_AF_TIM12:
ConnectTIM12pinstoAF9
* @argGPIO_AF_TIM13:
ConnectTIM13pinstoAF9
* @argGPIO_AF_TIM14:
ConnectTIM14pinstoAF9
* @argGPIO_AF_OTG_FS:
ConnectOTG_FSpinstoAF10
* @