GPIOA寄存器定义GPIOA基地址0x40000000
偏移寄存器
0x00GPIOA_MODER
0x04GPIOA_OTYPER
0x08GPIOA_OSPEEDER 0x0C GPIOA_PUPDR
0x10GIPOA_IDR
0x14GIPOA_ODR
0x18GPIOA_BSSR
0x1C GPIOA_LCKR
0x20GPIOA_AFRL
0x24GPIOA_AFRH
c语言struct头文件
0x28GPIOA_BRR
0x2C GPIOA_ASCR C语⾔——struct结构体作⽤
1.封装函数参数:⽤结构体变量做为函数的参数,可以为函数传⼊多个参数;
2.定义通信协议体:将通信协议的固定格式⽤结构体定义,收到数据后直接套⽤(将收到的数据读到协议结构体定定的变量中),实现对协议解析;
3.将MCU相关的寄存器组织在⼀起:把结构体和寄存器的地址对应起来,可以通过操作结构体来达到操作MCU寄存器的⽬的;
3.1.例:MCU⽚上外设GPIOA的寄存器在数据⼿册中的定义如下:
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,就可以访
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论