32MDK 中寄存器地址名称映射分析_04

以GPIOA为例,GPIOA 的 7 个寄存器都是 32 位的,所以每个寄存器占有 4 个字节地址,一共占用 28 个字节地址,地址偏移范围为(000h~01Bh),地址偏移是相对 GPIOA 的基地址而言的。GPIO 都是挂载在 APB2 总线 上,所以它的基地址是由 APB2 总线的基地址+GPIOA 在 APB2 总线上的偏移地址。同理依次类推,便可以算出 GPIOA 基地址;GPIO_TypeDef 定义:

typedef struct
{
 __IO uint32_t CRL;
 __IO uint32_t CRH;
 __IO uint32_t IDR;
 __IO uint32_t ODR;
 __IO uint32_t BSRR;
 __IO uint32_t BRR;
 __IO uint32_t LCKR;
} GPIO_TypeDef;
//查看GPIOA宏定义,GPIOA 将 GPIOA_BASE 强制转换为 GPIO_TypeDef 指针;
//GPIOA 指向地址 GPIOA_BASE,GPIOA_BASE 存放的数据类型为 GPIO_TypeDef
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
//“Go to definition of ”,查看 GPIOA_BASE的宏定义:
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
//依次类推,找到最顶层:
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)

可计算出GPIOA的基地址:GPIOA_BASE= 0x40000000+0x10000+0x0800=0x40010800

结构体存储的成员地址是连续的,GPIO_TypeDef是结构体,所以就知道各成员变量对应的地址

GPIO_TypeDef 的定义的成员变量的顺序和 GPIOx 寄存器地址映像的顺序是一致的,如果不一致,就会导致地址混乱。GPIOA->BRR=value(访问GPIO_TypeDef指针GPIOA指向的结构体的成员变量BRR)就是设置地址为 0x40010800 +0x014(BRR 偏移量)=0x40010814 的寄存器 BRR 的值

结构体成员变量的引用方法是: 结构体变量名字.成员名

比如要引用 usart1 的成员 BaudRate,方法是:usart1.BaudRate;

结构体指针变量定义也是一样的,跟其他变量没有啥区别。

例如:struct U_TYPE *usart3;//定义结构体指针变量 usart3;

结构体指针成员变量引用方法是通过“->”符号实现,比如要访问 usart3 结构体指针指向的结构体的成员变量 BaudRate,方法是: Usart3->BaudRate;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值