以通俗易懂方式理解结构体

以stm32官方库为例:定义一个结构体,内部有7个成员
可以理解为:某个学生参与测试,而他有7个属性值可测
而结构体,是一个类型名
类似于int,char

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

我们可以理解为,

typedef struct//定义一个“属性表”
{
  __IO uint32_t 身高;
  __IO uint32_t 体重;
  __IO uint32_t 性别;
...
} 成员;

因为 由stm32f10x.h有:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

((GPIO_TypeDef *) GPIOA_BASE)表示将GPIOA_BASE强转换为指针类型的结构体, 表示用GPIOA 替代(GPIO_TypeDef *) GPIOA_BASE,那么现在GPIOA就表示 以 GPIOA_BASE为基地址、类型为GPIO_TypeDef结构体的一个指针,所以你程序里可以用GPIOA->CRL,但是GPIOA->CRH的地址值为GPIOA_BASE+4;(偏移量)

其次针对GPIO_InitTypeDef GPIO_InitStructure;这句话什么意思?
声明一个结构体,这个结构体名字是GPIO_InitStructure,结构体原型由GPIO_InitTypeDef 确定,相当于小明作为一个成员去参与测试,然后小明可以选择参与测试身高、体重…

而本身这个结构体是这样的
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;

stm32里面初始化GPIO用的。设置完了GPIO_InitStructure里面的内容后,
GPIO_InitStructure就可以调用其成员,在GPIO_Init (GPIO_TypeDef GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)里面调用,
比如初始化pa口,就是GPIO_Init (GPIOA, &GPIO_InitStructure),括号里后面声明的那个结构体的基地址
GPIO_TypeDef GPIOx:即GPIOA…G
GPIO_InitTypeDef
GPIO_InitStruct即&GPIO_InitStructure

上一篇:GaussDB 100单机版安装初体验


下一篇:GaussDB T HA模式部署