STM32学习——什么是寄存器(存储器映射和寄存器映射)

2023-10-27

目录

STM32芯片里面有什么

一、驱动单元

1、ICode总线

2、DCode总线

3、系统总线

4、DMA总线

二、被动单元

1、内部的闪存存储器

2、内部的SRAM

3、FSMC

4、AHB到APB的桥

三、STM32的外设基地址映射

1、总线基地址

2、外设基地址

3、外设寄存器


STM32芯片里面有什么

我们看到的STM32芯片是已经封装好阿成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的CPU和主板、内存、显卡、硬盘的关系。

STM32F103采用的是Cortex-M3内核,内核即CPU,由ARM公司设计,ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如ST、TI、Freescale,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如GPIO、USART(串口)、I2C、SPI等都叫片上外设。具体见下图STM32芯片架构简图。

 芯片(这里指内核,或者叫CPU)和外设之间通过各种总线连接,其中驱动单元4个,被动单元也有4个。为了方便理解,我们都可以把驱动单元理解成是CPU部分,被动单元都理解外设。

一、驱动单元

1、ICode总线

ICode中的I表示Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在FLASH中,内核要读取这些指令来执行程序就必须通过ICode总线,它几乎每时每刻都需要被使用,它是专门用来取指令的。

2、DCode总线

DCode总线中的D表示Data,即数据,那说明这条总线是用来取数据的。我们在写程序的时候,数据有常量和变量两种,常量就是固定不变的,用C语言中的const来修饰的,是放到FLASH当中的,变量是可变的,不管是全局变量还是局部变量都存放在内部的SRAM中。因为数据可以被DCode总线和DMA总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。

3、系统总线

系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这跟系统总线来完成的。

4、DMA总线

DMA总线也主要是用来,传输数据,这个数据可以是在某个外设的数据寄存器,可以在SRAM,可以在内部的FLASH。因为数据可以被DCode总线和DMA总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。

二、被动单元

1、内部的闪存存储器

内部的闪存存储器即FLASH,我们编写好的程序就放在这个地方。内核通过ICode总线来取里面的指令。

2、内部的SRAM

内部的SRAM,即我们通常常说的RAM,程序的变量,堆栈等的开销都是基于内部的SRAM。内核通过DCode总线来访问它。

3、FSMC

FSMC的英文全称是Flexible static memory controller,叫灵活的静态的存储器控制器,是STM32F10xx中一个很有特色的外设,通过FSMC,我们可以扩展内存,如外部的SRAM、NAND-FLASH和NORFLASH。但我们有一点要注意的是,FSMC只能扩展静态的内存,即名称里面的static,不能是动态的内存,比如SDRAM就不能扩展。

4、AHB到APB的桥

从AHB总线延伸出来的两条APB2和APB1总线,上面挂载着STM32的各种各样的外设。我们经常说的GPIO、串口、I2C、SPI这些外设就挂载在这两条总线上,这个是我们学习STM32的重点,就是要学会编程这些外设的驱动外部的各种设备。

 存储器映射

存储器本身具备有地址信息,它的地址是由芯片厂商或由用户分配,给存储器分配地址的过程就称为存储器映射,具体可见下面的存储器映射。如果给存储器再分配一个地址就叫存储器重映射。

 存储器区域功能划分

在这4GB地址的空间内,ARM已经粗线条的平均分成了8个块,每块512MB,每个块也都规定了用途,具体分类见表格存储器功能分类。每个块的大小都有512MB,显然这是一块非常大的区域,芯片厂商在每个块的范围内设计各具特色的外设时并不一定用得完,都是只用了其中一部分。

序号                 用途         地址范围
Block0 Code 0x0000 0000~0x1FFF FFFF(512MB)
Block1 SRAM 0x2000 0000~0x3FFF FFFF(512MB)
Block2 片上外设        0x4000 0000~0x5FFF FFFF(512MB)
Block3 FSMC的bank1~bank2 0x6000 0000~0x7FFF FFFF(512MB)
Block4 FSMC的bank3~bank4 0x8000 0000~0x9FFF FFFF(512MB)
Block5 FSMC寄存器                0xA000 0000~0xCFFF FFFF(512MB)
Block6 没有使用                 0xD000 0000~0xDFFF FFFF(512MB)
Block7 Cortex-M3内部外设 0xE000 0000~0xFFFF FFFF(512MB)

在这8个块里面有三个块非常重要,Block0用来设计内部FLASH,Block1用来设计内部RAM,Block2用来设计成片上的外设。

寄存器映射

寄存器映射:给已经分配好地址的具有特定功能的内存单元取别名的过程就叫寄存器映射。

比如,我们先找到GPIOB的端口的输出数据寄存器ODR的地址是0x40010C0C,ODR寄存器是32位的,低16位有效,对应着16个外部IO,写0/1对应的IO输出对应的低/高电平。

//GPIO端口全部输出高电平
*(unsigned int*) (0x40010C0C) = 0xFFFF;
0x40010C0C在我们看来是GPIOB的端口的ODR地址,但是在编译器看来,
这只是一个普通的变量,是一个立即数,要想让编译器也认为是指针,
我们得进行强制类型转换,把它转换成指针,即(unsigned int*)0x40010C0C,
然后对这个地址进行*操作。
通过寄存器别名的方式访问内存单元
//GPIOB端口全部输出高电平
#define GPIOB_ODR    (unsigned int*)(GPIOB_BASE + 0x0C)
*GPIOB_ODR = 0xFF;
为了方便操作,直接把指针操作"*"也定义到寄存器别名中。
//GPIOB端口全部输出高电平
#define GPIOB_ODR    *(unsigned int*)(GPIOB_BASE + 0x0C)
GPIOB_ODR = 0xFF;

三、STM32的外设基地址映射

片上外设区分三条总线,根据外设速度的不同,不同总线挂在着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设。相应的总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中APB1总线的地址最低,片上外设从这里开始,也叫外设基地址。

1、总线基地址

总线名称 总线基地址 相对外设基地址的偏移
APB1 0x4000 0000       0x0
APB2 0x4001 0000 0x0001 0000
AHB 0x4001 8000 0x0001 8000

表格总线基地址的“相对外设基地址偏移”即该总线地址与“片上外设”基地址0x4000 0000的差值。

2、外设基地址

总线上挂载着各种外设,这些外设也有自己的地址范围,特定外设的收个地址“称为XX外设基地址”,也叫XX外设的边界地址。具体有关的STM32F10xx外设的边界地址可以参考具体的存储器映射的表。

这里以GPIO这个外设来讲解外设的基地址,GPIO属于高速的外设,挂载到APB2总线上。

外设名称 外设基地址 相对APB2总线的地址偏移
GPIOA 0x4001 0800       

0x0000 0800

GPIOB 0x4001 0C00  0x0000 0C00
GPIOC 0x4001 1000 0x0000 1000
GPIOD 0x4001 1400 0x0000 1400
GPIOE 0x4001 1800 0x0000 1800
GPIOF 0x4001 1C00 0x0000 1C00
GPIOG 0x4001 2000 0x0000 2000

3、外设寄存器

在XX外设的地址范围内,分布着的就是该外设的寄存器。以GPIO外设为例,GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,基本功能是控制引脚输出高低电平。

GPIO有很多个寄存器,每一个都有特定的功能。每个寄存器为32bit,占4个字节,在改外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。这里我们以GPIOB端口为例,来说明GPIO都有哪些寄存器,具体见表格GPIOB端口的寄存器地址列表。

寄存器名称 寄存器地址 相对GPIOB基址的偏移
GPIOB_CRL 0x4001 0C00 0x00
GPIOB_CRH 0x4001 0C04 0x04
GPIOB_IDR 0x4001 0C08 0x08
GPIOB_ODR 0x4001 0C0C 0x0C
GPIOB_BSRR 0x4001 0C10 0x10
GPIOB_BRR 0x4001 0C14 0x14
GPIOB_LCKR 0x4001 0C18 0x18

这里我们以“GPIO端口置位/复位寄存器为例”,教大家如何理解寄存器的说明,具体见GPIO端口置位_复位寄存器说明。

1、名称

寄存器说明中首先列出了该寄存器中的名称,“(GPIOx_BSRR)(x=A...E)”这段的意思是该寄存器名为”GPIOx_BSRR“其中的x可以为”A...E“,也就是说这个寄存器说明适用于GPIOA、GPIOB至GPIOE,这些端口都有这样一个寄存器。

2、偏移地址

偏移地址是指本寄存器相对于这个外设的基地址的偏移。本寄存器的偏移地址是0x10,从手册可以查到GPIOA这个外设的基地址为0x4001 0800,我们就可以算出GPIOA这个GPIOA_BSRR寄存器地址为:0x4001 0800+0x10。

3、寄存器位表

紧接着的就是本寄存器的位表,表中列出了0-31位的名称及权限。表上方的数字为位编号,中间为位名称,最下方为读写权限,其中w表示只写,r表示只读,rw表示可读写。本寄存器中的位权限都是w,所以只能写,如果读本寄存器,是无法保证读取到它真正内容的。而有的寄存器位只读,一般是用于STM32外设的某种工作状态的,由STM32硬件自动生效,程序通过读取那些寄存器位来判断外设的工作状态。

4、位功能说明

位功能是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位的功能。这里不再详细讲解。

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

STM32学习——什么是寄存器(存储器映射和寄存器映射) 的相关文章

  • elementUIel-input和el-select宽度不一样

    在vue项目中 使用了element组件的 el input 和 el select组件 设置了相同的宽度 但是宽度显示不一样 给el select添加style width 100 就可以解决 没加样式之前的效果 添加样式 没加样式之后的
  • 机器学习入门教学——决策树

    1 简介 决策树算法是一种归纳分类算法 它通过对训练集的学习 挖掘出有用的规则 用于对新数据进行预测 决策树算法属于监督学习方法 决策树归纳的基本算法是贪心算法 自顶向下来构建决策树 贪心算法 在每一步选择中都采取在当前状态下最好 优的选择
  • 52类110个主流Java组件和框架

    以下排序是按照从技术组件到开发框架到代码工具 也有一些实在不好分类的 就放到最后了 WEB 容器 Tomcat https tomcat apache org Jetty https www jetty com JBoss https ww
  • JAVA命令行编译运行程序

    JAVA源程序名扩展名必须是 java 并且主文件名必须是 1 如有public类必须写public类的名 2 如没有public类则主文件名任意 编译源程序 javac d 目录名 源文件 以上命令中 d 目录名代表将编译产生的二进制码文
  • 用计算机对视频进行剪裁和编辑,Win10系统剪裁视频功能怎么用?windows10剪裁视频功能使用方法介绍...

    最近 有不少Win10正式版用户向小编咨询新系统上是否有好的视频剪切软件 答案是肯定的 我们只要利用Win10系统中的 照片 就可以快速实现剪裁视频操作 接下来 小编就向大家介绍windows10系统剪裁视频功能的使用方法 具体方法如下 1
  • HTTP GET参数的获取

    REQUEST METHOD的值一般包括POST和GET两种 GET参数的获取 在GET方法下 CGI程序无法直接从服务器的标准输入中获取数据 因为服务器把从标准输入接收到的数据编码到环境变量QUERY STRING 或PATH INFO
  • 乒乓球捡球机器人_捡球机器人

    本帖最后由 章 于 2020 12 31 08 41 编辑 27 副本 JPG 108 08 KB 下载次数 0 2020 12 24 20 17 上传 制作背景 我国的国球是乒乓球 有许多人从小开始学习打乒乓球 而在学习打乒乓的过程中 为

随机推荐

  • QT:在QTableView中使用各种自定义委托

    原文地址 https blog csdn net lhchen922 article details 38367719 相关文章 1 QT 在QTableView中使用各种自定义委托 https blog csdn net zgrjkflm
  • OpenHarmony 标准系统HDF框架之I2C驱动开发

    OpenHarmony 标准系统HDF框架之I2C驱动开发 主要内容 I2C 基础知识 I2C 基础知识 概念和特性 I2C 基础知识 协议 四种信号组合 I2C 调试手段 I2C 调试手段 硬件 I2C 调试手段 软件 HDF 框架下的
  • 关于前端开发常见状态码

    前端开发常见状态码 2开头代表服务器已接收请求 3开头代表重定向 需要进一步操作才能完成请求 4开头代表客户端错误 5开头代表服务器错误 2开头代表服务器已接收请求 200 代表请求成功 并返回了想要的数据 202 服务器接受请求 但未处理
  • 【JS】中文繁简转换

    不多说 比较简单 有对照表就行 下面贴源码 var 简繁对应表 锕 錒 锿 鎄 皑 皚 嗳 噯 蔼 藹 霭 靄 爱 愛 嫒 嬡 碍 礙 暧 曖 瑷 璦 庵 菴 谙 諳 鹌 鵪 鞍 鞌 埯 垵 铵 銨 暗 闇 晻 晻 翱 翶 翺 翺 鳌 鰲
  • Java面试总结,Redis宕机数据丢失解决方案,看完这篇彻底明白了

    一 前言 长文警告 事实上我不愿意写太长的文章 一面是太冗余 一方面读者容易疲倦 但是只要是涉及到源码级别的 就肯定篇幅不短 因为太短肯定没意义也解释不清楚 但是相信 耐心看完这个文章一定会对Spring源码有所收获 最近有很多读者面试的时
  • python报错urllib2.URLError:和error[Errno 104]

    在ubuntu16 04上使用python的skimage io imread 函数读取网页上的图片时 出现如题所示的错误 gt gt gt img io imread https cdn pixabay com photo 2015 02
  • 教你怎么使用Python对word文档进行操作

    使用Python对word文档进行操作 一 安装Python docx Python docx是专门针对于word文档的一个模块 只能读取docx 不能读取doc文件 说白了 python就相当于windows操作系统 QQ就是跑在wind
  • Spring Security默认用户生成分析

    1 首先创建进行环境搭建 创建SpringBoot项目 引入SpringSecurity依赖 编写简单的Controller 2 使用断点进行源码查看 首先访问资源localhost 8080 hello 之后会被 login页面拦截 在
  • C语言数字转换字符串

    转载自 https www cnblogs com bluestorm p 3168719 html C语言itoa 函数和atoi 函数详解 整数转字符C实现 C语言提供了几个标准库函数 可以将任意类型 整型 长整型 浮点型等 的数字转换
  • SpringJDBC的JdbcTemplate在MySQL5.7下不支持子查询的问题

    SpringJDBC的JdbcTemplate在MySQL5 7下不支持子查询的问题 org springframework jdbc BadSqlGrammarException PreparedStatementCallback bad
  • IT项目管理——08.项目质量管理

    年龄 40以下 学位 博士 专业 管理学相关专业 学术成果 以第一作者发表10篇以上高水平论文 个人品质 爱国敬业 做事严谨 为人正直 崇尚科学 教学经验 有过项目管理相关课程教学经验 投掷30次的结果 不能反映正态分布
  • 史上最管用的C盘深度清理秘籍

    使用电脑的用户都知道 使用电脑一段时间后 会堆积很多无用的文件 不仅占用磁盘空间 而且导致系统运行速度变慢 所以清理c盘垃圾是非常有必要的 无论我们给C盘分多大的分区 Windows都有办法把它填满 像休眠文件 系统页面文件这都是动辄GB级
  • 反激式开关电源的原理是什么

    反激式开关电源是一种常见的电源转换器 其原理是将输入电压通过一个开关管进行高频开关 将电压转换为脉冲信号 再通过变压器进行隔离和变换 最终输出所需的电压 具体来说 当开关管导通时 输入电压经过变压器变换后 输出电压上升 并通过输出电容器进行
  • 轻量级的Python IDE —— Thonny

    现在的开发工具太多了 而且每个开发工具都致力于做成最好用最智能的工具 所以功能越堆越多 越怼越智能 安装这些开发工具比较烧脑 经常需要经过许多配置步骤 作为一个 Python 开发者来说 好多人光是这些配置都要弄半天 配置好之后 打开软件
  • [架构之路-178]-《软考-系统分析师》-17-嵌入式系统分析与设计- 3- 分区操作系统(Partition Operating System)概述

    目录 本文概述 1 1 什么是分区操作系统 1 2 分区操作系统出现背景 1 前后台系统 Foreground Background System 2 实时操作系统 RTOS 本文概述 随着嵌入式系统日趋复杂化以及对安全性要求的不断提高 采
  • “因为无法从捐赠中抽成,谷歌把我的开源 App 下架了!”

    众所周知 苹果税和谷歌税的存在 即 只要你的 App 在 App Store 或 Google Play 上架 产生的收入就必须分给苹果或谷歌 这个 收入 包括 收费 App 的下载费 游戏充值费 订阅服务费等 广泛的抽成范围加上 30 的
  • 解决Ubuntu无法安装pycairo和PyGObject

    环境 虚拟机Ubuntu20 04 vscode无法安装pycairo和PyGObject 虚拟机Ubuntu20 04 vscode中运行Anaconda搭建的vens 的Python3 8 10 首先在vscode中点击ctrl shi
  • Jupyter Notebook是什么及使用

    一 什么是Jupyter Notebook Jupyter项目是一个非盈利的开源项目 源于2014年的python项目 Juptter Notebook 原名IPython Notbook 是IPython的加强网页版 一个开源web应用程
  • 华为OD机试真题- 非严格递增连续数字序列-2023年OD统一考试(B卷)

    题目描述 输入一个字符串仅包含大小写字母和数字 求字符串中包含的最长的非严格递增连续数字序列的长度 比如12234属于非严格递增连续数字序列 输入描述 输入一个字符串仅包含大小写字母和数字 输入的字符串最大不超过255个字符 输出描述 最长
  • STM32学习——什么是寄存器(存储器映射和寄存器映射)

    目录 STM32芯片里面有什么 一 驱动单元 1 ICode总线 2 DCode总线 3 系统总线 4 DMA总线 二 被动单元 1 内部的闪存存储器 2 内部的SRAM 3 FSMC 4 AHB到APB的桥 三 STM32的外设基地址映射