关于STM32的寄存器操作学习

2023-05-16

(注:此为乐某学习记录,若有出错的地方欢迎各位指出!)

前言

本人使用的开发板的芯片是STM32H743XIH6,所以也是根据此芯片来进行操作。

一、寄存器

在STM32的学习过程里面,大部分人最开始应该都是学习标准库版本的,对于寄存器操作应该都不太了解。百度百科对于寄存器的介绍,寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。

简单的理解为,一个存放了东西的东西。只不过,里面存放的是某些数据或者指令。就像你身份证号,代表了你的省份、城市、县区等等。如果想要找到你,对你做某件事或者获取一些东西,就会根据你的身份证号,找到你的所在地。这些操作,对于寄存器来说,称为读和写。

对于寄存器的读操作来说,就是你想要获取寄存器的数据,那么就需要找到这个寄存器,然后直接读数据多少即可,这也叫访问寄存器。

对于寄存器的写操作来说,就是你想要修改寄存器的数据,那么就需要找到这个寄存器,然后直接将数据写在寄存器里,这也叫写寄存器。

现在我们已经知道了读写操作,但是寄存器这么多,怎么找到我们想要的寄存器呢?怎么去区分它们呢?这就要引用C语言的一个操作,指针和&的使用,想在窗口控制台输入一个变量,是不是要用到scanf这个语句?那这个&符号的作用,就是取这个变量的地址!不同的寄存器,地址也就不一样,所以想要找到对应的寄存器,我们就找到对应的地址就行了!就像前面讲的身份证号,你可能四处旅游,想通过身份证号找到你可能有点困难,但是在STM32芯片里就不同,每一个寄存器的地址都在芯片出厂的时候就已经分配了!

二、怎么找到寄存器的地址?

我们打开参考手册,看到存储器和总线架构这一章,往下滑就可以看到寄存器的边界地址。

例如,我们想要打开GPIOB的时钟,我们就要找到RCC的这一栏。由下图可看出,只要是和RCC相关的,都在0x58024400-0x580247FF这一区间。

然后,我们就要打开芯片的数据手册,找到我们的GPIOB的时钟挂在哪一条总线上。由下图可看出,GPIOA~GPIOK都挂在AHB4总线上。

我们再回到参考手册的RCC寄存器说明,可以看到好几个和AHB4相关的寄存器。我们只需要看到RCC_AHB4ENR,实际上这里应该叫做时钟使能寄存器。

看到寄存器开头的介绍,里面是有两个偏移地址的,我两个都使用过,同样可行。我们找到了这个偏移地址后,RCC_AHB4ENR的地址就是0x58024400+0xE0;

三、怎么对寄存器的位进行操作?

这里我们需要掌握位操作,C语言有以下6个位操作符。

位操作符

名称

&

按位与

|

按位或

^

按位异或

~

按位取反

<<

按位左移

>>

按位右移

按位与(&):同一位上,同样为1,&的结果就为1,只要有一个0或者两个都是0,结果就为0;

按位或(|):同一位上,只要有一个为1,|的结果就为1,两个都是0,则结果就为0;

按位异或(^):同一位上,两个不相同则为1,相同则为0;

按位取反(~):将结果取反,1为0,0为1;

按位左移(<<):运算符左边的运算量全部向左边移动运算符右边的运算量,高位舍弃,低位补0;

按位右移(>>):运算符左边的运算量全部向右边移动运算符右边的运算量,高位补0,低位舍弃;

我们已经了解位操作,也会查找寄存器的地址后,看到寄存器的位说明,在这一位置位,即可使能GPIOB的时钟。

1、寄存器的直接操作

代码里我使用了宏定义来操作,但是,这些宏在我们看来是寄存器的地址,但是在编译器看来,这只是一个普通的变量,所以我们要让编译器也要让它认为是一个指针也就是地址,我们就得进行强制类型转换,把它转换成uint32_t类型的指针,然后对这个指针进行解引用操作也就是*操作。这样下来,我们就完成了GPIOB的时钟使能啦!

uint32_t *pAHB4_Addr = (uint32_t *)(RCC_START_ADDR + RCC_AHB4_OFFEST);    //RCC->AHB4ENR
*pAHB4_Addr |= (0x01 << 1);    //开启GPIOB时钟

2、寄存器地址映射

直接访问的操作非常的麻烦,每操作一个寄存器就必须去查看数据手册,然后找找这个寄存器的地址。 ST官方专门在一个.h文件里面,做好了寄存器的地址映射,我的是stm32h743xx.h。下面就是使用映射的地址进行的GPIOB的时钟开启操作。

RCC->AHB4ENR |= (0x01 << 1);

总结

寄存器的操作,相对于标准库或者HAL库来说,会麻烦很多,但是操作是直接式的。在使用库的操作,需要知道函数的作用,然后知道要往里面填入什么变量即可,剩下的内容函数里已经帮你写好了。所以相对寄存器来说是非常省事的,而且填入不同的参数,也会去执行不同的操作,兼容性也很强。使用寄存器的话,可能当前的函数只能够符合当前的功能,如果要换其他的,可能又要重新写,重新去看寄存器的说明等等,要做成兼容其他功能的,又要重新写一个函数,相对库函数来说就非常费事了!

但是,如果在学习阶段,我还是非常建议学习寄存器操作的,这样对于芯片的外设会理解的比较深。库函数的话,也是可能会存在一些bug的,在学习过寄存器后再去学习库函数,就可以发现那些bug,并做出修复!

参考文章

yummy说电子:STM32寄存器的简介、地址查找,与直接操作寄存器

https://blog.csdn.net/geek_monkey/article/details/86291377?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167715960316800225526095%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=167715960316800225526095&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-10-86291377-null-null.blog_rank_default&utm_term=stm32%E5%AF%84%E5%AD%98%E5%99%A8%E7%BC%96%E7%A8%8B&spm=1018.2226.3001.4450

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

关于STM32的寄存器操作学习 的相关文章

  • 仿微信地图定位列表

    gitbub源代码链接 xff1a https github com MinLee6 LMMapLocationList 首先按照百度配置要求配置开发环境 1 在AppDelegate mm中设置百度定位的key BOOL applicat
  • FreeBSD zfs安装bhyve跑虚拟机

    FreeBSD zfs文件系统下跑bhyve虚拟机 xff0c 使用简单且稳定高效 xff0c 今天新装一个n3450的小主机 xff08 省电 xff09 xff0c 此简单记录下vm bhyve工具的使用 1 安装 a xff0c 更改
  • vmware下unbuntu虚拟机网络启动后过几分掉线原因

    我vmware用的是17 01 build 21139696版本 xff0c ubuntu使用的是16 lts版本 xff0c 总是开机或挂起恢复后过一段时间网络就掉线 xff0c 但网络的上下两个箭头符号却是正常的 xff0c 并未显示掉
  • 联想 ubuntu14.04无线网卡被禁用的解决办法

    新人在学习Linux时 xff0c 一般会选择安装ubuntu系统 xff0c 但是很多笔记本都会出现安装系统后无限网卡被禁用的问题 xff0c 这种情况的原因我认为并不是无线网卡的驱动没有安装 xff0c 而是ubuntu系统驱动的某个地
  • 序列切片

    序列切片 切片 切片就是指对操作对象 截取 其中一部分的操作 字符串 列表 元祖 有序序列 都支持切片操作 基本语法 顾头不顾尾 序列名称 span class token punctuation span 开始位置下标 span clas
  • 阿里云领取免费2H2G云服务器&证书分享(一):Apsara Clouder云计算专项技能认证:云服务器ECS入门

    这个证书是你领服务器一个月内要考的 xff0c 内容也不难 新老用户都能领 xff0c 要求是有学生认证 当然这个证书是独立的 xff0c 你也可以不认证直接考 点击这个链接 阿里云飞天计划 跳转到阿里云飞天计划 领的服务器如果想不到要做什
  • 卷积神经网络的旋转不变性理解

    卷积神经网络本身的设计对旋转不变性没有进行专门的考虑 xff0c 只不过max pooling可以稍微补偿一下这个功能 xff0c 只是角度变化太大 xff0c 可能会作用不大 xff0c 但因为max pooling并不是为此而设计的 x
  • VS code + Win10 Linux子系统(Ubuntu)开发ESP32

    Windows开发ESP32 最近在研究EPS32 xff0c 但是和STM32之类的单片机不同 xff0c 国内资料大多是在arduino上的简单修改 xff0c 想开发底层硬件比较困难 xff1b 而官方提供的eclipse集成环境体积
  • malloc和calloc的区别

    malloc和calloc的区别有两点 xff1a 两个函数的参数不一样 malloc只有1个参数 xff0c 而calloc有两个参数内存分配后初始化不一样 calloc会把分配的内存全部初始化为0 xff0c 而malloc没有初始化操
  • ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

    欢迎关注大数据和人工智能技术文章发布的微信公众号 xff1a 清研学堂 xff0c 在这里你可以学到夜白 xff08 作者笔名 xff09 精心整理的笔记 xff0c 让我们每天进步一点点 xff0c 让优秀成为一种习惯 xff01 有时候
  • CSDN完整导出pdf博客内容,去除冗余,仅保留blog

    本文完全参考自其它博客 xff1a 新CSDN文章转成PDF 打印 去空白 IT说的博客 CSDN博客 如何将CSDN的文章导出为pdf xff1f 我的blog屋 CSDN博客 csdn导出pdf 原博客代码执行后还保留了博客作者栏 xf
  • WSL2连接调用USB设备

    声明 xff1a 本文教程来源于微软官网WSL教程 xff0c 链接地址 xff1a Connect USB devices 最近在学OpenCV xff0c 发现微软的WSL是个好东西 xff0c 结合VS Code编辑器 xff0c 无
  • 树莓派使用code-server遇到的问题

    code server在树莓派上使用是没有问题的 xff0c 只要保证树莓派系统较新 xff0c 一般不会遇到什么问题 1 以下一系列出现的问题 xff0c 都与系统环境比较旧有关 xff1a code进程一直100 占用CPU浏览器建立V
  • Mysql插入JSON串会被去一层转义

    Mysql插入JSON串会被去一层转义 问题描述 背景 xff1a 在数据库更新 新增一个字段为JSON串的时候 xff0c 被去一层转义 xff0c 导致程序解析失败 xff0c 报错 原JSON串 span class token pu
  • VS保存并生成解决方案

    一个小技巧 xff0c 提高开发效率 xff0c 使开发更迅速 为您节约更多时间 xff0c 去陪恋人 家人和朋友 背景 xff1a 使用VS工具开发 调试时需要右键项目 xff0c 生成或者重新生成解决方案 而时常大脑高速运作 xff0c
  • mysql分组排序取第一条数据

    需求 xff1a mysql 根据某一个字段分组 xff0c 然后组内排序 xff0c 最后每组取排序后的第一条数据 1 先使用 xff08 分组字段 43 排序字段 xff09 排序 相当于实现了分组和排序 xff0c 只是没有根据分组字
  • 设置 edge 浏览器跨域

    执行下面两条命令 xff0c 然后重启edge span class token string 34 C Program Files x86 Microsoft span class token entity title E span dg
  • 最简单的基于FFmpeg的AVfilter例子(水印叠加)

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • FFmpeg源代码简单分析:avio_open2()

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • n6005/n5105在debian11实现jellyfin硬解

    n6005 n5105在debian11实现jellyfin硬解 inter集成显卡debian11默认不支持硬解 xff0c 可按以下方式正确开启 1 环境 软件 delbian11 硬件 n6005 docker环境 安装jellyfi

随机推荐

  • ModuleNotFoundError: No module named 'cv2'

    ModuleNotFoundError No module named 39 cv2 39 解决方法 xff1a pip install opencv python
  • C++实现链表逆序

    链表的结构 lt pre name 61 34 code 34 class 61 34 html 34 gt lt pre name 61 34 code 34 class 61 34 cpp 34 gt struct listnode i
  • 初始化我的archlinux

    初始化我的archlinux 进入tty模式 xff0c ctrl 43 alt 43 f12 设置镜像 sudo vim etc pacman conf 开机archlinuxcn manjaro archlinuxcn The Chin
  • C语言实现Split函数

    借助C语言的动态内存分配 xff0c 实现类似VB中Split函数的效果 结构体介绍 xff1a IString xff1a 参数 str 字符串数组的指针 参数 num 字符串个数 函数介绍 功能 xff1a 按一个字符来拆分字符串 参数
  • openWrt从源码下载到编译(开发环境搭建)

    更新 xff1a 最近openwrt SVN失效了 xff0c 不过官方有新的教程 https wiki openwrt org zh cn doc howto buildroot exigence OpenWrt编译系统 安装 OpenW
  • Linux操作GPIO(文件IO方式)

    首先 xff0c 看看系统中有没有 sys class gpio 这个文件夹 如果没有请在编译内核的时候加入 Device Drivers gt GPIO Support gt sys class gpio sysfs interface
  • 斐讯路由器K2最新刷机教程

    最新版固件无法刷机让人很头疼 xff0c 我们需要先手动降级 xff0c 把固件刷回以前版本 xff0c 再用刷机工具进行刷机 1 登录路由器找到如下界面 下载这个文件SW K2 703004604 V21 4 6 12 bin 在上面界面
  • Linux C Socket UDP编程介绍及实例

    1 UDP网络编程主要流程 UDP协议的程序设计框架 xff0c 客户端和服务器之间的差别在于服务器必须使用bind 函数来绑定侦听的本地UDP端口 xff0c 而客户端则可以不进行绑定 xff0c 直接发送到服务器地址的某个端口地址 框图
  • Base64编码、解码 C语言例子(使用OpenSSL库)

    include lt stdio h gt include lt string h gt include lt unistd h gt include lt openssl pem h gt include lt openssl bio h
  • 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成 xff0c 我去研究如何用C语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的功能 xff0c 用户通过网
  • 解决QCamera使用QCameraImageCapture截图卡顿问题

    卡顿原因 xff1a QCameraImageCapture每次调用capture xff0c 无论你是否输入路径 xff0c 都会将捕获的图片存盘 xff0c 存盘的速度慢导致卡顿 解决思路 xff1a 将捕获的图片输出到内存缓冲区而不存
  • tmux使用手记

    tmux 指令操作 session 会话 xff1a session是一个特定的终端组合 输入tmux就可以打开一个新的session tmux new s session name 创建名为 session name 的 tmux ses
  • Oracle中to_char()函数的用法

    Oracle中to char 函数的用法 日期转换 xff1a to char date 39 格式 39 select to date 39 2005 01 01 39 39 yyyy MM dd 39 from dual select
  • terminator安装及常用操作

    terminator 安装 sudo add span class hljs attribute apt span span class hljs attribute repository span ppa gnome span class
  • 嵌入式硬件开发基础(持续更新)

    电阻 理论基础 电阻的定义 电荷在导体中运动时 xff0c 形成电流 导体中的分子 原子等其他粒子阻碍电荷移动 xff0c 进而阻碍电流这种阻碍作用 xff0c 我们称之为电阻 欧姆定律 经典公式 xff1a I 61 U
  • Hadoop Shell基本操作

    Hadoop Shell 基本操作 任务目标 1 熟练掌握常用的hadoop shell命令 相关知识 调用文件系统 FS Shell命令应使用 hadoop fs lt args gt 的形式 所有的的FS shell命令使用URI路径作
  • linux系统添加根证书 linux证书信任列表

    1 linux 访问 https 证书问题 root 64 boss test dev001 jydx curl v https mobile mycard520 com tw About to connect to mobile myca
  • 客户端和服务器端交互模型

    当我们在浏览器中输入一个地址 xff0c 到最后看到页面 xff0c 中间都经历了哪些事情 xff1f 假设我们访问的是https fanguvw xyz 这个地址 xff0c 当我们摁下Enter键 xff0c 我们可以看到博客首页 xf
  • PostgreSQL ERROR: no partition for partitioning key

    问题 xff1a Error updating database Cause org postgresql util PSQLException ERROR no partition for partitioning key seg1 se
  • 关于STM32的寄存器操作学习

    xff08 注 xff1a 此为乐某学习记录 xff0c 若有出错的地方欢迎各位指出 xff01 xff09 前言 本人使用的开发板的芯片是STM32H743XIH6 xff0c 所以也是根据此芯片来进行操作 一 寄存器 在STM32的学习