如何仅使用STS LDS (或等效)指令对低IO块(0x00 - 0x63 )中的IO寄存器进行寻址(读/写)?
谢谢
克里斯
发布于 2020-11-10 19:15:46
主要问题是“STS/LDS在内存中映射的那些寄存器在哪里可见”。答案就在数据表中:

如果要将IN/OUT更改为LDS/STS,则必须向IN/OUT中使用的地址添加0x20偏移量
7.5 I/O内存
第275页的“”一节中显示了ATmega328P的I/O空间定义。所有ATmega328P I/O和外围设备都放置在I/O空间中。所有I/O位置可由LD/LDS/LDD和ST/STS/STD指令访问,在32个通用工作寄存器和I/O空间之间传输数据。地址范围0x00 - 0x1F内的I/O寄存器可直接使用SBI和CBI指令进行位访问。在这些寄存器中,可以使用SBIS和SBIC指令检查单个位的值。有关更多详细信息,请参阅指令集部分。使用I/O特定命令IN和OUT时,必须使用I/O地址0x00 - 0x3F。使用LD和ST指令将I/O寄存器编址为数据空间时,这些地址必须加上0x20。ATmega328P是一个复杂的微控制器,其外围设备数量超过了操作码中为in和OUT指令保留的64个位置所能支持的数量。对于静态随机存储器中0x60 - 0xFF的扩展I/O空间,只有ST/STS/STD和LD/LDS/LDD指令可以与未来器件保持used.For兼容性,如果访问,保留位应写入零。保留的I/O存储器地址永远不应为written.Some状态标志可通过向其写入逻辑1来清除。请注意,与大多数其它AVR®不同,CBI和SBI指令仅在指定的位上操作,因此可以在包含此类状态标志的寄存器上使用。CBI和SBI指令适用于寄存器0x00到0x1F only.The I/O和外设控制寄存器,稍后将对其进行说明。
https://stackoverflow.com/questions/64766710
复制相似问题