重生归来之挖掘stm32底层知识(1)——寄存器

       概念理解

         要使用stm32首先要知道什么是引脚和寄存器。

        如下图所示,芯片通过这些金属丝与电路板连接,这些金属丝叫做引脚。一般做软件开发是不需要了解芯片是怎么焊的,只要会使用就行。我们平常通过编程来控制这些引脚的输入和输出,一般在开发板上引出来针脚,这些针脚基本上都是我们可编程的,一般叫做GPIO。

         单片机现在存在于生活中的方方面面,高端的像手机电脑,低一些的像家用电器的显示屏,这背后都有单片机的存在。在一些功能少的东西上面用大内存的芯片会导致成本高,所以单片机的内存都非常小,因此其编程语言采用的也是针对底层的C语言。

        通过C语言,可以找到单片机各种外设资源的地址,并进行读和写的操作。每一个外设所占的地址被叫做存储器,其地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,如果给存储器再分配一个地址就叫存储器重映射。

        存储器划分好了之后,在里面还有很多不同外设的负责不同功能的字节。stm32芯片的每个功能都被分配了4个字节(Byte)即32bit来控制,所以这负责控制某个功能的4个字节被称为一个单元。为了方便记忆,为每个单元起个名字,这个名字就是寄存器,取名的过程就是寄存器映射。下图为寄存器起始地址。

         通过外设的起始地址,再加上每个寄存器的起始地址,通过C语言的指针就能找到需要配置的寄存器,通过位与和位或就能对其进行操作。

总结

        简单来说,寄存器就是各个外设对应功能的名字,通过对这些名字进行操作就能实现对我们需要编程的位进行读写操作,从而控制相应引脚的输入输出状态,实现我们想要的功能。

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

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

相关文章

CefSharp_Vue交互(Element UI)_WinFormWeb应用(3)---通过页面锁屏和关机(含示例代码)

一、预览 实现功能:通过vue标题栏按钮锁屏和关机 1.1 预览 1.2 代码 锁屏代码csharp LockWorkStation() 关机代码chsharp 注意vue代码参数和此参数一致(0/1/2) 方法ExitWindowsEx()

Docker部署ddns-go教程(包含完整的配置过程)

本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \

鲲鹏云-docker安装mysql8.0-并设置参数(--lower-case-table-names=1)

前言: 由于鲲鹏云是arm架构,公司现有的镜像就用不了,为了搭建个测试环境,记录一下搭建过程 注意在mysql8.0里面lower-case-table-names必须在第一次安装时设置。 ①镜像的获取 鲲鹏镜像pull下来是不能跑的,会提示内…

Pycharm打印区打印数据不全问题

问题:pycharm底下的打印区打印一个比较大的数据,发现数据不全,只显示一板 解析:可能是打印区域的缓存不足导致的 解决办法: 找到pycharm的idea.properties文件,具体路径以下显示,前面路径看个人…

【十一,是忆】往事如风,回忆如诗,且行且歌

【十一,是忆】往事如风,回忆如诗,且行且歌 十一天的入职培训之所见、所得、所思、所感 820 启程 时隔两月,回到了熟悉的北京,我的脚又一次踏在这片土地上,遗憾的是周转的北京西站,未曾停留多久…

C语言中数据类型

一、C 语言中数据类型 基本数据类型: 整型(int):用于存储整数,如:1、2、3等。字符型(char):用于存储单个字符,如:‘a’、‘b’、c’等。浮点型&a…

Docker安装SVN,搭建自己的本地版本仓库

一、拉取镜像并运行容器 docker pull garethflowers/svn-server docker run --restart always --name svn -d -v /root/dockers/svn:/var/opt/svn -p 3690:3690 garethflowers/svn-server 1、解析 /root/dockers/svn为宿主机的文件目录,/var/opt/svn为容器内的文件…

线程池是啥有啥用,怎么用,如何自己实现一个

目录 一、线程池是啥,有啥用 二、线程池怎么用 1.构造方法 2.如何使用Java的线程池 三、简单实现一个线程池 假设我是一个(好看有才华) 的妹子,那么我就会有很多追求者,这些也叫备胎们,我们若把他…

应用性能优化实践(一)ArkTS高性能编程

在开发HarmonyOS应用时,优化应用性能是至关重要的。通过ArkTS高性能编程、减少丢帧卡顿、提升应用启动和响应速度,可以有效提升用户体验。 一、ArkTS高性能编程 ArkTS是基于TypeScript涉及的,但出于编码的稳定性和性能考虑,一些T…

QT项目添加资源文件

效果 1.先将图片等资源文件复制到QT项目源码目录中。 2.再添加资源文件 打开资源文件编辑 全选文件 代码

【遥感图像船舶检测数据集】

【遥感图像船舶检测数据集】nc1 标签names: [ship,] 名称:【‘船’】共4126张,8:1:1比例划分,(train;3300张,val:412张,test:414张标注文件为YOLO适用的txt格式。可以直接用于模型训…

利用LaTeX写学位论文使用biblatex生成盲评的成果列表

利用LaTeX写学位论文使用biblatex生成盲评的成果列表 引言 在之前的文章《latex参考文献中修改指定作者的格式来突出显示》,我们介绍了在LaTeX中利用参考文献的方式生成学位论文的成果列表,而且将其中的作者突出显示。 但这种方式是用于明评的&#xf…

建筑物检测系统源码分享

建筑物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

C语言-结构体-详解

博客主页:【夜泉_ly】 本文专栏:【C语言】 欢迎点赞👍收藏⭐关注❤️ C语言-结构体-详解 1.前言2.结构体类型2.1声明2.2变量的创建与初始化2.3访问2.4匿名结构体类型 3.结构体内存对齐3.1对齐规则3.2示例 1.前言 在C语言中,除了整…

MyBatis 增删改查【后端 17】

MyBatis 增删改查 引言 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs (…

挑战力扣高难度算法、数据库题

一.算法类 1622题,困难,奇妙序列 class Fancy { public:static const int MOD 1e9 7;long long M_total; // cumulative multiplicative factorlong long A_total; // cumulative additive factorvector<long long> val; // original valuesvector<long long> …

PTrade量化服务器连接openapi的地址、key等配置涉及哪些文件?

量化服务器连接openapi的地址、key等配置涉及哪些文件&#xff1f; 1、/home/fly/data/BasicInfo/asset_config.yml中OPEN_API_URL配置为OPENAPI行情地址&#xff1b; 2、/home/fly/config/general_config.conf中client_id配置为OPENAPI行情app_key&#xff0c;client_secret配…

将YYYY-MM-DD HH:mm:ss格式化为YYYY-MM-DD (星期一) 下午 ?点

分为凌晨、早上、中午、晚上 function formatDate(inputDate) {const date new Date(inputDate);date.setHours(date.getHours() - 1);const year date.getFullYear();const month date.getMonth() 1; // 月份从0开始const day date.getDate();let hours date.getHours(…

Spring为什么要用三级缓存解决循环依赖?

Spring为什么要用三级缓存解决循环依赖&#xff1f; 1. Spring是如何创建一个bean对象2. Spring三级缓存2.1 一级缓存&#xff1a;单例池&#xff0c;经历过完整bean生命&#xff0c;单例Bean对象2.2 二级缓存&#xff1a;提前暴露的Bean2.3 三级缓存&#xff1a;打破循环 3. S…

三年 Sparker 都不一定知道的算子内幕

一、如何在 mapPartitions 中释放资源 mapPartitions是一种对每个分区进行操作的转换操作&#xff0c;于常用的map操作类似&#xff0c;但它处理的是整个分区而不是单个元素。mapPartitions的应用场景适合处理需要在每个分区内批量处理数据的场景&#xff0c;通常用于优化性能…