以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