首页 > 解决方案 > AVR 是否可以间接寻址 IO 端口

问题描述

我有个问题:

是否可以间接寻址 AVR 控制器的 I/O 端口,例如:

out r16, r19

谢谢你的帮助

标签: assemblyavr

解决方案


根据官方说明手册,不幸的是说明in并不out支持间接寻址。但是您可以改用加载 ( ld,ldsldd) 和存储 ( st,stsstd) 指令。它们通常用于更复杂(具有更多外围设备)AVR 微控制器上的 I/O 操作,但应该在更少的 I/O 地址上工作0x60

引用说明书:

注意: 一些复杂的 AVR 微控制器的外围单元比操作码中为 I/O 直接寻址保留的 64 个位置所能支持的要多。从地址 64 到 255 的扩展 I/O 内存只能通过数据寻址而不是 I/O 寻址来访问。

这些简单的间接寻址示例(GNU Assembler)应该可以工作:

/* Load DDRA I/O address into RAMPX (r26, r27) */
clr r27;
ldi r26, 0x21;
/* Store value 0xFF into specific (DDRA) register */
ldi r16, 0xFF;
st X, r16;

上述示例使用来自 ATMEGA2560 的 DDRA I/O 端口。有关正确的 I/O 地址,请查阅特定器件的数据表。


推荐阅读