Tyr*_*eus 4 assembly cortex-m3 stm32
我写了(IMO)几乎最简单的ARM应用程序,它没有工作:)什么可能是错的?错过了什么?
闪存写入和CPU复位后,寄存器中有垃圾.
请善待,如果你知道,请告诉我在STM32F1上运行最简单的应用程序需要做些什么.
也许是某人可以列举在申请开始前必须做的事情,即.
应用程序:
@Directives
.thumb @.code 16
.syntax unified
.section .text
.org 0 @ Alters location of pointer - in this case set to zero
vectors: @ Define basic vectors for specific capabilities
.word _start + 1 @ Set - start address and increment pointer
.word _nmi_handler + 1 @ Below all other vectors will be declared:
.word _hard_fault + 1
.word _memory_fault + 1
.word _bus_fault + 1
.word _usage_fault + 1
_start:
mov r0, #5
mov r1, #4
add r2, r0, r1
_nmi_handler:
_hard_fault:
_memory_fault:
_bus_fault:
_usage_fault:
Run Code Online (Sandbox Code Playgroud)
也许有人知道任何教程或书籍,关于链接器脚本,cpu初始化等?
处理器为:STM32F103VBT6
程序员:OpenOCD.
提前致谢.
从M3文档 ;
The vector table at location 0 is only required to have four values:
Stack top address
Reset routine location
NMI ISR location
Hard Fault ISR location.
Run Code Online (Sandbox Code Playgroud)
堆栈顶部地址应该在地址0,似乎你错过了它.
我有很多基于拇指和皮质的例子http://github.com/dwelch67
正如Joachim指出的那样,你缺少向量表中的第一个条目,即堆栈指针.cortex-m与手臂没有相同的矢量表,这意味着一个用手臂指令以手臂模式启动.
要完成答案,对于cortex-m,您可以通过将堆栈指针的起始值放在第一个单词位置来设置堆栈
.cpu cortex-m3
.thumb
.word 0x10008000 /* stack top address */
.word _start /* 1 Reset */
.word hang /* 2 NMI */
.word hang /* 3 HardFault */
.word hang /* 4 MemManage */
Run Code Online (Sandbox Code Playgroud)
您可以在运行时手动设置堆栈指针,就像手臂模式或大多数其他处理器一样.
我有你的代码陷入一个死循环,这样,书面,你不陷入未定义指令等(应该是0xFFs,这对皮质-M0我认为这是一个不确定的,在-M3或-M4与armv7 thumb2支持它可能是一个真正的指令).
请注意,我没有在我的矢量上使用+1.你需要知道你的工具.您需要设置lsbit来指示分支上的拇指地址/拇指模式.虽然我从中吸取了教训(必须找到这样的问题)
Arm/Thumb:在Thumb代码中使用BX,调用Thumb功能,或跳转到另一个功能中的Thumb指令
使用gnu汇编程序如果在标签之前放置指令.thumb_func,那么该标签将被标记为拇指标签,然后gnu工具将使用地址| 1.
.thumb_func
.globl _start
_start:
Run Code Online (Sandbox Code Playgroud)
您需要不时地构建和反汇编,以确保正确构建表,并且分支等正在使用正确的地址.
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000050 andeq r0, r0, r0, asr r0
c: 00000050 andeq r0, r0, r0, asr r0
10: 00000050 andeq r0, r0, r0, asr r0
Run Code Online (Sandbox Code Playgroud)
看,显然我的一个例子中有一个错误...除了重置之外什么都不做(示例中没有使用中断,所以这就是我不知道的方式).忘了.thumb_func
hang: b .
Run Code Online (Sandbox Code Playgroud)
生成
00000050 <hang>:
50: e7fe b.n 50 <hang>
Run Code Online (Sandbox Code Playgroud)
改成
.thumb_func
hang: b .
Run Code Online (Sandbox Code Playgroud)
并且向量表转到
00000000 <hang-0x50>:
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000051 andeq r0, r0, r1, asr r0
c: 00000051 andeq r0, r0, r1, asr r0
10: 00000051 andeq r0, r0, r1, asr r0
14: 00000051 andeq r0, r0, r1, asr r0
Run Code Online (Sandbox Code Playgroud)
这很有趣,将代码更改为
.cpu cortex-m3
.thumb
.word 0x10008000 /* stack top address */
.word _start+1 /* 1 Reset */
.word hang+1 /* 2 NMI */
.word hang+1 /* 3 HardFault */
.word hang /* 4 MemManage */
.word hang /* 5 BusFault */
Run Code Online (Sandbox Code Playgroud)
并没有真正做一个加号而是一个或一个.
00000000 <hang-0x50>:
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000051 andeq r0, r0, r1, asr r0
c: 00000051 andeq r0, r0, r1, asr r0
10: 00000051 andeq r0, r0, r1, asr r0
Run Code Online (Sandbox Code Playgroud)
这有点令人不安.但是,有两个东西,有一个cortex-m你可以在向量表中设置堆栈指针,第二,当开始一个新项目反汇编并检查向量表以确保它是你期望的.Esp,如果它没有做你认为应该做的事情.