GPIO 位操作为什么优先使用原子置位/复位寄存器,而不是读改写?
普通输出寄存器读改写包含读、修改、写三个步骤,若中断或另一执行单元同时改其他位,后写者会覆盖前者。芯片提供的原子置位/清零寄存器可在一次总线写中只影响目标位。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
普通输出寄存器读改写包含读、修改、写三个步骤,若中断或另一执行单元同时改其他位,后写者会覆盖前者。芯片提供的原子置位/清零寄存器可在一次总线写中只影响目标位。
推挽能主动拉高和拉低,边沿快但不适合多器件直接线与;开漏只主动拉低,高电平由上拉产生,可实现线与和电平转换;输入高阻几乎不驱动线路,但悬空时容易受噪声影响。
SDA/SCL 为开漏线与,主机发送高电平时会释放 SDA 并同时采样;若期望高却读到低,说明另一主机发送了占优的低电平,当前主机失去仲裁并停止驱动。时钟同步同样由低电平占优协调快慢主机。
典型寄存器读取先以写方向发送寄存器地址,再不释放总线地发送重复起始并切到读方向。这样保持一次原子事务,避免 STOP 后器件状态变化或其他主机插入。最后一个接收字节通常由主机 NACK 并 STOP。
从机可在允许的阶段保持 SCL 为低,推迟主机下一位时钟,因此主机设定频率并不等于实际传输始终按该速率进行。控制器必须支持拉伸,并设置有上限的超时与恢复策略。
总线首字节由 7 位从机地址和最低位读写方向组成;不同控制器 API 有的接收纯 7 位地址,有的要求已放到首字节位置。必须按 API 契约传参,不能把数据手册的读写地址和 7 位地址混用。