繁体   English   中英

Cortex-M3初始化

[英]Cortex-M3 Initialisation

我写了(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:

也许有人知道任何教程或书籍,关于链接器脚本,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.

堆栈顶部地址应该在地址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 */

您可以在运行时手动设置堆栈指针,就像手臂模式或大多数其他处理器一样。

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

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

Arm / Thumb:在Thumb代码中使用BX,调用Thumb功能,或跳转到另一个功能中的Thumb指令

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

.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,如果它没有做你认为应该做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM