2012-03-05 33 views
4

私は(IMO)ほぼ単純なARMアプリケーションを作成しましたが、うまくいかなかった:) 何が問題なのでしょうか?何が見逃されていますか?Cortex-M3の初期化

フラッシュ書き込みとCPUリセット後、レジスタにゴミがあります。

STM32F1で最も簡単なアプリケーション を実行するために何が行われなければいけないのか、親切にしてください。

誰かが、アプリケーションが起動する前に何をしているかを列挙してもいいですか、 ieです。

  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。

ありがとうございます。

+0

http://github.com/dwelch67には一般的な例で多くのcortex-mとthumbがあります。このような単純なプログラムでは、追加ハングアップ後に無限ループを入れます:b hang、それのようなものです。 –

答えて

7

ヨアヒムあなたは、スタックポインタをベクタテーブルの最初のエントリが欠落している指摘したように、私は多くの親指とのCortex-Mベースの例http://github.com/dwelch67

を持っています。 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 */ 

にスタックポインタの開始値を置くことによって、セットアップスタックをすることができ皮​​質-mに対して、しかし答えを完了するために、

アームモードまたは他のほとんどのプロセッサーでアームを使用する場合と同じように手動で行います。

コードを無限ループに入れて、書かれているように、定義されていない命令などに陥らないようにする(0xFFsでなければならない、cortex-m0では-m3またはarmv7 thumb2をサポートする-m4は実際の命令かもしれません)。

私はベクターで+1を使用しなかったことに注目してください。あなたはあなたのツールを知る必要があります。あなたは、ブランチ上にサムアドレス/サムモードを示すためにlsbitを設定する必要があります。私はその上の教訓を学んだが、あなたはディレクティブを置けば、GNUアセンブラで

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ツールはアドレス| 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 . 

にコードを変更し、

.thumb_func 
hang: b . 

とベクタテーブルへ

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

変更が

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

それは本当にプラス1を実行するのではなく、代わりに1つを実行します。

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 

これは少し混乱しています。 2つ目は、ベクタテーブルにスタックポインタを設定し、2番目に新しいプロジェクトを開始するときに逆アセンブルし、ベクタテーブルを調べて、期待していることを確認します。あなたが思っていることをやっていないなら、Esp。

+0

ありがとうございました** dwelch **!私が今までに見たCortex-M3の話題には最高の答えです!最高のおかげで再びありがとう。 – Tyrreus

+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番地でなければなりません。

+0

はい、これが問題です。 –

+0

スタックを使用していないので、.word 0などを置くだけで、後で値を取得する心配はありません。 –

+0

ありがとうございます**ヨアキム** – Tyrreus