stm32 GPIO的使用

您所在的位置:网站首页 straybirds怎么读 stm32 GPIO的使用

stm32 GPIO的使用

2023-11-22 08:16| 来源: 网络整理| 查看: 265

 

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3