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 填充到校验和。
我想为 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 填充到校验和。