当前位置: 首页 > article >正文

STM32寄存器控制引脚高低电平

一. 引子

        最近在学习32代码的过程当中,虽然在学习IMX6ULL开发板的过程中接触过很多寄存器,最近在返回去看32的时候,在研究代码的时候发现自己对于寄存器的有些特性理解的不够深刻,所以下来的时候去查了资料,以及问了一下自己的学霸朋友楚灵魈,然后对有些寄存器还是有了一些新的认识

二. STM32F10xx部分寄存器

       1. 端口输出数据寄存器(GPIOx_ODR)(x=A..E)

        首先是GPIOx_ODR,官方解释是端口输出数据寄存器,从图示可以看出,bit[31:16]是保留位实际有效位只有bit[15:0],还有一个的点,就是图示下面有一个rw,表示这是一个读写寄存器,这里先解释具体作用,后面在介绍了其他寄存器再描述

        然后就是官方文档中的bit[15:0]的作用我们应该如何去理解。其中0-15位都对应GPIO端口的一个引脚,例如我们使用的是GPIOA_ODR0,那么对应的GPIO端口就是PA0,以此类推GPIOB_ODR1,GPIO端口就是PB1

        下一段的信息是,端口输出数据,也就是ODR寄存器中的每一位值,决定了相应引脚的输出电平。如果某一位为1,则输出为高电平,如果某一位为0,则输出为低电平。 
        如果我把GPIOA_ODR0设置为1,那么这个引脚就是高电平,反之如果设置为0就是低电平
        关于(y=0......15)对应的就是端口号,也就是0到15这个没什么好说的

        "这些位可读可写并只能以字(16位)的形式操作"首先这里再次强调这是一个16位的寄存器,在这段话中它也提到了是可读可写的
        只能以字(16位)的形式操作,意味着只能一次性读取或者写入整个16位的ODR寄存器,不能单独的读取或者写入ODR寄存器的某一位

        GPIOx_BSRR(x = A..E),可以分别对各个ODR位进行独立的设置/清除。x也就是可以对应选择GPIOA或则和GPIOB
        分别对各个ODE进行独立的设置/清除,这个点留到之后讲解因为会和其他的寄存器产生关联

        总而言之,ODR寄存器是一个16位的寄存器,可以用于控制GPIO端口的输出电平,设置为1为高点平,设置为0为低电平,目前主要的作用就是这样

        2. 端口位设置/清除寄存器(GPIOx_BSRR)(x=A..E)

        此寄存器是端口位设置/清除寄存器,如下图[31:0]都是有效位,但是所有的位下面都是w,表示这是一个只写寄存器,没有被读取功能
        

        简单来讲BSRR一个32位的寄存器,用于控制GPIO端口的输出,分别分为bit[31:16]和bit[15:0],按照简单理解就是,这个寄存器既可以控制端口输出高电平,也可以控制端口输出低电平


        这里讲解到BSRR的时候就要引出到之前没有了解到的一个概念,向BSRR寄存器写入值(例如0x003)后,硬件会立即更具掩码更新ODR寄存器,意思就是BSRR会将参数直接传输给ODR寄存器。
        也就是说为什么BSRR是只写寄存器,因为它本身不存储任何值,写入操作完成后BSSR内部的值会恢复为0(即使尝试读取此寄存器也会得到未定义的值或者0),下面我们具体讲解

        位31:16(BRy),这些位只能写入并只能以字(16位)的形式操作,这些16位是用于清除ODR寄存器中相应位为0(低电平)
        如果向BRy某一位写入0,ODR寄存器的相应位保持不变,如果向BRy的某一位写入1,则ODR寄存器的相应位被设置为0(低电平),但是如果同时向BSRR寄存器的低16位和高16位 ,则以低16位(BSy)的设置优先

        而15:0(BSy),用于设置ODR寄存器中相应位为1(高电平),和上面的类似,如果向BSy的某一位写入0,则0DR寄存器的相应位保持不变,如果向BSy的某一位写入1,则ODR寄存器的相应位被设置为1

        3. 端口位清除寄存器(GPIOx_BRR)(x=A...E)


        这个寄存器的功能如上图,那么从如上信息就可以看出,这个端口位清除寄存器,用于设置某个端口为低电平
        但是本质上还是在操作ODR寄存器,因为此寄存器也只有写入的功能,没有读取的功能,在写入值后还是把数据传输给ODR寄存器

        但是这个寄存器在之后很多的芯片中都被优化掉了,所以如果要对某个位进行单独的设置,所以还是可以使用BSRR

三. 实验验证

        借助博主最近正在学习的一段代码,首先接上Stlink后,给板子通电进入,然后点击上面的Start/Stop Debug Session,进入调试模式

       

        那么我们如何查阅寄存器的值,进入调试模式后,点击左上角的View

        然后进入System_Viewer,然后点击自己想要查考的寄存器,比如这里博主想要查找GPIOB_ODR寄存器,那么就在这里选择GPIOB

        点击后如下图,右栏可出现,和GPIOx相关的寄存器,其中就包含上面我们讲解过的ODR、BSRR、以及BRR寄存器
        和我们上面讲解的一致,BSRR和BRR等特殊的寄存器,并不具备被读的功能,所以它们的值都是0的状态

        如上图我们可以看到ODR寄存器的值是0X00000010,按道理来说刚开始我们并没有设置任何引脚的电平为高,寄存器这里为什么会显示值
        有些引脚可能是特殊位,所以刚开始的时候可能就被设置了值,例如这里的GPIOB_ ODR寄存器,就可以看出是PB4引脚被设置为了高电平,我们可以去看一下原理图

        

        是引脚PB4,JNTRST引脚,JNTRST引脚在默认状态下是高电平,所以在上面我们看到的ODR寄存器中ODR的值并不是全部为0
        所以在程序开始的时候,寄存器的值并不一定全部都是0,因为有些特殊的引脚比如上面JNTRST,以及SWDIO、SWCLK等引脚,也是全部置为1的,因为必须保持为高电平

        那么就根据博主的代码开始调试,刚开始的时候GPIOB->ODR寄存器的值是0X00000010, 

      
  
        在进行到如上这一步的时候,我们发现ODR寄存器的值产生了改变,变成了0x00000013,那么看一下,代码fLED_L中发生了什么


         这里进行了一个宏定义,然后操作了GPIO_Pin_0和GPIO_Pin_1,进行了位运算,那么我们要计算出结果,还是要去看GPIO_Pin_0和GPIO_Pin_1的参数
        

        代码执行的是fLED_L,那么我们计算一下0001和0011相或,得到的结果就是0x11,转换为十六进制就是3,因为结果是0X11但是前面讲解过,BSRR的值被写入后,会将数据直接传递给ODR寄存器,因为是低16位,所以是将引脚设置为1,所以ODR的0位和1位,也被设置为1,高电平
        那么这个宏定义的作用就是,控制PB0和PB1的引脚为高电平
        通过调试的方式我们读取到了寄存器的值,验证了我们的猜想,操作寄存器的值确实会让人觉得设计的非常的巧妙
        

        所以以上博客是博主在学习寄存器的过程中,学习到的一些知识点。如果有阅读者看到我的博客能够将寄存器理解的更好,那也是这篇博客的价值所在了

相关文章:

STM32寄存器控制引脚高低电平

一. 引子 最近在学习32代码的过程当中,虽然在学习IMX6ULL开发板的过程中接触过很多寄存器,最近在返回去看32的时候,在研究代码的时候发现自己对于寄存器的有些特性理解的不够深刻,所以下来的时候去查了资料,以及问了一…...

SOC-ATF 安全启动BL1流程分析(1)

一、ATF 源码下载链接 1. ARM Trusted Firmware (ATF) 官方 GitHub 仓库 GitHub 地址: https://github.com/ARM-software/arm-trusted-firmware 这是 ATF 的官方源码仓库,包含最新的代码、文档和示例。 下载方式: 使用 Git 克隆仓库: git…...

QVariantList使用详解

QVariantList 1. 基本概念2. 使用场景3. 基本操作3.1 创建和初始化3.2 访问元素3.3 修改元素3.4 删除元素 4. 实际应用示例5. 总结其他QT文章推荐 QVariantList 是 Qt 框架中的一个类,用于存储和操作 QVariant 对象的列表。 QVariant 是 Qt 中用于封装各种类型的通…...

TDesign:Cascader 级联选择器(省市区三级联动)

Cascader 级联选择器API 参考官方示例代码 在自己的模板中使用:view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:tdesign_flutter/tdesign_flutter.dart;import i…...

Ubuntu20.04下各类常用软件及库安装汇总

1.Miniconda的安装 Ubuntu 20.04版本快速安装 Miniconda(宝宝级攻略) 2.Nvidia显卡驱动/CUDA/cuDNN安装 Ubuntu 20.04安装nvidia显卡驱动/CUDA/cuDNN Ubuntu 20.04:CUDAcuDNN安装&卸载 Y9000P24款 win11ubuntu20.04 双系统教程 3.SGL…...

linux中安装部署Jenkins,成功构建springboot项目详细教程

参考别人配置Jenkins的git地址为https,无法连上github拉取项目,所以本章节介绍通过配置SSH地址来连github拉取项目 目录: 1、springboot项目 1.1 创建名为springcloudproject的springboot项目工程 1.2 已将工程上传到github中,g…...

2025系统架构师(一考就过):案例之四:架构复用、架构评估、特定架构(DSSA)、架构开发方法(ABSD)

二、软件架构复用 ◆软件产品线是指一组软件密集型系统,它们共享一个公共的、可管理的特性集,满足某个特定市场或任务的具体需要,是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理复用、集成新的系统。 ◆软件架构…...

基于定制开发开源AI大模型S2B2C商城小程序的商品选品策略研究

摘要:随着电子商务的蓬勃发展和技术的不断进步,商品选品在电商领域中的重要性日益凸显。特别是在定制开发开源AI大模型S2B2C商城小程序的环境下,如何精准、高效地选择推广商品,成为商家面临的一大挑战。本文首先分析了商品选品的基…...

后端之JPA(EntityGraph+JsonView)

不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表,然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码,而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...

linux--卡顿

1,swappiness swappiness是一个影响操作系统如何使用交换空间(swap space)的内核参数。它的值范围是从0到100,这个数值决定了系统将数据从物理内存(RAM)移动到交换分区或交换文件的倾向程度,交…...

【Python pro】函数

1、函数的定义及调用 1.1 为什么需要函数 提高代码复用性——封装将复杂问题分而治之——模块化利于代码的维护和管理 1.1.1 顺序式 n 5 res 1 for i in range(1, n1):res * i print(res) # 输出:1201.1.2 抽象成函数 def factorial(n):res 1for i in range(1…...

Docker 2025/2/24

用来快速构建、运行和管理应用的工具。帮助部署。 快速入门 代码略 解释 docker run :创建并运行一个容器,-d是让容器在后台运行 --name mysql :给容器起个名字,必须唯一 -p 3306:3306 :设置端口映射 -e KEYVALUE :是设置环境变量 mysql :指定运行的…...

4. 示例:创建带约束的随机地址生成器(范围0x1000-0xFFFF)

文章目录 前言代码示例:运行方法:查看结果:关键功能说明:扩展功能建议: 前言 以下是一个完整的SystemVerilog测试平台示例,包含约束随机地址生成、日志输出和波形生成功能: 代码示例&#xff1…...

爱普生SG-8101CE可编程晶振赋能智能手机的精准心脏

在智能手机高速迭代的今天,高性能、低功耗与小型化已成为核心诉求。智能手机作为人们生活中不可或缺的工具,需要在各种复杂场景下稳定运行。爱普生SG-8101CE可编程晶振凭借其卓越性能,成为智能手机中不可或缺的精密时钟源,为通信、…...

指针解剖学:穿透C/C++内存操作的核心密码与避坑指南

一、指针的本质与内存模型 指针是C/C的核心特性,本质是内存地址的变量化表示。每个变量在内存中占据连续的字节空间,地址是内存单元的唯一编号(如0x0028FF40)。指针变量存储的是目标数据的首地址,通过地址间接操作数据…...

Qt关于平滑滚动的使用QScroller及QScrollerProperties类说明

一、触控时代的滚动工具:QScroller类设计介绍 1.1 从机械滚轮到数字惯性 在触控设备普及前,滚动操作如同老式打字机的滚轴,只能通过鼠标滚轮或滚动条进行离散式控制。QScroller的出现如同给数字界面装上了"惯性飞轮",…...

【音视频】编解码相关概念总结

NALU RTP PS流 三者总体关系 NALU在RTP中的应用:视频流的RTP传输通常将NALU作为基本的单元进行传输。每个RTP包携带一个或多个NALU,这些NALU包含了视频编码数据。RTP协议通过其头部信息(如时间戳、序列号等)帮助接收端重新排列和…...

Vue3 + Vite + TS,使用 配置项目别名属性:resolve

使用 resolve 配置全局项目路径别名 1.优化了开发中单页面引用其他模块的路径复杂性 2.妥妥解决了,组件复用当中提高开发效率 // 不使用配置 import { useStore } from ../../../stores // 使用配置 可根据开发者需求任意定义,较多 import { useStore…...

docker创建nginx

docker run -d -p 8080:80 --name my-nginx-container nginx docker:命令 run:命令 -d:在后台运行容器 -p:8080:80:将容器内部的80端口映射到宿主机的8080端口。 --name my-nginx-container:为容器指定一个…...

StableDiffusion打包 项目迁移 项目分发 1

文章目录 SD项目迁移前置知识webui-user.batwebui.batlaunch_utils.py 下一篇开始实践 SD项目迁移 显卡驱动更新:https://www.nvidia.cn/geforce/drivers/ 下载安装三个程序: python3.10.6: https://www.python.org/downloads/release/python-3106/gi…...

【数据结构进阶】哈希表

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 一、哈希表的概念 二、哈希函数的实现方法 1. 直接定址法 2. 除留余数法 三、哈希冲突 1. 开放定址法(闭散列&#xff0…...

【蓝桥杯嵌入式】各模块学习总结

系列文章目录 留空 文章目录 系列文章目录前言一、LED模块1.1 赛题要求1.2 模块原理图1.3 编写代码1.4 赛题实战 二、LCD模块2.1 赛题要求2.2 模块原理图2.3 编写代码2.4 赛题实战 三、按键模块3.1 赛题要求3.2 模块原理图3.3 编写代码3.4 赛题实战 四、串口模块4.1 赛题要求4…...

Rust学习总结之-枚举

枚举是一个很多语言都有的功能,不过不同语言中其功能各不相同但是要表达的意思是一致的,枚举就是对于一个事物可以穷举出所有可能得值。比如说人的性别就可以用枚举,男人和女人两种。下面我们来学习Rust中的枚举。 一:枚举定义 …...

Linux系统管理(十七)——配置英伟达驱动、Cuda、cudnn、Conda、Pytorch、Pycharm等Python深度学习环境

文章目录 前言安装驱动下载安装Cuda编辑环境变量安装Cudnn安装conda验证安装成功配置conda镜像退出conda环境创建python环境查看当前conda环境激活环境安装python包安装pytorch 安装pycharm安装jupyter notebook 前言 深度学习和大语言模型的部署不免会用到Linux系统&#xff…...

SLAM算法工程师的技术图谱和学习路径

SLAM(Simultaneous Localization and Mapping)算法工程师是负责开发和实现用于机器人、自动驾驶车辆等领域的SLAM算法的专业人士。下面是SLAM算法工程师需要掌握的基础理论知识: 机器人运动学和动力学:理解机器人在空间中的运动方式和控制方法,包括轮式、蜘蛛腿、飞行器等…...

【第三天】零基础学习量化基础代码分析-持续更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 记录量化基础代码总览引言基本概念量化投资 伪代码示例:量化投资模型框架总结 每日-往期回看 第一天零基础学量化基础知识点总览-持续更新 第二天零基础…...

深入了解 Python 中的 MRO(方法解析顺序)

文章目录 深入了解 Python 中的 MRO(方法解析顺序)什么是 MRO?如何计算 MRO?C3 算法的合并规则C3 算法的合并步骤示例:合并过程解析 MRO 解析失败的场景使用 mro() 方法查看 MRO示例 1:基本用法 菱形继承与…...

如何防止 Instagram 账号被盗用:安全设置与注意事项

如何防止 Instagram 账号被盗用:安全设置与注意事项 在这个数字化时代,社交媒体平台如 Instagram 已成为我们日常生活的一部分。然而,随着网络犯罪的增加,保护我们的在线账户安全变得尤为重要。以下是一些关键的安全设置和注意事…...

采样算法二:去噪扩散隐式模型(DDIM)采样算法详解教程

参考 https://arxiv.org/pdf/2010.02502 一、背景与动机 去噪扩散隐式模型(DDIM) 是对DDPM的改进,旨在加速采样过程同时保持生成质量。DDPM虽然生成效果优异,但其采样需迭代数百至数千次,效率较低。DDIM通过以下关键…...

各种类型网络安全竞赛有哪些 网络安全大赛的简称

本文是对入门学习的一些概念了解和一些常规场景记录 1.CTF(capture the flag)是夺旗赛的意思。 是网络安全技术人员之间进行攻防的比赛。 起源1996年DEFCON全球黑客大会,替代之前真实攻击的技术比拼。 (DEFCON极客大会诞生1993,…...