寄存器名称和地址的映射分析

8 篇文章 0 订阅
5 篇文章 0 订阅
本文详细介绍了从51单片机到STM32的寄存器操作方式转变,重点解析了STM32如何通过结构体和地址映射实现寄存器操作。在STM32中,MDK使用结构体将寄存器组织起来,通过GPIOA->ODR等表达式进行操作。STM32的寄存器地址由外部总线基地址、APB2基地址和GPIOA基地址等构成,并通过GPIO_TypeDef结构体分配给各个寄存器。
摘要由CSDN通过智能技术生成

首先要清楚的一点, 所有操作, 最终目的都是操作寄存器

同学们在学习STM32时,会看不懂MDK中那些结构体是怎么与寄存器地址对应起来的。这里做一个简要的分析。

1)51单片机:
首先我们看看51中是怎么做的。51单片机开发中经常会引用一个reg51.h的头文件,下面我们看看他是怎么把名字和寄存器联系起来的:

sfr P0=0x80;      //关键字sfr 声明地址和名称的映射
P0=0x00;          //将0x00赋值给P0口的8位(51单片机一组IO为8位)

sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90这一句定义P1为P1端口在片内的寄存器。然后我们往地址为0x80的寄存器设值的方法是:

P0=value;

2)STM32:

那么在STM32中,是否也可以这样做呢??答案是肯定的。肯定也可以通过同样的方式来做,但是STM32因为寄存器太多太多,如果一一以这样的方式列出来,那要好大的篇幅,既不方便开发,也显得太杂乱无序的感觉。所以MDK采用的方式是通过结构体来将寄存器组织在一起。下面我们就讲解MDK是怎么把结构体和地址对应起来的,为什么我们修改结构体成员变量的值就可以达到操作对应寄存器的值。这些事情都是在stm32f10x.h文件中完成的。

GPIOA->ODR=0x00000000     //为GPIOA的ODR寄存器地址赋值0x00000000

二,以GPIOA为例说明STM32寄存器和名称的映射:

GPIOA下的某个寄存器,挂载在GPIOA下,地址为GPIOA基地址+偏移量
GPIOA挂载在APB2总线,地址为APB2总线基地址+GPIOA偏移量
ABP2挂载加外设基地址,地址为外设基地址+ABP2偏移量

源码中可以找到:

//外部总线基地址
#define PERIPH_BASE     ((uint32_t)0x40000000)          

//APB2基地址=外部总线基地址+偏移量
#define APB2PERIPH_BASE     (PERIPH_BASE + 0x10000)     

//GPIOA基地址=APB2基地址+偏移量
#define GPIOA_BASE     (APB2PERIPH_BASE + 0x0800)          

//GPIOA将地址顺序分配给7个32位寄存器(结构体分配)
#define GPIOA     ((GPIO_TypeDef*)GPIOA_BASE)     

//将寄存器地址映射到7个32位寄存器,分别控制
typedef struct                                        
{
     __IO unit32_t CRL;
     __IO unit32_t CRH;
     __IO unit32_t ODR;
     __IO unit32_t IDR;
     __IO unit32_t BSRR;
     __IO unit32_t BRR;
     __IO unit32_t LCKR;
}GPIO_TypeDef;

在STM32手册中:GPIO寄存器地址映像如下:
在这里插入图片描述
如此,实现STM32寄存器名称和地址之间的映射关系.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值