其他分享
首页 > 其他分享> > stm32 GPIO的使用

stm32 GPIO的使用

作者:互联网

 

STM32F4 的 IO 可以由软件配置成如下 8 种模式中的任何一种:

        1、输入浮空

        2、输入上拉

        3、输入下拉

        4、模拟输入

        5、开漏输出

        6、推挽输出

        7、推挽式复用功能

        8、开漏式复用功能

 

IO 配置常 用的 8 个寄存器: MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR 、AFRH 和 AFRL。

MODER 寄存器 :该寄存器是 GPIO 端口模式控制寄存器,用于控制 GPIOx (STM32F4 最多有 9 组 IO,分别用大写字母表示,即 x=A/B/C/D/E/F/G/H/I,下同)的工作模 式。

OTYPER 寄存器:该寄存器用于控制 GPIOx 的输出类型。

OSPEEDR 寄存器:该寄存器用于控制 GPIOx 的输出速度。

PUPDR 寄存器:该寄存器用于控制 GPIOx 的上拉/下拉。

 

操作四个配置寄存器初始化 GPIO 是通过 GPIO 初始化函数完成:

       void GPIO_Init  ( GPIO_TypeDef* GPIOx  ,  GPIO_InitTypeDef* GPIO_InitStruct )

这个函数有两个参数,第一个参数是用来指定需要初始化的 GPIO 对应的 GPIO 组,取值范围 为 GPIOA~GPIOK。

          第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。                       

          typedef struct
          {
            uint32_t GPIO_Pin;
            GPIOMode_TypeDef GPIO_Mode;
            GPIOSpeed_TypeDef GPIO_Speed;
            GPIOOType_TypeDef GPIO_OType;
            GPIOPuPd_TypeDef GPIO_PuPd;
          }

          GPIO_InitTypeDef;

    

  通过初始化结构体初始化 GPIO 的常用格式是:
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9//GPIOF9
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO

上面代码的意思是设置 GPIOF 的第 9 个端口为推挽输出模式,同时速度为 100M,上拉。

 

  结构体 GPIO_InitStructure 的 第一个成员变量 GPIO_Pin 用来 设置是要初始化哪个或者哪些 IO 口。

  第二个成员变量 GPIO_Mode 是用来设置 对应 IO 端口的输出输入端口模式,这个值实际就是配置 GPIOx 的 MODER 寄 存器的值。

    GPIO_Mode_IN 是用来设置为复位状态的输入

    GPIO_Mode_OUT 是通用输出模式
    GPIO_Mode_AF 是复用功能模式

    GPIO_Mode_AN 是模拟输入模式。

 

  第三个参数 GPIO_Speed 是 IO 口输出速度设置,有四个可选值。实际上这就是配置的 GPIO 对应的 OSPEEDR 寄存器的值。

       GPIO_Speed_2MHz      or     GPIO_Low_Speed
    GPIO_Speed_25MHz     or     GPIO_Medium_Speed
    GPIO_Speed_50MHz   or   GPIO_Fast_Speed
    GPIO_Speed_100MHz or  GPIO_High_Speed

 

  第四个参数 GPIO_OType 是 GPIO 的输出类型设置,实际上是配置的 GPIO 的 OTYPER 寄 存器的值。

 

    输出推挽模式 :  GPIO_OType_PP,

    输出开漏模式 :  GPIO_OType_OD。

 

  第五个参数 GPIO_PuPd 用来设置 IO 口的上下拉,实际上就是设置 GPIO 的 PUPDR 寄存 器的值。

    GPIO_PuPd_NOPULL 为不使用上下拉

    GPIO_PuPd_UP 为上拉,

    GPIO_PuPd_DOWN 为下拉。

 

  ODR 寄存器,该寄存器用于控制 GPIOx 的输出该寄存器用于设置某个 IO 输出低电平(ODRy=0)还是高电平(ODRy=1),该寄存器也仅在输 出模式下有效,在输入模式(MODER[1:0]=00/11 时)下不起作用。

  在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现 的:

     void GPIO_Write(GPIO_TypeDef* GPIOx   ,   uint16_t PortVal);

  该函数一般用来往一次性一个 GPIO 的多个端口设值。 使用实例如下: GPIO_Write(GPIOA,0x0000);   大部分情况下,设置 IO 口我们都不用这个函数

  同时读 ODR 寄存器还可以读出 IO 口的输出状态

  库函数为: uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);         uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

  这两个函数功能类似,只不过前面是用来一次读取一组 IO 口所有 IO 口输出状态,后面的函数 用来一次读取一组 IO 口中一个或者几个 IO 口的输出状态。

 

  IDR 寄存器,该寄存器用于读取 GPIOx 的输入,该寄存器用于读取某个 IO 的电平,如果对应的位为 0(IDRy=0),则说明该 IO 输入的是低 电平,如果是 1(IDRy=1),则表示输入的是高电平

  库函数相关函数为: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);   uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

  前面的函数是用来读取一组 IO 口的一个或者几个 IO 口输入电平,后面的函数用来一次读取一 组 IO 口所有 IO 口的输入电平。比如我们要读取 GPIOF.5 的输入电平,方法为:                         GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_5);

 

  32 位置位/复位寄存器 (BSRR),这个寄存器是用来置位或者 复位 IO 口,该寄存器和 ODR 寄存器具有类似的作用,都可以用来设置 GPIO 端口的输出位是 1 还是 0。

  BSRR 寄存器使用方法如下:

      GPIOA->BSRR=1<<1; //设置 GPIOA.1 为高电平

      GPIOA->BSRR=1<<(16+1)//设置 GPIOA.1 为低电平;

 

  库函数操作 BSRR 寄存器来设置 IO 电平的函数为:

      void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

      void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

  函数 GPIO_SetBits 用来设置一组 IO 口中的一个或者多个 IO 口为高电平。

  GPIO_ResetBits 用来 设置一组 IO 口中一个或者多个 IO 口为低电平。

    设置 GPIOB.5 输出高,方法为: GPIO_SetBits(GPIOB,GPIO_Pin_5);//GPIOB.5 输出高

    设置 GPIOB.5 输出低电平,方法为: GPIO_ResetBits(GPIOB,GPIO_Pin_5);//GPIOB.5 输出低

 

  操作GPIO步骤为: (1) 使能 IO 口时钟。调用函数为 RCC_AHB1PeriphClockCmd ()。

             (2) 初始化 IO 参数。调用函数 GPIO_Init();

             (3) 操作 IO。

 

标签:输出,TypeDef,GPIOx,使用,stm32,IO,寄存器,GPIO
来源: https://www.cnblogs.com/zanshuai/p/16412251.html