STM32学习和实践笔记(4): 分析和理解GPIO

您所在的位置:网站首页 GPIO端口的初始化过程是什么 STM32学习和实践笔记(4): 分析和理解GPIO

STM32学习和实践笔记(4): 分析和理解GPIO

2024-06-30 16:12| 来源: 网络整理| 查看: 265

深入分析及学习一下上面这一段代码的构成与含义。

首先,这个GPIO_InitTypeDef GPIO_InitStructure;其实与int a 是完全类似的语法格式以及含义。

GPIO_InitStructure就相当于a这样一个变量。不过从这个变量的名字可以知道,这是一个用于GPIO初始化的结构体类型变量而已。

GPIO_InitTypeDef,就相当于int这样的类型声明。不过很明显的,GPIO_InitTypeDef是一个自定义的数据类型。它到底是一个什么样的类型?从后面的跟的这个GPIO_InitStructure,可以大概猜测它是一个结构体类型。

那么通过右键go to define,找到这个GPIO_InitTypeDef的定义如下:

/** * @brief GPIO Init structure definition */ typedef struct { uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */ GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef;

很明显这是一个结构体。这个结构体本身没有命名,但是通过 type struct{}GPIO_InitTypeDef的方式,将这个结构体类型起了一个别名GPIO_InitTypeDef,这样定义之后,就可以直接使用GPIO_InitTypeDef作为这个结构体类型的声明。

也就是我前面说的,使用GPIO_InitTypeDef GPIO_InitStructure;其实与int a 是完全类似的语法格式以及含义!

跟int a声明后应该给a 赋值一样,GPIO_InitTypeDef GPIO_InitStructure之后,也需要为这个GPIO_InitStructure结构构体变量指明它的值。而这个结构体变量里有三个成员,所以就要分别为这三个成员指定相应的值。

所以后面的:

    GPIO_InitStructure.GPIO_Pin=LED_PIN;      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    

就是给这个结构体变量成员分别赋值。

在这个结构体内,有三个成员变量。它们的每一个也其实与int a 是完全类似的语法格式以及含义。

第一个成员变量是uint16_t GPIO_Pin;  

这个uint16_t,是用这个typedef unsigned short     int uint16_t 语句得到一个别名,其含义就是unsigned short     int,这是一个无符号16位整型数据。

GPIO_Pin则是像int a的a一样的变量名称,通过这个名字我们可以了解到,这个变量表示的是GPIO_Pin的引脚。

通过后面的这条注释语句: /*!< Specifies the GPIO pins to be configured.                                       This parameter can be any value of @ref GPIO_pins_define */

用GPIO_pins_define查找,这个变量取下面这些值才是有意义,有相应的作用:

/** @defgroup GPIO_pins_define    * @{   */

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */ #define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */ #define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */ #define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */ #define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */ #define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */ #define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */ #define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */ #define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */ #define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */ #define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */ #define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */ #define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */ #define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */ #define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */ #define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */ #define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */

#define IS_GPIO_PIN(PIN)   ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) != (uint16_t)0x00))

#define IS_GET_GPIO_PIN(PIN)   (((PIN) == GPIO_Pin_0) || \                               ((PIN) == GPIO_Pin_1) || \                               ((PIN) == GPIO_Pin_2) || \                               ((PIN) == GPIO_Pin_3) || \                               ((PIN) == GPIO_Pin_4) || \                               ((PIN) == GPIO_Pin_5) || \                               ((PIN) == GPIO_Pin_6) || \                               ((PIN) == GPIO_Pin_7) || \                               ((PIN) == GPIO_Pin_8) || \                               ((PIN) == GPIO_Pin_9) || \                               ((PIN) == GPIO_Pin_10) || \                               ((PIN) == GPIO_Pin_11) || \                               ((PIN) == GPIO_Pin_12) || \                               ((PIN) == GPIO_Pin_13) || \                               ((PIN) == GPIO_Pin_14) || \                               ((PIN) == GPIO_Pin_15))

也就是当GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 ; 时,其实就是将对应的该引脚的寄存器地址给了GPIO_InitStructure.GPIO_Pin,这就表示,选中了GPIO_Pin_0来操作!



【本文地址】


今日新闻


推荐新闻


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