stm32寄存器映射

这章主要介绍我们是如何通过寄存器的映射关系找到寄存器的地址,我们写程序都是在操作和配置寄存器,必须知道他的地址,由于stm32的寄存器数量庞大,不像51一样少。
我们需要用到一个结构体将我们要用到的寄存器映射到相应的地址上,形成一个固件库,方便我们的开发人员迅速找到寄存器对其进行操作和配置,但是由于st公司已经帮我们开发人员做好了固件库,我们只需要学会用就行,这也是为什么st公司的单片机流行的原因,但是对于我们学习者来说,了解这一块内容对于我们对整个开发过程会有一定的帮助

stm32系统框图

在这里插入图片描述

  • STM32 主系统主要由四个驱动单元和四个被动单元构成。
    四个驱动单元是:内核 DCode 总线;系统总线;通用 DMA1;通用 DMA2;
    四被动单元是:AHB 到 APB 的桥:连接所有的 APB 设备;内部 FlASH 闪存;内部 SRAM;FSMC;
  • ① ICode 总线:该总线将 M3 内核指令总线和闪存指令接口相连,指令的预取在该总线上 面完成。
  • ② DCode 总线:该总线将 M3 内核的 DCode 总线与闪存存储器的数据接口相连接,常量 加载和调试访问在该总线上面完成。
  • ③ 系统总线:该总线连接 M3 内核的系统总线到总线矩阵,总线矩阵协调内核和 DMA 间 访问。
  • ④ DMA 总线:该总线将 DMA 的 AHB 主控接口与总线矩阵相连,总线矩阵协调 CPU 的 DCode 和 DMA 到SRAM,闪存和外设的访问。
  • ⑤ 总线矩阵:总线矩阵协调内核系统总线和 DMA 主控总线之间的访问仲裁,仲裁利用 轮换算法。
  • ⑥ AHB/APB 桥:这两个桥在 AHB 和 2 个 APB 总线间提供同步连接,APB1 操作速度限于 36MHz,APB2操作速度全速。

对于系统架构的知识,在刚开始学习 STM32 的时候只需要一个大概的了解,大致知道是个什么情况即可。
注意:特别留意APB的下面挂载的是我们经常使用到的外设,如果我们需要使用到相应的外设时,就必须开启相应的时钟了,对于时钟系统会在后面详细讲解

寄存器的映射

程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB(32位,2^32=4GB)的线性地址空间内。数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。外设寄存器的映像请参考相关章节。
可访问的存储器空间被分成8个主要块,每个块为512MB,分别为block0-7。其他所有没有分配给片上存储器和外设的存储器空间都是保留的地址空间,请参考相应器件的数据手册中的存储器映像图。如图所示:
在这里插入图片描述

  • 由上图可以看到我们使用的外设基本都是挂载在block2上面的,看lock2的外设基地址是0x40000000。如果我们要访问或者写某一个寄存器,就要知道他的地址,我们可以通过一步步找到,外设基地址+挂载在那个总线的基地址+GPIO地址+具体某个寄存器偏移地址。
  • 如GPIOA_BASE_CRL= 0x40000000+0x10000+0x0800+0x00=0x40010800
    在这里插入图片描述
  • 从这个表我们可以看出,GPIOA 的 7 个寄存器都是 32 位的,所以每个寄存器占有 4
    个地址,一共占用 28 个地址,地址偏移范围为(000h~01Bh)。这个地址偏移是相对 GPIOA
    的基地址而言的。GPIOA 的基地址是怎么算出来的呢?因为 GPIO 都是挂载在 APB2 总线
    之上,所以它的基地址是由 APB2 总线的基地址+GPIOA 在 APB2 总线上的偏移地址决定
    的。同理依次类推,我们便可以算出 GPIOA 基地址了。这里设计到总线的一些知识,我们
    在后面会讲到。下面我们打开 stm32f10x.h 定位到 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;
  • 然后定位到:
    #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
    可以看出,GPIOA 是将 GPIOA_BASE 强制转换为 GPIO_TypeDef 指针,这句话的意思是,GPIOA 指向地址 GPIOA_BASE,GPIOA_BASE 存放的数据类型为 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 的基地址,那么那些 GPIOA 的 7 个寄存器的地址又是怎么算出来的呢??在上面我们讲过 GPIOA 的各个寄存器对GPIOA 基地址的偏移地址,所以我们自然可以算出来每个寄存器的地址。
    GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相对 GPIOA 基地址的偏移值
    这个偏移值在上面的寄存器地址映像表中可以查到。
    那么在结构体里面这些寄存器又是怎么与地址一一对应的呢?这里就涉及到结构体的
    一个特征,那就是结构体存储的成员他们的地址是连续的。上面讲到 GPIOA 是指向
    GPIO_TypeDef 类型的指针,又由于 GPIO_TypeDef 是结构体,所以自然而然我们就可以算
    出 GPIOA 指向的结构体成员变量对应地址了。
    在这里插入图片描述

  • 我们可以把 GPIO_TypeDef 的定义中的成员变量的顺序和 GPIOx 寄存器地址映像对比可以发现,他们的顺序是一致的,如果不一致,就会导致地址混乱了。
    这就是为什么固件库里面:GPIOA->BRR=value;就是设置地址为 0x40010800
    +0x014(BRR 偏移量)=0x40010814 的寄存器 BRR 的值了。它和 51 里面 P0=value 是设置地址为 0x80 的 P0 寄存器的值是一样的道理。
    看到这里你是否会学起来踏实一点呢??STM32 使用的方式虽然跟 51 单片机不一样,但是原理都是一致的。
    在这里插入图片描述

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32中,寄存器操作是通过直接访问寄存器来对硬件进行配置和控制的一种方式。这种操作方式可以使用寄存器地址和指针来实现。STM32系列芯片提供了一个头文件stm32f10x.h,其中包含了寄存器与地址的映射关系。通过引用这个头文件,我们可以使用寄存器的具体名称而不是地址来进行操作。 要找到所需的寄存器,我们可以使用C语言中的指针和取地址操作符(&)。类似于使用scanf语句从控制台输入一个变量时需要使用&符号来获取变量的地址一样,不同的寄存器有不同的地址。因此,要找到对应的寄存器,我们只需找到对应的地址即可[2]。 在学习STM32的过程中,大部分人最初可能会使用标准库版本,对于寄存器操作可能不太熟悉。寄存器是CPU内部用来存放数据的小型存储区域,用于临时存放参与运算的数据和运算结果。 综上所述,STM32寄存器操作是通过直接访问寄存器来配置和控制硬件,可以使用寄存器地址和指针来实现。为方便使用,STM32提供了一个头文件stm32f10x.h,其中包含了寄存器与地址的映射关系。使用指针和取地址操作符(&),我们可以找到所需寄存器的地址。寄存器是CPU内部用于存放数据的小型存储区域,用于临时存放参与运算的数据和运算结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32寄存器的简介、地址查找,与直接操作寄存器](https://blog.csdn.net/geek_monkey/article/details/86291377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [关于STM32寄存器操作学习](https://blog.csdn.net/lemou1211/article/details/129170414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值