NXP LPC1768 中的 ARM 组件

ARM assembly in NXP LPC1768

我想为 LPC1768 编写程序集,但 link 我不想 运行。 这是我的程序,我想让它点亮LED。

STACK_TOP   EQU     0x10008000  
AREA | Header Code |,CODE
DCD STACK_TOP
DCD START
ENTRY

START

MOV R0,#0XFF
LDR R1,=0x2009C040
STRB R0,[R1]

MOV R0,#0XFF
LDR R1,=0x2009C054
STRB R0,[R1]

deadloop
B deadloop

END

我使用这些命令:

armasm --cpu cortex-m3 -o lamp.o lamp.s 
armlink --rw_base 0x10000000 --ro_base 0x0 --map -o lamp.elf lamp.o 
fromelf --bin --output lamp.bin lamp.elf 

那么首先,反汇编是什么样的?它是否正确生成向量 table 32 位堆栈地址,然后 32 位起始地址与 1(lsbit 设置)或 orred?这当然假设你正在将它加载到闪存中而不是从 ram 运行ning,如果从 ram 那么你最有可能想做一些不同的事情或者知道入口点的偏移量。

您正在将所有端口 2 引脚设置为输出。然后将它们设置为高。

您的 LED 是否配置为高电平点亮或高电平熄灭? (应该是 gpio、led、电阻器,然后是 vcc 或地,为了将它打开,它应该是地。如果是 vcc,那么你想将端口引脚设置为低)。 (不管组件是电阻然后是 LED 还是 LED 然后是电阻)。

我猜你没读过:

有效用户代码的标准

保留的 Cortex-M3 异常向量位置 7(向量中的偏移量 0x 001C table)应该包含 table 条目 0 到 6 的校验和的 2 的补码。这导致前 8 table 个条目的校验和为 0。引导加载程序代码校验闪存扇区 0 中的前 8 个位置。如果结果为 0,则执行控制权将转移到用户代码。 ...

在数据表中?

嗯,或者你确实想从 ram 中 运行 这个?您需要将 ro 地址设置为 0x10000xxx(见下文),并且您不需要向量 table.

数据表还说:

ISP 命令处理程序使用的 RAM

ISP 命令使用从 0x1000 0118 到 0x1000 01FF 的片上 RAM。用户可以使用该区域,但重置后内容可能会丢失。闪存编程命令使用片上 RAM 的前 32 个字节。堆栈位于 RAM top - 32。最大堆栈使用量为 256 字节,并且向下增长。

所以你会看到人们通常在使用时通常为引导加载程序保留 0x200 字节。所以从 0x10000200 而不是 0x10000000 开始。出于某种原因,我更慷慨地使用 0x10000800。有些人一直保留 0x200 字节,即使他们不使用 ISP 工具也是如此。

我从你的 ro 地址和 rw 地址和矢量 table 假设你想 运行 从闪存。您需要在其中获取校验和,我建议反汇编以查看向量 table 的起始地址是否为奇数。您可能想将其他一些向量放入死循环以将 space 填充到校验和。