最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

STM32入门教程--GPIO

来源:动视网 责编:小OO 时间:2025-09-29 17:33:16
文档

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的复用:STM3
推荐度:
导读 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的复用:STM3
 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 作为内置外设使用的时候,就叫做复用。    比如说串口  就是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

  *            @arg GPIO_AF_TIM5: Connect TIM5 pins to AF2

  *            @arg GPIO_AF_TIM8: Connect TIM8 pins to AF3

  *            @arg GPIO_AF_TIM9: Connect TIM9 pins to AF3

  *            @arg GPIO_AF_TIM10: Connect TIM10 pins to AF3

  *            @arg GPIO_AF_TIM11: Connect TIM11 pins to AF3

  *            @arg GPIO_AF_I2C1: Connect I2C1 pins to AF4

  *            @arg GPIO_AF_I2C2: Connect I2C2 pins to AF4

  *            @arg GPIO_AF_I2C3: Connect I2C3 pins to AF4

  *            @arg GPIO_AF_SPI1: Connect SPI1 pins to AF5

  *            @arg GPIO_AF_SPI2: Connect SPI2/I2S2 pins to AF5

  *            @arg GPIO_AF_SPI3: Connect SPI3/I2S3 pins to AF6

  *            @arg GPIO_AF_I2S3ext: Connect I2S3ext pins to AF7

  *            @arg GPIO_AF_USART1: Connect USART1 pins to AF7

  *            @arg GPIO_AF_USART2: Connect USART2 pins to AF7

  *            @arg GPIO_AF_USART3: Connect USART3 pins to AF7

  *            @arg GPIO_AF_UART4: Connect UART4 pins to AF8

  *            @arg GPIO_AF_UART5: Connect UART5 pins to AF8

  *            @arg GPIO_AF_USART6: Connect USART6 pins to AF8

  *            @arg GPIO_AF_CAN1: Connect CAN1 pins to AF9

  *            @arg GPIO_AF_CAN2: Connect CAN2 pins to AF9

  *            @arg GPIO_AF_TIM12: Connect TIM12 pins to AF9

  *            @arg GPIO_AF_TIM13: Connect TIM13 pins to AF9

  *            @arg GPIO_AF_TIM14: Connect TIM14 pins to AF9

  *            @arg GPIO_AF_OTG_FS: Connect OTG_FS pins to AF10

  *            @arg GPIO_AF_OTG_HS: Connect OTG_HS pins to AF10

  *            @arg GPIO_AF_ETH: Connect ETHERNET pins to AF11

  *            @arg GPIO_AF_FSMC: Connect FSMC pins to AF12

  *            @arg GPIO_AF_OTG_HS_FS: Connect OTG HS (configured in FS) pins to AF12

  *            @arg GPIO_AF_SDIO: Connect SDIO pins to AF12

  *            @arg GPIO_AF_DCMI: Connect DCMI pins to AF13

  *            @arg GPIO_AF_EVENTOUT: Connect EVENTOUT pins to AF15

 

4.使用GPIO_ReadInputData(GPIO_TypeDef* GPIOx)和

GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读输入信号

5.使用GPIO_SetBits()/GPIO_ResetBits()设置输出引脚

6.上电或复位后,引脚备用功能都没启用(JTAG引脚除外),为悬浮输入状态

7.LSE引脚OSC32_IN 和OSC32_OUT(PC14 and PC15)的优先级高于GPIO

8.HSE引脚OSC_IN/OSC_OUT (PH0 / PH1)的优先级高于GPIO

 

例程:

int main(void)

{

 

GPIO_InitTypeDef  GPIO_InitStructure;//定义GPIO结构体

  /* GPIOG Periph clock enable */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOD时钟

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);/使能GPIOA时钟

 

//配置GPIO模式

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

 

//将配置好的结构体作为参数传给GPIO_Init()函数,初始化GPIO

  GPIO_Init(GPIOD, &GPIO_InitStructure);  

 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

 

//将配置好的结构体作为参数传给GPIO_Init()函数,初始化GPIO

  GPIO_Init(GPIOA,&GPIO_InitStructure);

 

  GPIO_SetBits(GPIOD, GPIO_Pin_12);

  GPIO_ResetBits(GPIOD, GPIO_Pin_13);

 

  while (1)

  {

if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){

  GPIO_SetBits(GPIOD, GPIO_Pin_13);

  GPIO_ResetBits(GPIOD, GPIO_Pin_12);

}

else{

  GPIO_SetBits(GPIOD, GPIO_Pin_12);

  GPIO_ResetBits(GPIOD, GPIO_Pin_13);

}

  }

}

 

 

 

文档

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的复用:STM3
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top