我想为LPC1768编写程序集但是在链接时它没有运行。 这是我的程序,我希望它打开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
答案 0 :(得分:1)
首先,反汇编是什么样的?它是否正确生成了向量表32位堆栈地址,然后是32位起始地址orred 1(lsbit set)?那当然假设你将它加载到flash中而不是从ram运行,如果从ram那么你想要做一些不太可能的事情或知道入口点的偏移。
您正在将所有port2引脚设置为输出。然后设置它们。
您的LED是否配置为高电平将其打开或高电平将其关闭? (应该是gpio,led,电阻,然后是vcc或接地,如果是高电平则将它接通它应该接地。如果是vcc,那么你想将端口引脚设置为低电平)。 (无论组件是电阻器的顺序,然后引导或引导电阻器)。
我的猜测是你没读过:
有效用户代码的标准
保留的Cortex-M3异常向量位置7(向量表中的偏移量0x 001C)应包含表条目0到6的校验和的2的补码。这将导致前8个表条目的校验和为0.引导加载程序代码校验闪存扇区0中的前8个位置。如果结果为0,则执行控制转移到用户代码。 ...
在数据表中?
嗯,或者你确实想从ram运行这个?你需要将你的ro地址设置为0x10000xxx(见下文),你不会想要矢量表。数据表还说:
ISP命令处理程序使用的RAM
ISP命令使用从0x1000 0118到0x1000 01FF的片上RAM。用户可以使用此区域,但重置后内容可能会丢失。闪存编程命令使用片上RAM的前32个字节。堆栈位于RAM顶部 - 32.最大堆栈使用量为256字节,并且向下增长。
因此,您会看到人们在使用它时通常会为引导加载程序保留0x200字节。所以从0x10000200开始,而不是0x10000000。出于某种原因,我更慷慨,我使用0x10000800。有些人一直保留0x200字节,即使他们不使用ISP工具。
我假设你的ro地址和rw地址和向量表你想从flash运行。你需要在那里得到校验和,我建议你反汇编,看看向量表有一个奇数地址可以开始。你可能想把一些其他的向量放在deadloop中以填补校验和的空间。