这是我在 PIC16F1947 数据表中找到的:
读取 PORTB 寄存器会读取引脚的状态,而写入它会写入 PORT 锁存器。所有的写操作都是读-修改-写操作。因此,写入端口意味着读取端口引脚,修改此值,然后写入端口数据锁存器 (LATB)。
我是一名固件开发人员,我的背景是计算机科学。我仍然很难理解硬件级别的电子和逻辑。我只有基础知识。
所以,我想了解当数据被写入硬件级别时会发生什么。
谢谢你。
这是我在 PIC16F1947 数据表中找到的:
读取 PORTB 寄存器会读取引脚的状态,而写入它会写入 PORT 锁存器。所有的写操作都是读-修改-写操作。因此,写入端口意味着读取端口引脚,修改此值,然后写入端口数据锁存器 (LATB)。
我是一名固件开发人员,我的背景是计算机科学。我仍然很难理解硬件级别的电子和逻辑。我只有基础知识。
所以,我想了解当数据被写入硬件级别时会发生什么。
谢谢你。
锁存器是一种位的存储器。
让我们使用手册中的图片:
当您在 I/O 引脚中写入一个位时,您正在将该位从数据总线存储到数据寄存器 ( D-FlipFlop )。如果该位的 TRISx 为 0,则来自数据寄存器 Q 的数据将在 I/O 引脚中。写入 LATx 或 PORTx 是一样的。见下图红色:
另一方面,从 LATx 读取不同于从 PORTx 读取。
当您从 LATx 读取数据时,您正在读取数据寄存器 ( D-FlipFlop ) 中的内容。见下图绿色:
当您从 PORTx 读取数据时,您正在读取实际的 I/O 引脚值。见下图蓝色:
PIC 使用 read-modify-write 来写操作,这可能是个问题,所以他们使用这个影子寄存器来避免它。
为避免读取-修改-写入问题,您应该将端口作为一个整体写入,而不是设置或重置端口中的各个位。RMW 问题可能会导致未设置位,或另一个输出变高,尤其是在输出引脚提供或吸收大量电流的情况下。
通常使用“影子寄存器”。设置或重置其中的位,并将其输出到端口,以避免 RMW 问题。
通过使用单独的锁存器可以避免 18F PIC 的问题,其中的各个位可以不受惩罚地设置和重置。