Cortex-M3初始化

时间:2012-03-05 11:34:01

标签: assembly cortex-m3 stm32

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

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

请善待,如果你知道,请告诉我如何运行最简单的应用程序 在STM32F1上。

可能是某人在申请开始前列举了必须完成的工作, 即

  1. 初始化堆栈(有必要吗?)
  2. 设置一些东西。
  3. 设置其他内容。
  4. 申请表:

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

    也许有人知道任何教程或书籍,关于链接器脚本,cpu初始化等等?

    处理器为:STM32F103VBT6

    编程人:OpenOCD。

    提前致谢。

2 个答案:

答案 0 :(得分:8)

来自M3 documentation;

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.

堆栈顶部地址应该在地址0,似乎你错过了它。

答案 1 :(得分: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 */

你可以肯定一旦手动设置堆栈指针就像手臂模式或大多数其他处理器一样。

我会让你的代码陷入一个无限循环,所以,如你所写,你不会陷入未定义的指令等等(应该是0xFFs,我认为在cortex-m0上是未定义的,在-m3或-m4 with armv7 thumb2支持它可能是一个真正的指令)。

请注意,我没有在我的矢量上使用+1。你需要知道你的工具。您需要设置lsbit来指示分支上的拇指地址/拇指模式。虽然我从中吸取了教训(必须找到这样的问题)

Arm/Thumb: using BX in Thumb code, to call a Thumb function, or to jump to a Thumb instruction in another function

如果在标签之前放置指令.thumb_func,则使用gnu汇编程序,该标签将被标记为拇指标签,然后gnu工具将使用地址|。

.thumb_func
.globl _start
_start:

您需要不时地构建和反汇编,以确保正确构建表,并且分支等正在使用正确的地址。

   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

看,显然我的一个例子中有一个错误...它除了重置之外什么都不做(示例中没有使用中断,所以这就是我不知道的方式)。忘了.thumb_func

hang:   b .

产生

00000050 <hang>:
  50:   e7fe        b.n 50 <hang>

更改为

.thumb_func
hang:   b .

,向量表转到

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

这很有趣,将代码更改为

.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 */

它并没有真正做一个加号,而是一个或一个。

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

这有点令人不安。但是,有两个东西,有一个cortex-m你可以在向量表中设置堆栈指针,第二,当开始一个新项目反汇编并检查向量表以确保它是你期望的。 Esp,如果它没有做你认为应该做的事情。