Cortex-M3初始化

Tyr*_*eus 4 assembly cortex-m3 stm32

我写了(IMO)几乎最简单的ARM应用程序,它没有工作:)什么可能是错的?错过了什么?

闪存写入和CPU复位后,寄存器中有垃圾.

请善待,如果你知道,请告诉我在STM32F1上运行最简单的应用程序需要做些什么.

也许是某人可以列举在申请开始前必须做的事情,即.

  1. 初始化堆栈(有必要吗?)
  2. 设置一些东西
  3. 设置别的东西.

应用程序:

@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.

提前致谢.

Joa*_*son 8

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,似乎你错过了它.


old*_*mer 7

我有很多基于拇指和皮质的例子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,如果它没有做你认为应该做的事情.