STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)-LMLPHP

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)-LMLPHP

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

首先,这个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来操作!

04-02 22:57