代码:
dest EQU 0x40000000
AREA name, CODE, READONLY
ENTRY
MOV r0, #2
LDR r1, =dest
STR r0, [r1]
stop B stop
END
此代码将值2写入内存位置0x40000000。 当我将其更改为0x20000000时,2无法写入那里。 0x3FFFFFFF也是一样。当我将内存位置设置为0x40003FFF时,将2打印到该位置,但是当我将地址更改为0x40004000时,则2无法在该位置打印。对于任何更高地址的地址也一样,例如0x50000000。因此,根据这些输出,似乎STR只能将值写入介于0x40000000和0x40003FFF之间的有限内存中。
有人知道为什么会这样吗?还是我的代码有问题?我正在使用Keil uVision5,恩智浦LPC2140。
答案 0 :(得分:2)
我找不到“ LPC2140”的数据表,但是我找到了看似一个设备系列的数据表,而您所拥有的特定设备可能是LPC2142 / 2144。 datasheet,第6.4节显示SRAM已映射到0x40000000-0x40003FFF
(假设您说的是16 kB SRAM变体)。那是您应将其视为通用RAM的唯一地址空间。根据数据表,超出该范围的所有内容看起来都很可怕,除非您完全知道自己在做什么,否则应避免使用它。
您还应该认识的一件事是unaligned access。 STR
一次写入一个完整的字(4个字节),因此地址应在字边界上对齐。 0x40003FFF
未与4字节边界对齐;您应该改为写0x40003FFC
。如果您只想向0x40003FFF
写一个字节,则应该改用STRB
。