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

BSRR对比BRR对比ODR

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

寄存器功能原子操作特点
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.lryc.cn/news/2398308.html

相关文章:

  • ubuntu22.04安装taskfile
  • 记录被mybatis一级缓存坑的问题
  • 遥感影像建筑物变化检测
  • 【数据库】《DBA实战手记》- 读书笔记
  • 多模态大语言模型arxiv论文略读(103)
  • 汇编语言基础: 搭建实验环境
  • SIFT 算法原理详解
  • 基于springboot的益智游戏系统的设计与实现
  • 短剧系统开发文案:打造沉浸式互动娱乐新体验
  • 第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列
  • 多模态大语言模型arxiv论文略读(104)
  • 【C++高级主题】多重继承下的类作用域
  • 基于Android的一周穿搭APP的设计与实现 _springboot+vue
  • 机器学习——使用多个决策树
  • C# 中的对话框与导航:构建流畅用户交互的完整指南
  • DeepSeek - 尝试一下GitHub Models中的DeepSeek
  • 【判断酒酒花数】2022-3-31
  • 对称加密-非对称加密
  • 【OCCT+ImGUI系列】011-Poly-Poly_Triangle三角形面片
  • 【机器学习基础】机器学习入门核心算法:Mini-Batch K-Means算法
  • 机器学习实战36-基于遗传算法的水泵调度优化项目研究与代码实现
  • 计算机视觉与深度学习 | 基于Matlab的门禁指纹识别与人脸识别双系统实现
  • TypeScript 定义同步方法
  • debian12.9或ubuntu,vagrant离线安装插件vagrant-libvirt,20250601
  • 【仿muduo库实现并发服务器】使用正则表达式提取HTTP元素
  • 核心机制:流量控制
  • Java中并发修改异常如何处理
  • 极智项目 | 基于PyQT实现的YOLOv12行人目标检测软件设计
  • JavaScript 对象展开语法
  • 简单transformer运用