首页 > 其他分享 >寄存器映射及地址计算(STM32F407)

寄存器映射及地址计算(STM32F407)

时间:2024-09-07 22:25:16浏览次数:15  
标签:映射 偏移量 GPIOB 地址 寄存器 STM32F407 外设

上篇文章介绍了存储器映射(存储器映射(STM32F407)-CSDN博客),本文介绍寄存器映射的基本概念。

1、寄存器映射简介

寄存器是一类特殊的存储器,它的每个位都有特定的功能,可以实现对外设/功能的控制,给寄存器的地址命名的过程就叫寄存器映射。

举个简单的例子,大家家里面的纸张就好比通用存储器,用来记录数据是没问题的,但是不会有具体的动作,只能做记录,而你家里面的电灯开关,就好比寄存器。假设你家有8个灯, 就有8个开关(相当于一个8位寄存器),这些开关可以记录状态,同时还能让电灯点亮/关闭, 是会产生具体动作的。为了方便区分和使用,我们会给每个开关命名,比如厨房开关、大厅开关、卧室开关等,这个命名过程,就是映射。我们给STM32的寄存器命名,就是寄存器映射。

2、寄存器描述解读

寄存器描述是指对计算机中寄存器的功能、特性、使用方式等进行详细说明的文档或信息。寄存器描述可以在对应单片机的参考手册中查找。

以GPIO的ODR寄存器为例,其参考手册的描述如下图所示:

①寄存器名字

每个寄存器都有一个对应的名字,以简单表达其作用,并方便记忆,这里GPIOx_ODR表示寄存器英文名。例如,若x可以从A~E,说明有5个这样的寄存器,上图中,x=A~I,说明有9个这样的寄存器。

寄存器偏移量及复位值

地址偏移量表示该寄存器的地址相对其外设基地址的偏移,比如GPIOB,由存储器映射图可知其外设基地址是:0x4002 0400。那么GPIOB_ODR寄存器的地址就是:0x4002 0414。知道了外设基地址和地址偏移量,我们就可以知道任何一个寄存器的实际地址。

复位值表示该寄存器在系统复位后的默认值,可以用于分析外设的默认状态。

寄存器位表

描述寄存器每一个位的作用(共32bit),这里表示ODR寄存器的第15位(bit),位名字为 ODR15,rw表示该寄存器可读写(r,可读取;w,可写入)。

位功能描述

描述寄存器每个位的功能,这里表示位0~15,对应ODR0~ODR15,每个位控制一个IO口的 输出状态。

其他寄存器描述,参照以上方法解读。

3、寄存器映射举例

从前文叙述,我们知道 GPIOB_ODR 寄存器的地址为:0x4002 0414,假设我们要控制 GPIOB 的 16 个 IO 口都输出 1,则可以写成:

*(unsigned int *)(0x40020414) = 0XFFFF;

这里我们先要将 0x4002 0414 强制转换成 unsigned int 类型指针,然后用 “ * ” 对这个指针的值进行设置,从而完成对 GPIOB_ODR 寄存器的写入。

这样写代码功能是没问题,但是可读性和可维护性都很差,使用起来极其不便,因此我们 将代码改为:

#define  GPIOB_ODR      *(unsigned int *)    (0x40020414)

GPIOB_ODR = 0XFFFF;

这样,我们就定义了一个 GPIOB_ODR 的宏,来替代数值操作,很明显,GPIOB_ODR 的可读性和可维护性,比直接使用数值操作来的直观和方便。这个宏定义过程就可以称之为寄存器的映射。

实际上大量寄存器的映射,使用结构体是最方便的方式,stm32f407xx.h 里面使用结构体方式对 STM32F407 的寄存器做了详细映射。

4、寄存器地址计算

STM32F407大部分外设寄存器地址都是在存储块2上面的,见存储器映射图(存储器映射(STM32F407)-CSDN博客)。具体某个寄存器地址,由三个参数决定:

1、总线基地址(BUS_BASE_ADDR);

2,外设基于总线基地址的偏移量(PERIPH_OFFSET);

3,寄存器相对外设基地址的偏移量(REG_OFFSET)。

可以表示为:

寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET

①总线基地址(BUS_BASE_ADDR),顾名思义,就是STM32F407内部的总线地址,如下图所示:

上表中APB1的基地址,就是外设基地址,也就是总线基地址(BUS_BASE_ADDR),表中的偏移量就是相对于外设基地址的偏移量,也就是相对于APB1的基地址的偏移量。(根据上图所示,也很好理解,例如AHB1的基地址是0x4002 0000,而外设基地址是0x4000 0000,二者差了0x2 0000,因此,AHB1的偏移量就是0x2 0000)

②外设基于总线基地址的偏移量(PERIPH_OFFSET),顾名思义,就是挂载在该总线上的外设基于该总线基地址的偏移量。以GPIO为例,如下图所示,

GPIOB的基地址为0x4002 0400,它挂载在AHB1总线上,而AHB1总线的地址为0x4002 0000,因此,不难看出,GPIOB基于AHB1的地址的偏移量为0x400。也就是说,对于GPIOB这个外设,它的 PERIPH_OFFSET = x400。

若外设挂载在AHB1总线上,则它的 PERIPH_OFFSET 是基于AHB1总线地址(0x4002 0000)的偏移量。但是,如果外设挂载在其他总线上,如AHB2总线,则它的 PERIPH_OFFSET 是基于AHB2总线地址(0x5000 0000)的偏移量。

③寄存器相对外设基地址的偏移量(REG_OFFSET),顾名思义,指的是某个外设的寄存器相对于外设基地址的偏移量。以GPIOB的相关寄存器为例,如下图所示,

上图中的偏移量,就是GPIOB的寄存器相对外设基地址的偏移量(REG_OFFSET)。

因此,根据前面的公式,很容易可以计算出GPIOB_ODR的地址:

GPIOB_ODR地址 = AHB1总线基地址 + GPIOB外设偏移量 + 寄存器偏移量

待入可得:

GPIOB_ODR地址 = 0x4002 0000 + 0x400 + 0x14 = 0x4002 0414

因此,在参考手册里找到具体某个寄存器相对外设基地址的偏移量就可以知道该寄存器的实际地址了。

STM32F407所有寄存器映射都在stm32f407xx.h里面完成,包括各种基地址定义、结构体定义、外设寄存器映射、寄存器位定义(占了绝大部分)等。

5、总结

寄存器是一类特殊的存储器,它的每个位都有特定的功能,可以实现对外设/功能的控制,给寄存器的地址命名的过程就叫寄存器映射。

寄存器描述是指对计算机中寄存器的功能、特性、使用方式等进行详细说明的文档或信息。寄存器描述可以在对应单片机的参考手册中查找。

寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET,通过该公式和参考手册,我们可以计算出寄存器的实际地址,主要用于直接对寄存器进行的操作。

标签:映射,偏移量,GPIOB,地址,寄存器,STM32F407,外设
From: https://blog.csdn.net/aElect/article/details/141951925

相关文章

  • 【小白深度教程 1.11】手把手教你使用 PSMNet 估计视差和计算深度,并映射到 3D 点云(含
    【小白深度教程1.11】手把手教你使用PSMNet估计视差和计算深度,并映射到3D点云(含Python代码)1.PSMNet简介2.环境配置3.下载预训练模型4.修改推理代码5.用PSMNet估计视差6.报错解决7.映射到3D点云8.对比传统方法9.点云可视化在之前的章节......
  • 高等数学 1.1 映射与函数
    文章目录一、映射映射概念逆映射与复合映射二、函数函数概念函数的几种特性(1)函数的有界性(2)函数的单调性(3)函数的奇偶性(4)函数的周期性反函数与复合函数反函数复合函数函数的运算初等函数基本初等函数初等函数双曲函数与反双曲函数一、映射映射概念定义设......
  • 高等数学 1.1 映射与函数
    目录一、映射映射概念逆映射与复合映射二、函数函数概念函数的几种特性(1)函数的有界性(2)函数的单调性(3)函数的奇偶性(4)函数的周期性反函数与复合函数反函数复合函数函数的运算初等函数基本初等函数初等函数双曲函数与反双曲函数一、映射映射概念定义设\(X\),\(Y\)是两个非空......
  • STM32F407数据手册中文版,STM32F429数据参考手册中文版
    发布一个适用STM32F405XX、STM32F407XX、STM32F415XX、STM32F417XX、STM32F427XX、STM32F437XX的中文数据手册,具体内容见下图:首页目录原文有下载地址原文链接:https://blog.csdn.net/wangshuchao0/article/details/138089438......
  • DMA——STM32F407ZGT6
    DMA简介DMA(DirectMemoryAccess)直接存储器存取DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源。DMA的作用就是解决大量数据转移过度消耗CPU资源的问题,有了DMA得CPU可以更加专注的实用的的操作——计算、控制等。外围设备可以通过......
  • macOS 将google-chrome命令直接映射到谷歌浏览器的可执行文件上。可以像在Ubuntu上一
     创建符号链接找到谷歌浏览器的可执行文件:在macOS中,应用程序通常位于/Applications目录下,并且它们的可执行文件隐藏在.app包中。谷歌浏览器的可执行文件路径是:bash复制代码/Applications/Google\Chrome.app/Contents/MacOS/Google\Chrome创建符号链接:你可以在终端......
  • 如何通过SMB协议添加隐藏的共享路径映射为本地驱动器?
    要将远程服务器上的隐藏共享路径(如D:\wwwroot\WINCEAPI)映射为本地驱动器,你可以按照以下步骤操作:Windows系统打开文件资源管理器:按 Win+E 快捷键,或者在任务栏上点击文件夹图标。映射网络驱动器:在文件资源管理器的地址栏中输入 \\192.168.1.111,然后按Enter键。......
  • Cortex-A 寄存器组详细介绍
    一、引言        在嵌入式系统开发中,深入了解处理器的寄存器组是至关重要的。Cortex-A系列处理器作为高性能的处理器架构,其寄存器组在系统运行和编程中起着关键作用。本文将详细介绍Cortex-A寄存器组的各个部分,包括通用寄存器、特殊功能寄存器以及它们在编程中的应......
  • ReactJs:使用映射函数后我的父数组得到更新
    在React中,使用映射函数后父数组得到更新是正常的行为。映射函数会创建一个新的数组,其中包含了原始数组中每个元素经过映射操作后的结果。如果你希望在映射函数中修改原始数组,你可以使用forEach方法来遍历数组,并在遍历过程中修改元素。以下是一个示例:constparentArray=[1,2,......
  • C#调用Lua映射类
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.Events;publicclassCallLuaClass{//在这个类中声明成员变量一定要和lua那边的一样//这个自定义中的变量可以更多也可以更少//少就忽略,多就不赋值......