1.封装函数参数:⽤结构体变量做为函数的参数,可以为函数传⼊多个参数;
2.定义通信协议体:将通信协议的固定格式⽤结构体定义,收到数据后直接套⽤(将收到的数据读到协议结构体定定的变量中),实现对协议解析;3.将MCU相关的寄存器组织在⼀起:把结构体和寄存器的地址对应起来,可以通过操作结构体来达到操作MCU寄存器的⽬的;3.1.例:MCU⽚上外设GPIOA的寄存器在数据⼿册中的定义如下:
GPIOA寄存器定义
GPIOA基地址偏移0x000x040x080x0C0x100x140x180x1C0x200x240x280x2C0x40000000 寄存器
GPIOA_MODERGPIOA_OTYPERGPIOA_OSPEEDERGPIOA_PUPDRGIPOA_IDRGIPOA_ODRGPIOA_BSSRGPIOA_LCKRGPIOA_AFRLGPIOA_AFRHGPIOA_BRRGPIOA_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,就可以访
因篇幅问题不能全部显示,请点此查看更多更全内容