恩智浦LPC1768中的ARM组装

时间:2016-06-19 16:05:12

标签: assembly arm cortex-m3

我想为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 个答案:

答案 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中以填补校验和的空间。