ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

stm32 GPIO的使用

2022-06-25 19:31:46  阅读:173  来源: 互联网

标签:输出 TypeDef GPIOx 使用 stm32 IO 寄存器 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有