STM32 GPIO 总结

GPIO 外设是挂载在 APB2 总线上的, APB2 的时钟是 APB2 预分频器的输出,而 APB2 预分频器的时钟来源是 AHB 预分频器。因此,把APB2 预分频器设置为不分频,那么我们就可以得到 GPIO 外设的时钟也等于 HCLK(等于系统时钟)。

GPIO 相关寄存器:

   两个32位的配置寄存器 GPIOx->CRL,GPIOx->CRH

 两个32位的数据寄存器  GPIOx->IDR,GPIOx->ODR

 一个32位的 set/reset 寄存器  GPIOx->BSRR

 一位16位的 reset 寄存器 GPIOx->BRR

 一位32位的锁定寄存器  GPIOx->LCKR

GPIO相关结构体:

typedef struct
{
  uint16_t GPIO_Pin;            /* 指定将要进行配置的 GPIO 引脚 */
  GPIOSpeed_TypeDef GPIO_Speed; /* 指定 GPIO 引脚可输出的最高频率 */
  GPIOMode_TypeDef GPIO_Mode;   /* 指定 GPIO 引脚将要配置成的工作状态 */
} GPIO_InitTypeDef;
typedef enum
{
  GPIO_Speed_10MHz = 1,     // 枚举常量值为 1,代表输出速率最高为 10MHz
  GPIO_Speed_20MHz,          // 对不赋值的枚举变量,自动加1此常量值为2
  GPIO_Speed_50MHz          // 常量值为3
} GPIOSpeed_TypeDef;
typedef enum
{ 
  GPIO_Mode_AIN = 0x0,          // 模拟输入模式
  GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入模式
  GPIO_Mode_IPD = 0x28,         // 下拉输入模式
  GPIO_Mode_IPU = 0x48,         // 上拉输入模式
  GPIO_Mode_Out_OD = 0x14,      // 开漏输入模式
  GPIO_Mode_Out_PP = 0x10,      // 通用推挽输出模式
  GPIO_Mode_AF_OD = 0x1C,       // 复用功能开漏输出
  GPIO_Mode_AF_PP = 0x18        // 复用功能推挽输出
} GPIOMode_TypeDef;

8种工作模式:

浮空输入:在芯片内部既没有接上拉,也没有接下拉电阻,经由触发器输入。配置成这个模式直接用电压表测量其引脚电压为1点几伏,这是个不确定值。由于其输入阻抗较大,一般把这种模式用于标准的通信协议如I2C,USART的接收端。

模拟输入:关闭了施密特触发器,不接上,下拉电阻,经由另一线路把电压信号传送到片上外设模块。如传送至ADC模块,由ADC采集电压信号。所以使用ADC外设时,必须设置为模拟输入模式。

上拉输入:若GPIO引脚配置为上拉输入模式,在默认情况下(GPIO引脚无输入),读取得的GPIO引脚数据位1,高电平。

下拉输入:若GPIO引脚配置为下拉输入模式,在默认情况下(GPIO引脚无输入),读取 得的GPIO引脚数据位0,低电平。

推挽输出:在输出高电平时,P-MOS管导通,低电平时,N-MOS管导通。两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力 和开关速度都比普通的方式有很大的提高。推挽输出的低电平为0V,高电平为3.3V

开漏输出:如果我们控制输出为0,低电平,则使N-MOS管导通,使输出接地,若控制输出为1,则既不输出高电平,也不输出低电平,为高阻态。要正常使用必须在外部接一个上拉电阻。它具有线与特性,即多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平,0V。

复用推挽输出/复用开漏输出:可以理解为把GPIO配置为第二功能使用的时候的配置,并非单纯的用作IO输入或输出。比如使用外设IIC时,我们需要把GPIO配置为复用推挽输出,用于数据通信功能。再比如串口通信的TX、以及SPI外设的GPIO使用就要把引脚设置为复用开漏输出。

 GPIO库函数:

      GPIO_Init();  //根据初始化结构体来自定义初始化引脚

      GPIO_StructInit();  //根据默认模式初始化引脚

      GPIO_ReadInputDataBit() / GPIO_ReadInputData()   //获得在输入​​模式下配置的引脚电平

      GPIO_ReadOnputDataBit() / GPIO_ReadOnputData() //获得在输出​​模式下配置的引脚电平

      GPIO_SetBits() / GPIO_ResetBits()  //设置/复位在输出模式下使用的引脚电平

      GPIO_Write() / GPIO_WriteBit()     //将数据写入指定的GPIO数据端口

      GPIO_ToggleBits()   //切换指定的GPIO引脚使用的引脚电平,即是1变0,0变1

GPIO 配置示例:

Void GPIO_Config(void)
{         
    GPIO_InitTypeDef  GPIO_InitStructure;  /*定义一个GPIO_InitTypeDef类型的结构体*/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); /*开启GPIOF的外设时钟*/
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9 | GPIO_Pin_10; /*选择要控制的GPIOF引脚*/
    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT; /*设置引脚模式为通用推挽输出*/
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /*设置引脚速率为100MHz */ 
    GPIO_Init(GPIOF, &GPIO_InitStructure); /*调用库函数,初始化GPIOF*/
}

 

猜你喜欢

转载自blog.csdn.net/lly_3485390095/article/details/83213031