我想为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
型
1条答案
按热度按时间ymzxtsji1#
首先,拆解是什么样子的?它是否正确地生成了向量表的32位堆栈地址,然后是32位起始地址或1(lsbit设置)?当然,这是假设您正在将其加载到flash中,而不是从ram中运行,如果从ram运行,则您很可能希望执行一些不同的操作,或者知道入口点的偏移量。
您正在将所有的端口2引脚设置为输出。然后将它们设置为高。
你的led配置是高电平打开还是高电平关闭?(应该是gpio,led,电阻,然后要么vcc或地,为高打开它应该是地。如果是vcc,则需要将端口引脚设置为低电平)。(不管元件的顺序是电阻然后LED还是LED然后电阻)。
我猜你没读过:
有效用户代码的标准
保留的Cortex-M3异常向量位置7(向量表中的偏移量0x 001 C)应包含表条目0至6的校验和的2的补码。这将导致前8个表条目的校验和为0。 Boot 加载程序代码对闪存0扇区中的前8个位置进行校验和。如果结果为0,则执行控制权将转移到用户代码。...
数据手册中的?
嗯,还是你真的想从拉姆那里查到?您需要将ro地址设置为0x 10000 xxx(见下文),并且您不需要向量表。
数据手册还指出:
ISP命令处理程序使用的RAM
ISP命令使用0x 1000 0118至0x 1000 01 FF的片内RAM。用户可以使用此区域,但重置时内容可能会丢失。闪存编程命令使用片内RAM的前32个字节。堆栈位于RAM top - 32。最大堆栈使用量为256字节,并且会向下增长。
所以你会看到人们在使用它的时候,通常会为bootloader保留0x 200字节。因此,请从0x 10000200而不是0x 10000000开始。出于某种原因,我更慷慨地使用0x 10000800。有些人一直保留0x 200字节,即使他们不使用ISP工具。
我假设从你的ro地址和rw地址和向量表,你想从闪存运行。您需要在那里得到校验和,我建议反汇编,以查看向量表有一个奇数地址的开始。您可能希望在死循环中放入一些其他向量来填充校验和的空间。