做网站优化公司排行/百度云网盘资源

做网站优化公司排行,百度云网盘资源,鞋子 东莞网站建设,做网站练手一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…

一、前言

        学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教程中,也没让大家有太多的了解。既然学习STM32有一段时间了,那我们能不能从现象推导到本质,去了解一下STM32 引脚控制的本质原理。那么本次教程,就来为大家讲解一下STM32引脚驱动的三个关键寄存器BSRR、BRR、ODR,相信看了本次教程以后,你对STM32会有更深层次的理解。如果你准备好了,那就让我们开始吧!

二、谁适合本次教程

        因为已经涉及到寄存器的操作与讲解了,所以请学习本次教程的小伙伴需要具备一定的STM32基础以及对十六进制转二进制比较熟悉。

三、资料的准备

        本次使用STM32F103C8T6进行演示,所以请大家自己准备一块STM32F103的开发板。本次教程中,我们需要去翻阅STM32F103的手册,所以大家准备一份STM32F103的数据手册,相信学习过一阵子STM32的小伙伴应该都有这个手册吧,这里我就不放了。

四、BSRR、BRR、ODR寄存器讲解

        在我们日常的代码或者一些模块的代码中,可能经常会看到下面这样的写法:

GPIOC->BSRR=0x00002000;

又或者是这种写法:

GPIOC->ODR=0x00002000;

我们可以很明显的看到,这些写法都是在控制GPIO的电平,那么这些写法之间都有什么区别呢?哪种写法更好呢?

1.BSRR

        这里我们首先来看BSRR,这里我们打开STM32F10的中文手册,找到BSRR寄存器处:

下面我们就来解释一下这个寄存器的作用,很明显的看到,这里寄存器的位下面只有一个W,表示这个寄存器只是可写的:

这里大家只需要记住这个寄存器只能写就可以了,后面会为大家讲解为什么。

我们再往下看,下面的寄存器详细描述中,将寄存器分为了两个部分来讲,分别是0-15位,以及16-31位,总的来说就是将这个寄存器分为了高十六位和低十六位:

这里我们先来看位16-31,这些位都被叫做BR位,这里的R即Reset,手册中的描述是这些位是用于清除端口0-15:

简单来说,16-31位就是用于将GPIO口拉低的。假如这里我想控制GPIOC,那么我就可以使用BSRR中的16-31位将GPIPC的0-16引脚全部拉低。

在下面也提到了,这些位只能写入并且只能一十六位的形式写入:

我们继续往下看,如果BSRR的16-31位写0不会对ODR产生影响,如果写1,则ODR的对应位就会为0,从而引脚电平被拉低。至于这里为什么我们写ODR的位就可以直接控制引脚我们后面讲解ODR寄存器的时候会讲。

然后我们来看BSRR的0-15位,这些位从手册中可以看到,是用于置位GPIO口的某一位的,0-15位被叫做BS位,这里的S即Set:

同样的,假如我还是控制GPIOC,那我就可以通过BSRR下的0-15位将GPIOC的0-15引脚都置高。同样的,下面也提到了,如果给0-15位的某一位置0,则ODR对应的位不产生影响。如果给0-15位置1那么对应的ODR位就会置1从而对应的引脚置1:

这里大家就可能有疑惑了,如果我将一个引脚对应BS位和BR位都置位,会怎么样?其实在手册中已经提到了,如果这样做的话,只有BR位会起作用:

看了上面的内容,相信大家对BSRR寄存器有一定的了解了,简单来说,它就是一个控制ODR寄存器对应位高低电平从而控制引脚的一个寄存器,在官方的库函数中,也使用到了BSRR寄存器来控制引脚电平:

这里大家可能又有疑问了,为什么我这里要通过BSRR来控制ODR从而来控制引脚的电平,我不能直接控制ODR吗?这个问题,同样也留到我们讲解ODR的时候再做讲解。

2.BRR

        BRR的功能和BSRR非常接近,以至于现在一些高端的芯片已经阉割了BRR寄存器,不过我们现在还是可以来看看,我们在手册中找到BRR对应的描述:

我们可以看到BRR寄存器的高十六位是没有作用的:

并且低十六位和BSRR一样,只能写:

这里我们直接看寄存器描述,这里提到了,0-15位主要用于清除端口的位,也就是为指定端口拉低。这里的用法其实和BSRR的高十六位一样,都是通过给对应的位置1从而给ORD对应的位置0从而控制引脚电平。如果你理解BSRR的话,理解BRR也不是什么难题,这里就不多说了:

3.ODR

        现在我们来讲解ODR,前面已经为大家留了许多问题在ODR这里了,现在我们一一来解决。

我们同样先在手册中找到ODR所在的位置:

这里我们可以看到,ODR的高十六位同样作为保留位。然后就是低十六位,这里的低十六位我们简单来说就是,对应了GPIO的十六个引脚。我们给ODR对应的位置高或者置低,那么对应的GPIO引脚就会被置对应的电平。假如我么就将ODR的第12位置1,那么对应的GPIO12就会被置1。在手册中也提到了,我们的BSRR寄存器可以对每个ODR位进行独立的设置和清除:

这就是为什么我们要通过BSRR来操作ODR从而来操作GPIO。因为BSRR可以对ODR的每一位进行操作并且不影响别的位。如果我们直接操作ODR的话,要实现不影响别的位的效果就需要将ODR的值先读出来然后再写入对应的值最后整体写入ODR,这也是我们常用的读-改-写的操作流程。那么大家可能又有疑问了,为什么我们的BSRR可以直接操作ODR。

这里我们在手册中,找到“8.1.8输出配置”,这里我们主要是需要下面的图:

我们将下面的图单独拿出来:

这里我们可以看到,我们的写入可以写到“位设置/清除寄存器”,这个“位设置/清除寄存器”是什么?这不就是BSRR吗?:

然后,我们写入BSRR以后,BSRR直接就写入了一个名为“输出数据寄存器”的地方,这个输出数据寄存器,不就是我们的ODR吗?:

相当于,BSRR一旦收到数据,就会发送给ODR,从而对ODR的位进行操作。BSRR发送完数据以后,就直接将内部存储的值扔掉了,本身就不保存值,所以读取BSRR本很就没有意义。这样也印证了为什么之前我们说BSRR不能读取。

最后,我们可以看到,我们的ODR上有一条单独的线,是用于读写ODR的,这些表示ODR可以被直接读写:

其实,总的来说,为什么我们不直接操作ODR呢?因为我们操作BSRR可以直接操作ODR的值从而不影响别的引脚。为什么我们操作BSRR可以直接操作ODR呢?因为它们在物理总线层面被链接在了一起,并且操作BSRR可以直接操作ODR的位。为什么BSRR不能读取呢?因为BSRR有了值以后直接就拿给ODR了,本身不存储值,没有读取的必要。

假如我们执行下面两段代码,在实际效果上应该是一样的:

#include "stm32f10x.h"                  
int main(void)
{RCC->APB2ENR=0x00000010;GPIOC->CRH=0x00300000;GPIOC->BSRR=0x00002000;while(1){}
}
#include "stm32f10x.h"                  
int main(void)
{RCC->APB2ENR=0x00000010;GPIOC->CRH=0x00300000;GPIOC->ODR=0x00002000;while(1){}
}

但是,最后的最后,仍然建议大家在操作引脚时不直接操作ODR,虽然我们可以通过读-改-写的方法保留原本的值并且写入新值,但是,这样会增加我们的代码量并且增加出错的概率。

五、结语

        以上就是我对GPIO相关的寄存器的一些见解,如果有讲得不对的地方,还请大家指正,最后感谢大家的观看!

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

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

相关文章

SP导入智能材质球

智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新

网络原理----TCP/IP(3)

核心机制七----延时应答 默认情况下,接收方都是在收到数据报的第一时间,就返回ack,但是可以通过延时返回ack的方式来提高效率,理论上不是100%提高效率,但还是有一定帮助的。 因为如果接收数据的主机⽴刻返回ACK应答,…

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…

ubuntu中ollama设置记录

自己同一台电脑主机安装3080和3090显卡,测试发现ollama只默认跑在3090上;故查看一下设置,成功也把3080也运行起来了。 原因如下: 开始设置记录: Environment Variables: OLLAMA_DEBUG 作用:显示额外的调试…

【Python · PyTorch】循环神经网络 RNN(基础应用)

【Python PyTorch】循环神经网络 RNN(简单应用) 1. 简介2. 模拟客流预测(数据集转化Tensor)3.1 数据集介绍3.2 训练过程 3. 模拟股票预测(DataLoader加载数据集)3.1 IBM 数据集3.1.2 数据集介绍3.1.3 训练…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

Spring Boot(七):Swagger 接口文档

1. Swagger 简介 1.1 Swagger 是什么? Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…

cursor 弹出在签出前,请清理仓库工作树 窗口

问题出现的背景:是因为我有两台电脑开发,提交后,另一个电脑的代码是旧的,这个时候我想拉取最新的代码,就会出现如下弹窗,因为这个代码暂存区有记录或者工作区有代码的修改,所以有冲突&#xff0…

在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南

随着人工智能技术的飞速发展,本地部署大型语言模型(LLM)已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私,还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2(24GB 内存)上部署 DeepS…

《UE5_C++多人TPS完整教程》学习笔记33 ——《P34 关卡与大厅之间的过渡(Transition Level And Lobby)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P34 关卡与大厅之间的过渡(Transition Level And Lobby)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer,…

Vscode 便用快捷键设置教程

文章目录 简介:1. go to define (跳转到函数定义的位置)2. go to declaration (跳转到函数声明的位置)3. move line (上下移动本行代码)3.1上下复制本行代码 4. 前进和后退(就是前进到光标上一次停留的位置,和后退到那…

【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】

一、机器学习模型:DeepSeek的降维打击 1.1 监督学习与无监督学习的"左右互搏" 监督学习就像学霸刷题——给标注数据(参考答案)训练模型。DeepSeek在信贷风控场景中,用逻辑回归模型分析百万级用户数据,通过特征工程挖掘出"凌晨3点频繁申请贷款"这类魔…

Vue核心知识:Vue动态权限到按钮完整方案

为了进一步实现上面提到的动态路由功能,并且加入对每个路由的权限控制(即增、删、改、查按钮的权限控制),我们需要对数据库、后端接口、前端的设计做一些改进和扩展。下面我将详细描述如何在现有方案的基础上加入对路由的增、删、…

swift 开发效率提升工具

安装github copliot for xcode github/CopilotForXcode brew install --cask github-copilot-for-xcode安装swiftformat for xcode brew install swiftformatXcode Swift File代码格式化-SwiftFormat

Trae智能协作AI编程工具IDE:如何在MacBook Pro下载、安装和配置使用Trae?

Trae智能协作AI编程工具IDE:如何在MacBook Pro下载、安装和配置使用Trae? 一、为什么选择Trae智能协作IDE? 在AI编程新时代,Trae通过以下突破性功能重新定义开发体验: 双向智能增强:AI不仅提供代码补全&a…

C语言:51单片机 基础知识

一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…

【计算机网络入门】初学计算机网络(八)

目录 1. S-W协议的信道利用率 2. GBN、SR协议的信道利用率 3.术语补充 3.1 滑动窗口协议 3.2 ARQ协议、连续ARQ协议 4. 信道划分介质访问控制 4.1 时分复用(TDM) 4.2 统计时分复用(STDM) 4.3 频分复用(FDM&a…

HarmonyOS学习第7天: 文本组件点亮界面的文字魔法棒

一、引言 在 HarmonyOS 那丰富多彩的系统界面中,从简洁直观的应用图标,到交互流畅的操作菜单,再到生动形象的图文展示,每一处细节都经过精心雕琢,为用户带来了独特而美妙的视觉与交互体验。而在这琳琅满目的界面元素中…

从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略

前言 最近,我有幸在工作中接触到了DeepSeek R1 671B模型,这是目前中文开源领域参数量最大的高质量模型之一。DeepSeek团队在2024年推出的这款模型,以其惊人的6710亿参数量和出色的推理性能,引起了业界广泛关注。 作为一名AI基础…

Unity中动态切换光照贴图LightProbe的方法

关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…