郞性人生

导航

C 语言 —— struct 结构体作用

1.封装函数参数:用结构体变量做为函数的参数,可以为函数传入多个参数;

2.定义通信协议体:将通信协议的固定格式用结构体定义,收到数据后直接套用(将收到的数据读到协议结构体定定的变量中),实现对协议解析;

3.将MCU相关的寄存器组织在一起:把结构体和寄存器的地址对应起来,可以通过操作结构体来达到操作MCU寄存器的目的;

3.1.例:MCU片上外设GPIOA的寄存器在数据手册中的定义如下:

GPIOA寄存器定义
GPIOA基地址 0x40000000
偏移 寄存器
0x00 GPIOA_MODER
0x04 GPIOA_OTYPER
0x08 GPIOA_OSPEEDER
0x0C GPIOA_PUPDR
0x10 GIPOA_IDR
0x14 GIPOA_ODR
0x18 GPIOA_BSSR
0x1C GPIOA_LCKR
0x20 GPIOA_AFRL
0x24 GPIOA_AFRH
0x28 GPIOA_BRR
0x2C GPIOA_ASCR

 

3.2.GPIOA寄存器对应的结构体为(在stm32xxxxxx.h中定义):

typedef struct
{
__IO uint32_t MODER;     //Cortex-M为32位MCU,每个寄存器为32bit,刚好对应uint32_t类型 ,结构体成员都为4字节对齐,每个成员的偏移量与上表中的偏移量同好相等
__IO uint32_t OTYPER;
__IO uint32_t OSPEEDR;
__IO uint32_t PUPDR;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t LCKR;
__IO uint32_t AFR[2];
__IO uint32_t BRR;
__IO uint32_t ASCR;
} GPIO_TypeDef;

 

3.3.宏定义将GPIOA的结构体与寄存器地址对应起来:GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相对 GPIOA 基地址的偏移值

#define PERIPH_BASE (0x40000000UL)                      //datasheet中外设基址址
#define AHB2PERIPH_BASE (PERIPH_BASE + 0x08000000UL)    //挂在AHB2上的外设基地址
#define GPIOA_BASE (AHB2PERIPH_BASE + 0x0000)           //GPIOA的基地址GPIOA_BASE= 0x40000000+0x08000000+0x0000=0x48000000
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)             //寄存器地址与寄存器结构体建立联系,GPIOA 为 一个 结构体GPIO_TypeDef 类型的指针,就可以用结构体指针访问结构体成员的方法,访问结体成员 如:GPIOA->MODER,就可以访问MODER寄存器

 

 

posted on 2019-01-16 17:27  郞性人生  阅读(648)  评论(0)    收藏  举报