如何在未知1字节寄存器当前值的情况下单独设置或清除某一位?
寄存器位修改无读操作方案说明
- 无硬件特殊支持时无法实现:常规8位寄存器的写入操作是覆盖整个字节的存储空间,若不知道其余7位的当前值,直接写入必然会篡改其他位的原有数据,无法做到仅修改目标位、其余位保持不变,必须走「读-改-写」的流程。
- 硬件支持专用位操作寄存器时可以实现:不少硬件设计会为功能寄存器配套独立的位操作访问入口,无需读取原寄存器值就能完成位修改:
- 位置位寄存器:向该寄存器的对应位写1,就会自动将原寄存器的对应位置1,写0不产生任何影响
- 位清零寄存器:向该寄存器的对应位写1,就会自动将原寄存器的对应位清0,写0不产生任何影响
- 位翻转寄存器:向该寄存器的对应位写1,就会自动将原寄存器的对应位值翻转,写0不产生任何影响
这类设计在MCU外设中非常常见,比如STM32的GPIO端口就配置了BSRR位置位/复位寄存器,无需读取原输出寄存器的值,直接写BSRR就能单独修改某一个IO的输出电平,不会影响同端口其他IO的状态。
如果你的硬件平台有这类专用寄存器,代码可以简化为如下形式,完全省去读寄存器的步骤:
// 置位第6位,假设位置位寄存器地址为0x01 if (wanting_to_set) { write_reg(0x01, 1 << 6); } // 清零第6位,假设位清零寄存器地址为0x02 if (wanting_to_reset) { write_reg(0x02, 1 << 6); }
内容的提问来源于stack exchange,提问作者JC123
相关产品推荐
相关产品推荐

