STM32:寄存器、存储器

2023-11-06

目录

1.什么是存储器映射

2.什么是寄存器映射

3.C语言对寄存器的封装

  (1)首先确定总线基地址(下表中的第二列)。

 (2)确定外设基地址

 (3)确定寄存器地址

1.什么是存储器映射

  存储器本身是没有地址之分的,就像一间间小仓库,由芯片厂家或者用户给它分配地址,如几号几号仓库之类的。给仓库分配地址的过程就叫存储器映射,如果再分配一个地址就叫重映射。

以STM32F103ZET6芯片数据手册里的存储器映射图为例子,如下图:

 

  由图中可看出STM32F103ZET6共有4GB的储存器空间,平均分成了8块区域(可以理解为分成8个仓库),每个仓库的储存器空间为512MB。8个区域中,每一块区域都有它特殊的用途。

  如block0主要用于设计芯片内的Flash(闪存),Flash掉电不遗失数据,所以经常作为单片机的程序储存器,我们编写的程序就存储在这里面;block1主要用于设计芯片内部的SRAM;block2用于设计片内外设(可以看到有ADC和IIC等)。

2.什么是寄存器映射

  寄存器是有特定功能的内存单元,通常我们会给这个特殊的内存单元取一个名字,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

  以block2为例子,刚刚说到block2这个小仓库是用来设计片上外设的,由于STM32的芯片内核是32位的,一次可以处理32位数据,所以我们以4个bit为一个单元,每个单元都有其功能,当我们控制这些单元的时候也就是在控制这些外设,由于stm32的内部存储空间大,外设繁多,每次操控一个外设时就要写一大串对应的储存单元地址。

  举个例子,我们要操作0x4001 0C10这个单元地址,我们就要写是在block2区域的TIM2区域里的单元地址,十分繁琐。所以我们可以给它取个别名GPIOB_BSRR,这个GPIO_BSRR就是寄存器,这个寄存器的地址就是0x4001 0C10,这个给它取名的过程就叫寄存器映射。

例子:GPIOB端口的16个引脚输出高电平

  ①首先要通过绝对地址访问内存单元,让GPIOB端口输出高电平,所以用到端口输出寄存器(8.2.4节),起始地址:中文参考手册的2.3存储器映像;偏移地址:中文参考手册的8.2 GPIO寄存器描述(8.2.4节)。

         起始地址+偏移地址=绝对地址

       0X4001 0C00+0C=0X4001 0C0C

  ②对物理地址进行强制类型转换,(unsigned int*)(0x4001 0C0C) 转换为指针

  ③对指针进行操作:*(unsigned int*)(0x4001 0C0C) 都赋值为高电平   

// GPIOB 端口全部输出 高电平

*(unsigned int*)(0x4001 0C0C) = 0xFFFF;

 或者,我们直接用“#define”宏定义,对绝对地址进行命名,这样操作更方便。

// GPIOB 端口全部输出 高电平
#define GPIOB_ODR  *(unsignedint*)(0x4001 0C0C)
GPIOB_ODR = 0xFF;

3.C语言对寄存器的封装

  就像在51里面加入的头文件“#include <reg52.h>”,在STM32中,需要我们自己写。最重要的就是找出寄存器的地址

  下面以GPIOB端口的寄存器为例介绍

  (1)首先确定总线基地址(下表中的第列)

   计算方法:总线最一开始的地址是0X4000 0000,看总线相对于最一开始地址偏移多少(下表第三列),之后二者相加:0X4000 0000+第三列的偏移=总线基地址(下表第二列) GPIOB属于APB2,基线地址为0X4001 0000

 下图为中文参考手册的2.3存储器映像(起始地址查询处)

(2)确定外设基地址


   外设基地址=总线基地址+该外设相对于所在总线地址的地址偏移。外设基地址在下图中可以直接读出:GPIOB的就是0X4001 0C00

   下图为存储器映像的外设部分截图:

 由此可得出GOIO外设的基地址:

 (3)确定寄存器地址

  寄存器地址=外设基地址+寄存器相对于外设基地址的偏移。这个在中文参考手册各自具体章节的介绍中有涉及。

 这样经过层层叠加,寄存器地址得以确定。更改寄存器电平高低的时候,就更改一下地址的数据类型,用指针表示即可。

GPIOB的寄存器地址如下:

 引用文章链接:http://t.csdn.cn/mBZA7

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32:寄存器、存储器 的相关文章

随机推荐

  • 3D游戏与计算机图形学中的数学方法-四元数

    3D游戏与计算机图形学中的数学方法 四元数 说实话关于四元数这一节真的是不好懂 因为里面涉及到好多数学知识 单说推出来的公式就有很多 不怕大家笑话 对于四元数的学习我足足花了两天的时间 包括整理出这篇文章 在前面一章我写到了 变换 这也是总
  • 通过Power Platform自定义D365 CE 业务需求 - 4. 使用Power Automate

    Microsoft Power Automate 以前称为Flow 可帮助您在喜爱的云和本地应用程序之间创建自动化工作流 它提供同步文件 获取通知 收集数据等服务 Power Automate是Microsoft Power Platfor
  • adbd cannot run as root in production builds 的解决方法

    超级root的adb下载地址 http download csdn net download anthony 3 9633800这里有一个 今天用adb root命令时候 报了错误 adbd cannot run as root in pr
  • 开炮,开炮

    哈喽大家好 我是安德酱 我做了一款意大利炮的游戏 我用到了这种代码 int shanben rand 20 这句的意思是从0到20之间取随机数 作为山本 位置 游戏玩法 我们有100发炮弹 要有五次炸到山本 山本会随机躲闪 楚云飞牵制住了他
  • Failed building wheel for xxx 解决办法

    在下面两个链接之一下载相应whl 下载whl链接 UCI 下载whl链接 清华大学 安装 pip install 刚刚下载whl文件绝对路径
  • Source Insight 3.5和Source Insight 4.0的安装

    系列文章目录 Source Insight是一个功能非常强大的C C 的代码阅读器 通过工程的管理 Source Insight可实现多文件代码中 C工程或C和ASM的混合工程 的变量 函数的快速定位和搜索 并且对每个打开的源程序 C或C
  • MySQL-Centos下MySQL5.7安装教程

    MySQL安装教程 一 卸载MySQL 二 安装MySQL 三 mysql登录 四 修改配置文件 一 卸载MySQL 1 如果你的机器上mysqld服务器还在运行 那么第一步就是要停掉服务 systemctl stop mysqld 2 查
  • SpringBoot(五)SpringBoot事务

    在实际开发项目时 程序并不是总会按照正常的流程去执行 有时候线上可能出现一些无法预知的问题 任何一步操作都有可能发生异常 异常则会导致后续的操作无法完成 此时由于业务逻辑并未正确的完成 所以在之前操作过数据库的动作并不可靠 需要在这种情况下
  • Hive-安装与配置(1)

    大数据学习记录篇 持续更新中 个人主页 beixi 本文章收录于专栏 点击传送 大数据学习 持续更新中 感谢各位前辈朋友们支持学习 文章目录 1 Hive环境介绍 2 搭建环境准备 3 建立Hive元数据库 4 安装配置Hive 1 Hiv
  • Unity+Vuforia SDKAR开发系列教程--2.1.1 vuforia 4.0 sdk

    Vuforia sdk是高通公司开发的增强现实sdk vuforia结合unity可以实现AR 增强现实 解决方案 Vuforia sdk支持的识别目标种类还是比较多的比如 图片识别 images Targets 圆柱识别 cylinder
  • firefox不兼容java,JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结

    今天测试代码时 发现不少IE可以运行的ajax 但在FF中报错 IE和Firefox 火狐 在JavaScript方面的不兼容及统一方法总结如下 需要的朋友可以看下 对于以后的代码书写一定要考虑到多浏览器的兼容性 1 兼容firefox的
  • 抖音上情侣玩的小游戏--猜数字 单身狗 没朋友也能玩 附HTML源码

    先上图 代码如下 直接运行即可 欢迎各位大佬提意见
  • 软件工程基础知识--系统设计

    系统设计的主要目的就是为系统制定蓝图 在各种技术和实施方法中权衡利弊 精心设计 合理地使用各种资源 最终勾画出新系统的详细设计方案 系统设计的主要内容包括新系统总体结构设计 代码设计 输出设计 输入设计 处理过程设计 数据存储设计 用户界面
  • LINUX: 在不重启各自socket程序情况下, 断开ESTAB的TCP链接

    一说起TCP 就是什么三次握手 四次挥手 而这次想讨论的是 在不重启各自socket程序情况下 将ESTABLED链接断开 情景模拟 简单点 在同一个机器 通过 nc 来实现 server 和 client 吧 Server nc l p
  • 用户角色&用户画像

    用户角色 用户角色 user personal 户 是 个集合体 不是指某个具体的 是从用户群体中抽象出来的典型用户 一般包含以下信息 个人基本信息 性别 年龄 性格 学历 婚姻 爱好 职业 户的使 场景 与产品使用相关的具体情境 用户目标
  • 贝叶斯网络详解

    0x01 贝叶斯网络概述 有时我们需要计算一个不确定原因的概率给出一些观察到的证据 在这些情况下可以使用贝叶斯方法 贝叶斯网络 bayesian network 是一种概率图形模型 它在图形模型中显式捕获已知的有向边的条件依赖性 它通过有向
  • import tensorflow 出现DLL load failed: 找不到指定模块\Failed to load the native TensorFlow runtime问题等的解决方法

    import tensorflow 出现DLL load failed 找不到指定模块 Failed to load the native TensorFlow runtime ERROR root Internal Python erro
  • maven——在build中配置resource,配置文件无法被导出或生效的问题

    由于maven约定大于配置 所以可能遇到配置文件 无法被导出或生效的问题 解决方案 pom xml文件中加入下面代码
  • ARM 在Unity3D 中的美术优化解决方案 2, 几何体

    2 几何体 简介 在本教程中 我们将简要介绍本项目的学习目标 优化移动 3D 应用程序中的几何体 1 概述 3D 移动应用程序中的大多数对象很可能都是使用几何体表示的 几何体是需要处理的最常见的数据 因此有必要仔细考虑其实现和优化 本项目将
  • STM32:寄存器、存储器

    目录 1 什么是存储器映射 2 什么是寄存器映射 3 C语言对寄存器的封装 1 首先确定总线基地址 下表中的第二列 2 确定外设基地址 3 确定寄存器地址 1 什么是存储器映射 存储器本身是没有地址之分的 就像一间间小仓库 由芯片厂家或者用