结构体是C语言中一种非常重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型,例如整数、浮点数等。其描述了某一块内存区间的大小及解释意义。结构体通常用来表示类型不同但是又相关的数据,结构体成员在内存中是依次排列的,但是定义之后是只有名称没有地址的。

//名称有了但是地址不能确定
typedef struct{
uint32_t CRL;
uint32_t CRH;
uint32_t IDR;
uint32_t ODR;
uint32_t BSRR;
uint32_t BRR;
uint32_t LCKR;
}GPIO_TypeDef

//GPIOx_CRL、GPIOx_CRH有地址,没名字

//通过下面的方式进行联系
(GPIO_TypeDef*)GPIOC_BASE

//引用成员
((GPIO_TypeDef*)GPIOC_BASE) -> ODR

//但是很明显,太长了不太好用因此使用宏定义
#define GPIOC (GPIO_TypeDef*)GPIOC_BASE
GPIOC -> ODR

main.h文件

#define PERIPH_BASE           ((unsigned int)0x40000000)

#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
/* AHB总线基地址 */
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)

/*GPIOC外设基地址*/
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)

/*RCC外设基地址*/
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)

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

//根据自己的需要进行定义
typedef struct
{
uint32_t CR;
uint32_t CFGR;
uint32_t CIR;
uint32_t APB2RSTR;
uint32_t APB1RSTR;
uint32_t AHBENR;
uint32_t APB2ENR;
uint32_t APB1ENR;
uint32_t BDCR;
uint32_t CSR;
}RCC_TypeDef;

#define GPIOC ((GPIO_TypeDef*)GPIOC_BASE)
#define RCC ((RCC_TypeDef*)RCC_BASE)

main.c文件

#include "main.h"

int main(void){
RCC->APB2ENR |= 1<<4;
GPIOC->CRH &=~(0x0F<<(4*5));
GPIOC->CRH |=(1<<(4*5));
GPIOC->ODR &=~(1<<13);

while(1);
}

void SystemInit(){

}