GPIO和AFIO的通用和复用功能详解

一、通用和复用功能I/O(GPIO和AFIO)

1、GPIO_Mode

GPIO端口的每个位可以由软件分别配置 成多种模式。
─ 输入浮空 GPIO_Mode_IN_FLOATING
─ 输入上拉 GPIO_Mode_IPU
─ 输入下拉 GPIO_Mode_IPD
─ 模拟输入 GPIO_Mode_AIN
─ 开漏输出 GPIO_Mode_Out_OD
─ 推挽式输出 GPIO_Mode_Out_PP
─ 推挽式复用功能 GPIO_Mode_AF_PP
─ 开漏复用功能 GPIO_Mode_AF_OD

image-20220406173546435

  • 通用I/O(GPIO)
  • 当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推 挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
    输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
    所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。

  • 复用功能(AF)
  • 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部 驱动

    对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)

    对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被 配置成浮空输入模式

    2、GPIO_Speed

    GPIO_Speed 用以设置选中管脚的速率。

    image-20220406173959298

    二、GPIO固件库函数

    1、开启GPIO时钟

    RCC库函数 RCC_APB2PeriphClockCmd 使能或者失能 APB2 外设时钟
    参数1:
    RCC_AHB2Periph 描述
    RCC_APB2Periph_AFIO 功能复用 IO 时钟
    RCC_APB2Periph_GPIOA GPIOA 时钟
    RCC_APB2Periph_GPIOB GPIOB 时钟
    RCC_APB2Periph_GPIOC GPIOC 时钟
    RCC_APB2Periph_GPIOD GPIOD 时钟
    RCC_APB2Periph_GPIOE GPIOE 时钟
    RCC_APB2Periph_ADC1 ADC1 时钟
    RCC_APB2Periph_ADC2 ADC2 时钟
    RCC_APB2Periph_TIM1 TIM1 时钟
    RCC_APB2Periph_SPI1 SPI1 时钟
    RCC_APB2Periph_USART1 USART1 时钟
    RCC_APB2Periph_ALL 全部 APB2 外设时钟
    输入参数2:
    参数可以取: ENABLE 或者 DISABLE
    以PC13为例:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

    //函数原形:
    void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
    
    2、初始化函数
    typedef enum
    { 
      GPIO_Speed_10MHz = 1,
      GPIO_Speed_2MHz, 
      GPIO_Speed_50MHz
    }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;//模式选择
    
    typedef struct
    {
      uint16_t GPIO_Pin;             
      GPIOSpeed_TypeDef GPIO_Speed;                                   
      GPIOMode_TypeDef GPIO_Mode;                                    
    }GPIO_InitTypeDef;//结构体
    
    #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
    #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 
    
    #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
    #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 
    
    #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
    #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 
    
    #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
    #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 
    
    #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
    #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入
    
    #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
    #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入
    
    #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
    #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入
    
    void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)//初始化参数GPIO端口和结构体指针变量
        
    void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//设置高电平
       
    void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//设置地电平
    
    3、实例
    #include "led.h"
    #include <stm32f10x_rcc.h>
    
    void LED_Init()
    {	
    	GPIO_InitTypeDef GPIO_InitStruct;
    	//使能GPIOC时钟——>APB2
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;//GPIOC13
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    	//初始化GPIOC13引脚,设置输出模式
    	GPIO_Init(GPIOC,&GPIO_InitStruct);
    	GPIO_SetBits(GPIOC,GPIO_Pin_13);//设置为高电平
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » GPIO和AFIO的通用和复用功能详解

    发表评论