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

news2024/9/19 10:08:32

上篇文章介绍了存储器映射(存储器映射(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,通过该公式和参考手册,我们可以计算出寄存器的实际地址,主要用于直接对寄存器进行的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu16.04下qt5.7.1添加对openssl的支持

文章目录 前言一、编译安装openssl二、编译qt5.7.1三、配置qtcreator开发环境四、demo 前言 最近工作中要求客户端和服务端通过ssl加密通信,其中客户端是qt编程,服务端是linux编程.我的开发环境是ubuntu16.04;运行环境是debian9.13,是基于gnu的linux操作系统,64位arm架构. 一…

【数据库】|子查询

子查询 什么叫子查询?如何实现子查询? 定义:什么叫子查询,也就是先执行子查询,后执行父查询 ❓✅面试题:如何实现替换,执行顺序? 1、使用子查询,因为子查询会先执行子…

大语言模型LLM权重4bit向量量化(Vector Quantization)/查找表量化基本原理

参考 https://apple.github.io/coremltools/docs-guides/source/opt-palettization-overview.html https://apple.github.io/coremltools/docs-guides/source/opt-palettization-algos.html Apple Intelligence Foundation Language Models 苹果向量量化: DKM:…

深度学习基础--卷积的变种

随着卷积同经网络在各种问题中的广泛应用,卷积层也逐渐衍生出了许多变种,比较有代表性的有: 分组卷积( Group Convolution )、转置卷积 (Transposed Convolution) 、空洞卷积( Dilated/Atrous Convolution )、可变形卷积( Deformable Convolu…

协程的原理与实现:GMP源码走读

在计算机科学领域,尤其是在现代软件开发中,高并发处理能力是衡量技术架构性能的关键指标之一。Go语言,以其简洁的语法和内置的协程支持,为开发者提供了一套高效且易于使用的并发编程模型。本文深入剖析了Go语言协程的原理与其实现…

erlang学习:用ETS和DETS存储数据3,保存元组到磁盘

学习内容 ETS表把元组保存在内存里,而DETS提供了把Erlang元组保存到磁盘上的方法。DETS的最大文件大小是2GB。DETS文件必须先打开才能使用,用完后还应该正确关闭。如果没有正确关闭,它们就会在下次打开时自动进行修复。因为修复可能会花很长…

软件测试学习笔记丨Pytest的使用

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22158 1. 简介 pytest是一个成熟的全功能python测试框架测试用例的skip和xfail,自动失败重试等处理能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/ap…

路由器的固定ip地址是啥意思?固定ip地址有什么好处

‌在当今数字化时代,‌路由器作为连接互联网的重要设备,‌扮演着举足轻重的角色。‌其中,‌路由器的固定IP地址是一个常被提及但可能让人困惑的概念。‌下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义,‌揭示其背后…

元学习之如何学习

首先第一个步骤(如图1所示)是我们的学习算法里要有一些要被学的东西,就像在 机器学习里面神经元的权重和偏置是要被学出来的一样。在元学习里面,我们通常会考虑要 让机器自己学习网络的架构,让机器自己学习初始化的参数…

echarts 水平柱图 科技风

var category [{ name: "管控", value: 2500 }, { name: "集中式", value: 8000 }, { name: "纳管", value: 3000 }, { name: "纳管", value: 3000 }, { name: "纳管", value: 3000 } ]; // 类别 var total 10000; // 数据…

RockyLinux8.9上yum安装redis6

我百思不得其解的一个问题 我想在RockyLinux8.9上安装redis6,通过yum list | grep redis看到的redis版本只有redis5 appstream-official仓库是我新加的,这里先不管 于是我通过浏览器访问appstream仓库https://dl.rockylinux.org/vault/rocky/8.9/AppSt…

MQTT broker搭建并用SSL加密

系统为centos,基于emqx搭建broker,流程参考官方。 安装好后,用ssl加密。 进入/etc/emqx/certs,可以看到 分别为 cacert.pem CA 文件cert.pem 服务端证书key.pem 服务端keyclient-cert.pem 客户端证书client-key.pem 客户端key 编辑emqx配…

ANSA联合abaqus的转动副创建方式

下面链接详细介绍了ANSA联合Abaqus创建转动副的过程: https://www.bilibili.com/video/BV1cb421b7z9/?spm_id_from333.880.my_history.page.clickhttps://www.bilibili.com/video/BV1cb421b7z9/?spm_id_from333.880.my_history.page.click

复盘高质量Vision Pro沉浸式视频的制作流程与工具

在探索虚拟现实(VR)和增强现实(AR)技术的过程中,高质量的沉浸式体验是至关重要的。最近,国外开发者Dreamwieber在其作品中展示了如何使用一系列工具和技术,创造出令人震撼的Vision Pro沉浸式视频。本文将详细复盘Dreamwieber的工作流,希望能为从事相关领域的开发者们提…

综合评价 | 基于熵权-变异系数-博弈组合法的综合评价模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大, 该指标对综合评价的影响(即权重&…

【JAVA入门】Day34 - Stream流

【JAVA入门】Day34 - Stream流 文章目录 【JAVA入门】Day34 - Stream流一、Stream 流的作用和使用步骤1.Stream流的创建,数据的添加2. Stream流的中间方法3. Stream流的终结方法 Stream 流有什么作用?我们看一个例子: 【练习】需求&#xff…

SQL的高级查询练习知识点下(day26)

1 学习目标 重点掌握分组查询的语法 重点掌握分页查询的语法 2 分页查询 2.1 语法 SELECT 字段|表达式,... FROM 表 [WHERE 条件] [GROUP BY 分组字段] [HAVING 条件] [ORDER BY 排序的字段] LIMIT [起始的条目索引,]条目数; 2.2 特点 起始条目索引从0开始 limit子句放在…

ARM32开发——GD32F4 DMA功能查询

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 DMA0DMA1 DMA0 DMA1

蔬菜识别数据集 蔬菜数据集 用于训练,有十种蔬菜,如图已经标注好的版本

数据集概述 该数据集包含十种常见的蔬菜:胡萝卜、包菜、水果辣椒、青瓜、南瓜、土豆、花菜和西红柿。数据集已经进行了精细的标注,适用于深度学习模型的训练,尤其是用于物体检测和分类任务。 数据集特点 种类多样:涵盖了八种蔬菜…

Github 2024-09-07Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10CUE项目1Python项目1Go项目1Polars: Rust中的DataFrame接口和OLAP查询引擎 创建周期:1354 天开发语言:Rust, Python协议类型:MIT …