STM32F4GPIO

eg:STM32F407ZGT6

目录

1:引脚说明

 2:GPIO工作方式

3:GPIO端口的寄存器

4:GPIO复用功能

 5:注意事项


1:引脚说明

一共有7组IO口;

每组IO口有16个IO;

SO 一共16*7=112个IO,外加两个PH0和PH1一共114个IO口

GPIOA~G,PH0,PH1;

 2:GPIO工作方式

4钟输入模式:

  • 输入浮空  //一般多用于外部按键输入,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定
  • 输入上拉  //上下拉这个很好理解,不多说
  • 输入下拉
  • 模拟输入 //应用ADC模拟输入,或者低功耗下省电

4钟输出模式:

  •  开漏输出         (带上拉或下拉)  //输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合做电流型驱                                                                 动。其吸收电流的能力相对强(一般20MA以内)
  • 开漏复用功能   (带上拉或下拉) //可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
  • 推挽式输出       (带上拉或下拉) //能提高电路的负载能力,又提高开关速度
  • 推挽式复用功能(带上拉或下拉)

4钟最大输出速度

  • 2M
  • 25M
  • 50M
  • 100M
/*操作GPIOx_MODER寄存器*/
typedef enum
{ 
  GPIO_Mode_IN   = 0x00, //输入(复位状态)
  GPIO_Mode_OUT  = 0x01, //通用输出模式
  GPIO_Mode_AF   = 0x02, //复用输出模式
  GPIO_Mode_AN   = 0x03  //模拟模式
}GPIOMode_TypeDef;


/*操作GPIOx_OTYPER寄存器*/
typedef enum
{ 
  GPIO_OType_PP = 0x00,//推挽输出(复位状态)
  GPIO_OType_OD = 0x01 //开漏输出
}GPIOOType_TypeDef;

/*操作GPIOx_PUPDR寄存器*/
typedef enum
{ 
  GPIO_PuPd_NOPULL = 0x00, //无上拉或下拉
  GPIO_PuPd_UP     = 0x01, //上拉
  GPIO_PuPd_DOWN   = 0x02  //下拉
}GPIOPuPd_TypeDef;


/*操作GPIOx_OSPEEDR寄存器*/
typedef enum
{ 
  GPIO_Low_Speed     = 0x00, /*!< Low speed    2M  */
  GPIO_Medium_Speed  = 0x01, /*!< Medium speed 25M */
  GPIO_Fast_Speed    = 0x02, /*!< Fast speed   50M */
  GPIO_High_Speed    = 0x03  /*!< High speed   30pf时为100M(高速) 15pf时为80M输出(最大速度)*/
}GPIOSpeed_TypeDef;

/* Add legacy definition */
#define  GPIO_Speed_2MHz    GPIO_Low_Speed    
#define  GPIO_Speed_25MHz   GPIO_Medium_Speed 
#define  GPIO_Speed_50MHz   GPIO_Fast_Speed 
#define  GPIO_Speed_100MHz  GPIO_High_Speed  

比如现在我要配置PA9,10为串口1 --推挽复用上拉输出,速度为50M则

//USART1端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;            //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;          //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;            //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure);                   //初始化PA9,PA10

          

3:GPIO端口的寄存器

  1. 一个端口模式寄存器(GPIOx_MODER)
  2. 一个端口输出类型寄存器(GPIOx_OTYPER)
  3. 一个端口输出速度寄存器(GPIOx_OSPEEDR)
  4. 一个端口上拉下拉寄存器(GPIOx_PUPDR)
  5. 一个端口输入数据寄存器(GPIOx_IDR)
  6. 一个端口输出数据寄存器(GPIOx_ODR)
  7. 一个端口置位/复位寄存器(GPIOx_BSRR)
  8. 一个端口配置锁存寄存器(GPIOx_LCKR)
  9. 两个复位功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)

前4个为32位的配置寄存器,5,6为2个32位的数据寄存器

详细的自己去看数据手册吧~~~~~~

4:GPIO复用功能

STM32大部分引脚除了当GPIO使用以外,还可以复用为外设功能引脚

FT表示该引脚可以复用

复用功能实际上就是操作的AFRL\H寄存器

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
  uint32_t temp = 0x00;
  uint32_t temp_2 = 0x00;
  
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  assert_param(IS_GPIO_AF(GPIO_AF));
  
  temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
/************操作AFR寄存器************************/
  temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
}

 5:注意事项

  • PD0,PD1用于输出的时候仅能用于50M的输出速度
  • PC13,PC14,PC15只能用于2M的输出模式,最多只能带30PF的负载,并且同时只能使用一个引脚!!!

猜你喜欢

转载自blog.csdn.net/qq_41867145/article/details/106153805