C 语言 —— struct 结构体作用
1.封装函数参数:用结构体变量做为函数的参数,可以为函数传入多个参数;
2.定义通信协议体:将通信协议的固定格式用结构体定义,收到数据后直接套用(将收到的数据读到协议结构体定定的变量中),实现对协议解析;
3.将MCU相关的寄存器组织在一起:把结构体和寄存器的地址对应起来,可以通过操作结构体来达到操作MCU寄存器的目的;
3.1.例:MCU片上外设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寄存器
浙公网安备 33010602011771号