码:
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,NXP LPC2140。
我找不到“LPC2140”的数据表,但我找到了一个似乎是一系列设备的数据表,而您拥有的具体数据,可能是LPC2142 / 2144。 datasheet,第6.4节,显示SRAM被映射到0x40000000-0x40003FFF
(假设您所说的有16 kB SRAM变体)。这是你应该作为通用RAM处理的唯一地址空间。根据数据表,超出该范围的所有内容看起来都很可怕,除非您完全了解自己在做什么,否则应该避免使用它。
你应该认识到的一件事是unaligned access。 STR
一次写入一个完整的字(4个字节),因此地址应该在字边界上对齐。 0x40003FFF
未与4字节边界对齐;你应该写信给0x40003FFC
。如果你只是想向0x40003FFF
写一个字节,你应该使用STRB
代替。