其他分享
首页 > 其他分享> > 以通俗易懂方式理解结构体

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

作者:互联网

以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

标签:__,TypeDef,通俗易懂,理解,IO,GPIO,uint32,GPIOA,结构
来源: https://blog.csdn.net/u014439531/article/details/123200778