✅ 三种操作方式的本质区别

寄存器功能原子操作特点
BSRR同时支持置位(1)复位(0)✔️ 是单指令完成任意位操作,无竞争风险
ODR直接读写输出状态❌ 否需"读-改-写",多线程/中断中需关中断保护
BRR只能复位(0)✔️ 是仅清零功能,无置位能力

🛠 具体操作步骤详解

1. 使用 BSRR (推荐)
// 设置PA5输出高电平
GPIOA->BSRR = (1 << 5);      // 低16位置位// 设置PA5输出低电平
GPIOA->BSRR = (1 << (5 + 16)); // 高16位复位

优势

  • 单指令原子操作(无需关中断)

  • 不影响其他引脚状态

  • 同时支持置位/复位

2. 使用 ODR (需注意风险)
// 设置PA5输出高电平
GPIOA->ODR |= (1 << 5);      // 读-改-写操作// 设置PA5输出低电平
GPIOA->ODR &= ~(1 << 5);     // 读-改-写操作

风险

  • 非原子操作(若中断中修改同一GPIO组会冲突)

  • 需额外保护:

    __disable_irq();          // 关中断
    GPIOA->ODR |= (1 << 5);   // 修改
    __enable_irq();           // 开中断
3. 使用 BRR (仅支持清零)
// 只能设置低电平!
GPIOA->BRR = (1 << 5);      // 将PA5复位为0

局限

  • 无置位能力(不能设高电平)

  • 需配合BSRR或ODR使用


⚡ 关键对比总结

场景推荐方式原因
单次控制指定引脚BSRR原子操作,代码简洁
同时设置/清除多个引脚BSRR单指令完成多引脚操作(e.g. GPIOA->BSRR = 0x11000011;
需读当前状态再修改ODR+关中断保护BSRR无法读取状态
仅需快速清零引脚BRR语义明确(但BSRR高16位可替代)
高可靠性系统BSRR避免关中断延迟,确保实时性

📝 编程建议

  1. 首选BSRR

    // 标准安全写法
    GPIOx->BSRR = (1 << pin);          // 设高
    GPIOx->BSRR = (1 << (pin + 16));   // 设低
  2. BRR的替代方案

    // 以下两句完全等效:
    GPIOx->BRR  = (1 << 5);    // 专用清零寄存器
    GPIOx->BSRR = (1 << (5 + 16)); // BSRR高16位清零
  3. ODR使用准则

    // 必须添加保护!
    uint32_t temp = GPIOx->ODR; 
    temp |= (1 << 5);          // 修改值
    GPIOx->ODR = temp;         // 整体写入

💡 重要原理

  • BSRR设计优势
    通过分离置位位(低16位)和复位位(高16位),实现:

    • 0: 不改变

    • 1: 触发动作(置位/复位)
      无论其他位值如何,均不影响未操作引脚

  • ODR风险根源
    内核总线需先读取ODR当前值 → 修改指定bit → 写回,若中途被中断修改同一GPIO组,会导致覆盖错误。

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

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

相关文章

职坐标精选嵌入式AI物联网开源项目

随着嵌入式、AI与物联网技术的深度融合&#xff0c;开源生态已成为开发者构建智能硬件解决方案的核心驱动力。本文将从嵌入式实时操作系统、多模态AI数据集及物联网接入平台三大维度切入&#xff0c;系统性梳理技术选型要点与实践路径。在嵌入式领域&#xff0c;重点解析低功耗…

Ubuntu系统 | 本地部署ollama+deepseek

1、Ollama介绍 Ollama是由Llama开发团队推出的开源项目,旨在为用户提供高效、灵活的本地化大型语言模型(LLM)运行环境。作为Llama系列模型的重要配套工具,Ollama解决了传统云服务对计算资源和网络连接的依赖问题,让用户能够在个人电脑或私有服务器上部署和运行如Llama 3等…

【数据库】关系数据库标准语言-SQL(金仓)下

4、数据查询 语法&#xff1a; SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <…

基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破

【导读】 应对气候变化对非洲象的生存威胁&#xff0c;本研究创新采用无人机航拍结合AI姿态分析技术&#xff0c;突破传统观测局限。团队在肯尼亚桑布鲁保护区对比测试DeepLabCut与YOLO-NAS-Pose两种模型&#xff0c;首次将后者引入野生动物研究。通过检测象群头部、脊柱等关键…

8.RV1126-OPENCV 视频中添加LOGO

一.视频中添加 LOGO 图像大体流程 首先初始化VI,VENC模块并使能&#xff0c;然后创建两个线程&#xff1a;1.把LOGO灰度化&#xff0c;然后获取VI原始数据&#xff0c;其次把VI数据Mat化并创建一个感兴趣区域&#xff0c;最后把LOGO放感兴趣区域里并把数据发送给VENC。2.专门获…

AI+3D 视觉重塑塑料袋拆垛新范式:迁移科技解锁工业自动化新高度

在工业自动化浪潮席卷全球的当下&#xff0c;仓储物流环节的效率与精准度成为企业降本增效的关键战场。其中&#xff0c;塑料袋拆垛作为高频、高重复性的作业场景&#xff0c;传统人工或机械臂操作面临着诸多挑战。迁移科技&#xff0c;作为行业领先的 3D 工业相机和 3D 视觉系…

MATLAB实战:视觉伺服控制实现方案

以下是一个基于MATLAB的视觉伺服控制项目实现方案&#xff0c;结合实时图像处理、目标跟踪和控制系统设计。我们将使用模拟环境进行演示&#xff0c;但代码结构可直接应用于真实硬件。 系统架构 图像采集 → 目标检测 → 误差计算 → PID控制器 → 执行器控制 完整代码实现 …

RequestRateLimiterGatewayFilterFactory

一、功能说明 RequestRateLimiterGatewayFilterFactory 是 Spring Cloud Gateway 的流量控制组件&#xff0c;用于实现 API 请求速率限制&#xff0c;核心功能包括&#xff1a; 限制单位时间内的请求数量&#xff08;如每秒10次&#xff09;防止服务被突发流量击垮&#xff0…

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好&#xff0c;仓颉语言商城应用的开发进程已经过半&#xff0c;不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面&#xff1a; 看到这个页面&#xff0c;我们首先要对它简单的分析一下。这个页面一共分为三部分&#xff0c;分别是…

AXURE安装+汉化-Windows

安装网站&#xff1a;https://www.axure.com/release-history/rp9 Axure中文汉化包下载地址 链接:https://pan.baidu.com/s/1U62Azk8lkRPBqWAcrJMFew?pwd5418 提取码:5418 下载完成之后&#xff0c;crtlc lang文件夹 到下载的Axure路径下 双击点进这个目录里面。ctrlv把lan…

【Oracle】视图

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 视图基础概述1.1 视图的概念与特点1.2 视图的工作原理1.3 视图的分类 2. 简单视图2.1 创建简单视图2.1.1 基本简单视图2.1.2 带计算列的简单视图 2.2 简单视图的DML操作2.2.1 通过视图进行INSERT操作2.2.2 通…

Lua和JS的垃圾回收机制

Lua 和 JavaScript 都采用了 自动垃圾回收机制&#xff08;GC&#xff09; 来管理内存&#xff0c;开发者无需手动释放内存&#xff0c;但它们的 实现机制和行为策略不同。下面我们从原理、策略、优缺点等方面来详细对比&#xff1a; &#x1f536; 1. 基本原理对比 特性LuaJa…

Kafka 的优势是什么?

Kafka 作为分布式流处理平台的核心组件&#xff0c;其设计哲学围绕高吞吐、低延迟、高可扩展性展开&#xff0c;在实时数据管道和大数据生态中具有不可替代的地位。 一、超高吞吐量与低延迟 1. 磁盘顺序 I/O 优化 突破磁盘瓶颈&#xff1a;Kafka 将消息持久化到磁盘&#xff…

车载诊断架构 --- DTC消抖参数(Trip Counter DTCConfirmLimit )

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

【C++】类的析构函数

类的析构函数 1. 作用&#xff1a;1.1 当对象的地址空间释放的时候&#xff0c;会自动调用析构函数(对象可以主动调用析构函数)1.2 实际应用&#xff1a;往往用来做收尾工作 2. 语法规则&#xff1a;示例代码&#xff1a;析构函数使用 1. 作用&#xff1a; 1.1 当对象的地址空…

重拾Scrapy框架

基于Scrapy框架实现 舔狗语录百度翻译 输出结果到txt文档 爬虫脚本 from typing import Iterable, Any, AsyncIteratorimport scrapy import json from post.items import PostItemclass BaidufanyiSpider(scrapy.Spider):name "baidufanyi"allowed_domains [&quo…

【实例】事业单位学习平台自动化操作

目录 一、创作背景: 二、实现逻辑: 三、代码分析【Deepseek分析】: 1) 主要功能 2)核心组件 2.1 GUI界面 (AutomationApp类) 2.2 浏览器自动化 2.3 平台特定处理 3) 关键技术 4)代码亮点 5)总结 四、运行截图: 五、程序代码: 特别声明:***本代码仅限编程学…

CSS篇-1

1. CSS 有哪些基本选择器?它们的权重是如何表示的? 这是一个关于 CSS 基础且极其重要的问题,因为它直接关系到我们如何精准地控制页面元素的样式,以及在样式冲突时浏览器如何决定哪个样式生效。理解 CSS 选择器及其权重(或称为“优先级”或“特殊性”),是编写高效、可维…

封装一个Qt调用动态库的类

封装一个Qt调用动态库的类 由于我的操作系统Ubuntu系统,我就以Linux下的动态库.so为例了,其实windows上的dll库调用方式是一样的,如果你的Qt项目是windows的,这篇文章代码可以直接使用。 一般情况下我们对外输出都是以动态库的形式封装的,这样我们更新版本的时候就很方便…

阴盘奇门 api数据接口

阴盘奇门&#xff0c;又称"道家阴盘遁甲"或"法术奇门"&#xff0c;与阳盘奇门(奇门排盘)并称"奇门双雄"。由王凤麟教授整合道家三式&#xff08;奇门、六壬、太乙&#xff09;精髓创立&#xff0c;独创行为风水与立体全息预测技术&#xff0c;广…