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

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.xdnf.cn/news/10940.html

相关文章:

  • MySQL - Windows 中 MySQL 禁用开机自启,并在需要时手动启动
  • Vue3 中使用 i18n
  • 【MATLAB去噪算法】基于CEEMD联合小波阈值去噪算法(第三期)
  • 离散数学_数理逻辑(二):命题逻辑的推理
  • CET6 仔细阅读 24年6月第三套-C2 可变性这一块
  • 代码随想录算法训练营第60期第五十六天打卡
  • 系统思考:短期利益与长期系统影响
  • 线程池RejectedExecutionException异常
  • ssh登录wsl2
  • C++ 17中的通用类型any
  • 从“Bucharest”谈起:词语翻译的音译与意译之路
  • Qt 事件传递的完整流程
  • 运维三剑客——awk
  • My Retro App项目开发指南
  • 对 `llamafactory-cli api -h` 输出的详细解读
  • MySQL备份与恢复实战指南
  • 社群营销的一些门道
  • 项目任务,修改svip用户的存储空间。
  • 网络攻防技术八:身份认证与口令攻击
  • 力扣刷题Day 69:搜索二维矩阵(74)
  • Python趣学篇:Pygame重现经典打砖块游戏
  • Axure形状类组件图标库(共8套)
  • 苹果ios系统ipa文件签名的圈外签名是什么稳定性怎么样
  • 力扣4.寻找两个正序数组的中位数
  • isp调试 blend模式指什么
  • VS2022下C++ Boost库安装与使用使用
  • 使用 Python + ExecJS 获取网易云音乐歌曲歌词
  • 01电气设计-380V强电部分设计
  • 前缀和基础训练
  • Docker 镜像(或 Docker 容器)中查找文件命令