【STM32】寄存器原理

news2024/9/22 5:33:28

如果我们想要深入去学习STM32单片机的存储原理和方式,就要花时间去了解STM32单片机有关寄存器的基本原理

单片机型号:正点原子STM32F103ZET6


目录

寄存器的定义

寄存器分类

存储器映射

寄存器映射

通过地址访问控制单元运作

通过定义宏来取代直接访问绝对地址的控制方式

寄存器说明的使用

利用C语言对地址进行封装


寄存器的定义

寄存器功能是存储二进制代码,由具有存储功能和触发器组成的。寄存器是CPU内部一块小型存放数据的区域,用来暂存运算的数据结果。它拥有很高的数据传递速度。寄存器也是存储器的一种。

下图为寄存器常在位置。

寄存器分类

控制寄存器(xxx_CR):用来控制,配置中某些部件的工作方式;
状态寄存器(xxx_SR):存储了当前外设的工作状态;
数据寄存器(xxx-DR):存储外设进行输入输出数据

存储器映射

1.存储:首先存储型外设FSMC,RAM,FLASH以及AHB桥到APB桥上的外设都存储于一块4GB大的空间内部,我们给这块空间分好大小并编上地址(类似于我们通过门牌号来找到家,我们可以通过地址调用不同存储单元)

2.存储器映射存储器本身不具有地址信息,它的地址是由芯片厂商或用户配,给存储器分配地址的过程就称为存储器映射(类似于给新建的房子编上门牌号)。如果给存储器再分配一个地址就叫存储器重映射

                 (上图为存储器映射图)

3.功能划分在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定了用途。而芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的一部分而已。

(上图为存储器功能区域划分)

Block0:此块为Flash的存放区域,一般ST公司只使用512KB

Block1:此块为SRAM的存放区域,一般ST公司仅用了64KB

Block2:此处为外接的一大串外设的存储区域

Block3-Block4:此处是FSMC的存储区域

Block5:此区域是FSMC寄存器的区域

Block6:此处为无使用

Block7:此处为芯片内核里面的寄存器存储的位置

寄存器映射

在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射

通过地址访问控制单元运作

如将GPIOB 16个IO口都输出高电平:

方法一:由地址来找到对应单元并且进行操作

方法二:通过访问寄存器别名来找到相应单元进行操作

通过定义宏来取代直接访问绝对地址的控制方式

在外设的内存块中由下到上挂着ABP1,ABP2,AHB三条总线,每条总线都外连一些外设,我们将从总线APB1为初始设置地址。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。

其中 APB1 总线的地址最低,片上外设从这里开始,也叫总线外设基地址。如下图为GPIOx的外设基地址。外设基地址相对于总线及地址的距离就是相对总线的地址偏移

而在某一个外设的地址范围内就分布着这个外设的寄存器。以GPIO为例,每个GPIO寄存器都以4个字节为单位划分。而外设寄存器位置都可以用寄存器外设基地址偏移来表示。下图以GPIOB端口为例:

通过上面我们就可以定义宏来替代寄存器绝对地址,而且有了偏移的数值,就可以更加简便由外设/总线基地址来找到每一个寄存器地址。

寄存器说明的使用

以GPIO端口设置\清除寄存器说明为例

  1. 寄存器说明中首先列出了该寄存器中的名称,“(GPIOx_BSSR)(x=A…E)”这段的意 思是该寄存器名为“GPIOx_BSSR”其中的“x”可以为 A-E,也就是说这个寄存器说明适 用于 GPIOA、GPIOB 至 GPIOE,这些 GPIO 端口都有这样的一个寄存器。
  2. 偏移地址是指本寄存器相对于这个外设的基地址的偏移。
  3. 3寄存器的位表,表中列出它的 0-31 位的名称及权限。表上方的数字为位、编号,中间为位名称,最下方为读写权限,其中w表示只写,r表示只读,r/w表示可读写。本寄存器中的位权限都是 w,所以只能写,如果读本寄存器,是无法保证读取到它真正内容的。而有的寄存器位只读,一般是用于表示 STM32 外设的某种工作状态的,由 STM32 硬件自动更改,程序通过读取那些寄存器位来判断外设的工作状态。
  4. 位功能是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位的功能。例如本寄存器中有两种寄存器位,分别为 BRy 及 BSy,其中的 y 数值可以是 0-15,这里的 0-15 表示端口的引脚号,如 BR0、BS0 用于控制 GPIOx 的第 0 个引脚,若 x 表示 GPIOA,那就是 控制 GPIOA 的第 0 引脚,而 BR1、BS1 就是控制 GPIOA 第 1 个引脚。 其中 BRy 引脚的说明是“0:不会对相应的 ODRx 位执行任何操作;1:对相应 ODRx 位进行复位”。这里的“复位”是将该位设置为 0 的意思,而“置位”表示将该位设置为 1;说明中的 ODRx 是另一个寄存器的寄存器位,我们只需要知道 ODRx 位为1 的时候,对应的引脚 x 输出高电平,为 0 的时候对应的引脚输出低电平即可。所以,如果对 BR0 写入“1”的话,那么 GPIOx 的第0个引脚就会输出“低电平”,但是对 BR0 写入“0”的话,却不会影响 ODR0 位,所以引 脚电平不会改变。要想该引脚输出“高电平”,就需要对“BS0”位写入“1”,寄存器位BSy 与 BRy 是相反的操作。

利用C语言对地址进行封装

为方便于记忆,我们将总线基地址和外设基地址和寄存器基地址进行宏定义,便于我们通过偏移值准确找到寄存器位置

一旦我们找到了地址,就可以用指针操作进行读写

(该代码使用 (unsigned int *) 把 GPIOB_BSRR 宏的数值强制转换成了地址,然后再用 “*” 号做取指针操作,对该地址的赋值,从而实现了写寄存器的功能。同样,读寄存器也是用 取指针操作,把寄存器中的数据取到变量里,从而获取 STM32 外设的状态。)

为更简化,我们选择用结构体指针来访问寄存器。例如GPIOA-E组每组都有相同功能的寄存器,但我们用时却要每个寄存器都要进行宏定义。所以我们引入一个C语言结构体语法对寄存器进行封装,如下图

随后通过地址偏移和基地址就可以准确找出每个寄存器地址并作出相应操作,如下图


参考资料:

1、正点原子STM32开发板附带资料

2、(stm32学习总结)—对寄存器的理解 - 北极星! - 博客园

3、第5小节:寄存器介绍_哔哩哔哩_bilibili

4、5.STM32外设都有哪几类寄存器?(详解)_魏波.的博客-CSDN博客_外设控制器中的寄存器有

5、STM32 对外设基地址,总线外设基地址和寄存器基地址的理解_wuyuzun的博客-CSDN博客_基地址

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

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

相关文章

C++ 哈希表查询_进入哈希函数结界的世界

1. 前言 哈希表或称为散列表,是一种常见的、使用频率非常高的数据存储方案。 哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行 API 定制,对于大部分高级语言而言,都会提供已经实现好的、可直接使用的 API&…

基于PythonOpenCv的视频图像处理

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

【教程】虚拟环境与Pytorch安装保姆级教学

【教程】虚拟环境与Pytorch安装保姆级教学NVIDIA驱动安装虚拟环境创建激活/退出相关库的安装Pycharm内设置虚拟环境Pytorch安装安装地址可能遇到的问题处理报错安装卡顿测试是否安装完成参考NVIDIA驱动安装 NVIDIA驱动可在官网进行安装:NVIDIA驱动官网 命令行输入…

一文上手决策树:从理论到实战

一、基础概念 决策树是一类极为常用的机器学习方法,尤其是在分类场景。决策树通过树形结构来递归地将样本分割到不同的叶子结点中去,并根据每个叶子结点中的样本构成对该结点中的样本进行分类。 我们可以从两个视角来理解决策树模型。 第一种视角是将…

Python副业技术总结,手把手教你用宝塔面板部署Django程序

前言 最近写了几个Django项目,写完以后怎么让对方测试成了问题,因为之前都是自己在本地写的练习项目,对于部署这一块很陌生,不知道怎么操作,内心很忐忑。没办法,只能硬着头皮上,一边百度&#…

17种编程语言实现排序算法-插入排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言:C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台:安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

ARP渗透与攻防(四)之WireShark截获用户数据

ARP-WireShark截获用户数据 系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 1.WireShark工具介绍 wireshark的官方下载网站: WireShark wireshark是非常流行的网络封包分析软件,功能十分强大。可以…

PowerShell 学习笔记:压缩、解压缩文件

在自动构建的时候&#xff0c;最常用的就是压缩备份项目的源文件&#xff0c;PowerShell提供了相关命令。Compress-Archive&#xff08;压缩文件&#xff09;Compress-Archive[-Path] <String[]>[-DestinationPath] <String>[-CompressionLevel <String>][-P…

Crossplane - 比 Terraform 更先进的云基础架构管理平台?

&#x1f449;️URL: https://crossplane.io/ &#x1f4dd;Description: 将云基础架构和服务组成自定义平台 API 简介 在 11 月的 KCD 上海现场&#xff0c;听了一场阿里云的工程师关于他们自己的多云基础架构管理工具的介绍&#xff0c;前边的引言部分有介绍到 Terraform&am…

连续系统的数字PID控制仿真-3

在连续系统的数字PID控制仿真-2的基础上&#xff0c;利用S函数实现PID离散控制器的Simulink仿真。在S函数中&#xff0c;采用初始化函数、更新函数和输出函数&#xff0c;即 mdlInitializeSizes函数、mdIUpdates函数和mdlOutputs函数。在初始化中采用sizes 结构&#xff0c;选择…

什么是GRACE CPU --- Grace CPU架构详解

深入详解GRACE CPU架构 NVIDIA Grace CPU 是 NVIDIA 开发的第一款数据中心 CPU。 通过将 NVIDIA 专业知识与 Arm 处理器、片上结构、片上系统 (SoC) 设计和弹性高带宽低功耗内存技术相结合&#xff0c;NVIDIA Grace CPU 从头开始构建&#xff0c;以创建世界上第一个超级芯片 用…

Spring控制反转(IoC)和依赖注入(DI)

Spring官网&#xff1a;spring.io1.spring 2.SprinMVC 3.Maven高级 4.SpringBoot 5.MyBatisPlus为什么要学Spring?简化开发&#xff0c;降低企业级开发的复杂度框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用开发与运行效率Spring 系统架构IOC&#xff08;I…

分享132个ASP源码,总有一款适合您

ASP源码 分享132个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 132个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1bk2hftqR5NTdUIT2zvmbiw?pwdke5x 提取码&#x…

离散数学与组合数学-04图论

文章目录离散数学与组合数学-04图论4.1 图的引入4.1.1 图的示例4.1.2 无序对和无序积4.1.3 图的定义4.2 图的表示4.2.1 集合表示和图形表示4.2.2 矩阵表示法4.2.3 邻接点与邻接边4.3 图的分类4.3.1 按边的方向分类4.3.2 按平行边分类4.3.3 按权值分类4.3.4 综合分类方法4.4 图论…

干货 | 移动互联网应用程序(APP)个人信息安全自我评测工具

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;研究背景概述截止今年6月&#xff0c;我国已经有APP 232万款&#xff0c;手机网民达到10.47亿&#xff0c;在APP中大规模的个人信息收集和使用成为常态&#xff0c;个人信息…

【算法题】1828. 统计一个圆中点的数目

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个数组 points &#xff0c;…

Kubernetes:基于命令行终端UI的管理工具 K9s

写在前面 K9s 是一个基于终端UI的 K8S 管理工具博文内容为 k9s 在 windows、Linux 以及docker 安装Demo简单的 热键使用。理解不足小伙伴帮忙指正 我所渴求的&#xff0c;無非是將心中脫穎語出的本性付諸生活&#xff0c;為何竟如此艱難呢 ------赫尔曼黑塞《德米安》 K9s 是一…

客快物流大数据项目(一百零八):Spring Cloud 技术栈

文章目录 Spring Cloud 技术栈 ​​​​前言 一、微服务技术栈

如果物理学真的不存在?

最近过年&#xff0c;看「三体」电视剧。开始看剧情&#xff0c;觉得代入感挺不好的&#xff0c;特别林子健演的那个作战中心的长官&#xff0c;镜头从远处拉过去&#xff0c;看着他昂首挺胸慢慢走过去的样子。之后&#xff0c;讲到了火鸡和农场主的故事&#xff0c;这个时候再…

C++STL剖析(二)—— vector的概念和使用

文章目录1. vector的介绍2. vector的常见构造3. vector的遍历方式&#x1f351; [ ] 下标&#x1f351; 迭代器&#x1f351; 范围for4. vector 迭代器使用&#x1f351; begin 和 end&#x1f351; rbegin 和 rend5. vector 空间增长问题&#x1f351; size&#x1f351; cap…