2016-07-18 7 views
2

私はKeilを使ってWindows上でstm32 arm cortex m3マイクロコントローラをプログラミングした経験があります。私は現在、Linux環境に移行し、オープンソースのツールを使用してSTM32 cortex m3デバイスをプログラミングしたいと考えています。ubuntuでSTM32f103プログラムをコンパイルするには?

私はちょっと調べて、OpenOCDやTexaneのST Linkを使ってチップをフラッシュできることを発見しました。私は、コードをコンパイルするためにクロスコンパイラが必要であることも知った。 gcc-arm-none-eabiツールチェーン。

どのような基本的なソースファイルとヘッダーファイルが必要なのか知りたいですか?シンプルな点滅プログラムを作るために必要なコアファイルとシステムファイルはどれですか?

私は現在、HALライブラリを使用するつもりはありません。私はstm32f103zet6 mcu(非常に汎用ボード)を使用しています。私はhttp://regalis.com.pl/en/arm-cortex-stm32-gnulinux/に行ったが、ファイルを正確に特定できなかった。

Linux環境でstm32プログラミングを開始するチュートリアルがあれば、教えてください。

何か助けていただければ幸いです。ありがとう!

+0

はHALおよびベアメタルのあるものを使用する多くの例があります。あなたはあなた自身のヘッダーを作ることができます、stm halやcmsisは必要ありません。もし望むなら、それらを手に入れて、あなたが望むパーセンテージを使うことができます。 –

答えて

-1

http://gnuarmeclipse.github.io/

そこには、IDE(Eclipseの)、ツールチェーン、デバッガ、ヘッダを含む、すべてのものを見つけることができます。

+0

返信いただきありがとうございます!ほんとうにありがとう。しかし、私はIDEを探していません。実際、私はIDEを使いたくありません。私はちょうどツールチェーンとMakefilesで作業したいです。申し訳ありませんが、私は十分に私の質問では明確ではなかった。私はコマンドラインからすべてをやりたい。私は今その可能性があるのだろうか? – Navin

+0

その後、出発点として生成されたメイクファイルとディレクトリ構造をとり、上記のサイト上で日食とサンプルプロジェクトやプラグインを作成することができます。 – berendi

-1

これを見てくださいpackage。これはIDE + toolchain +デバッガで、Linuxプラットフォームで使用できます。あなたはそれを研究し、あなたが望むことをするためのアイデアを得ることができます。私は、Linuxのプログラムの大半が通信回線インターフェイスを持っていることを願っています。

また、私はあなたに提案することができます:あなたのmcuのために既に利用可能な場合は、LL APIを使用してみてください。

2

ここでは、stm32ファミリ全体に移植可能な非常に簡単な例を示します。あなたが何かを導くために空白を埋めなければならないものは何もありません。(回路図、マニュアルを読んだり、gpioにクロックを有効にしたり、命令をプッシュ/プル出力にするなど、ビットをクリアするか、ビットをクリアするなど)。

私は他の人たちがどのように自分のものを持っているのか私の理由はありますが、私たちは皆、それらの意見の背後にある何十年も何十年もの経験を持っています。しかし、彼らの終わりには、彼らは意見であり、多くの異なる解決策が働くでしょう。あなたは、単にツールチェーンを得るためにこれを行うことができますUbuntuの最後のように多くのリリースで

apt-get install gcc-arm-linux-gnueabi binutils-arm-linux-gnueabi 

それとも、お使いのオペレーティングシステムにあらかじめ構築されたここに行くと取得することができます

https://launchpad.net/gcc-arm-embedded 

flash.s

.cpu cortex-m0 
.thumb 
.thumb_func 
.global _start 
_start: 
stacktop: .word 0x20001000 
.word reset 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.thumb_func 
reset: 
    bl notmain 
    b hang 
.thumb_func 
hang: b . 
.align 
.thumb_func 
.globl PUT16 
PUT16: 
    strh r1,[r0] 
    bx lr 
.thumb_func 
.globl PUT32 
PUT32: 
    str r1,[r0] 
    bx lr 
.thumb_func 
.globl GET32 
GET32: 
    ldr r0,[r0] 
    bx lr 
.thumb_func 
.globl dummy 
dummy: 
    bx lr 
.end 

flash.ld

MEMORY 
{ 
    rom : ORIGIN = 0x08000000, LENGTH = 0x1000 
    ram : ORIGIN = 0x20000000, LENGTH = 0x1000 
} 

SECTIONS 
{ 
    .text : { *(.text*) } > rom 
    .rodata : { *(.rodata*) } > rom 
    .bss : { *(.bss*) } > ram 
} 

sram.s

.cpu cortex-m0 
.thumb 
.thumb_func 
.global _start 
_start: 
    ldr r0,stacktop 
    mov sp,r0 
    bl notmain 
    b hang 
.thumb_func 
hang: b . 
.align 
stacktop: .word 0x20001000 
.thumb_func 
.globl PUT16 
PUT16: 
    strh r1,[r0] 
    bx lr 
.thumb_func 
.globl PUT32 
PUT32: 
    str r1,[r0] 
    bx lr 
.thumb_func 
.globl GET32 
GET32: 
    ldr r0,[r0] 
    bx lr 
.thumb_func 
.globl dummy 
dummy: 
    bx lr 
.end 

sram.ld

MEMORY 
{ 
    ram : ORIGIN = 0x20000000, LENGTH = 0x1000 
} 
SECTIONS 
{ 
    .text : { *(.text*) } > ram 
    .rodata : { *(.rodata*) } > ram 
    .data : { *(.data*) } > ram 
    .bss : { *(.bss*) } > ram 
} 

notmain。C

void PUT32 (unsigned int, unsigned int); 
unsigned int GET32 (unsigned int); 
void dummy (unsigned int); 
#define STK_CSR 0xE000E010 
#define STK_RVR 0xE000E014 
#define STK_CVR 0xE000E018 
#define STK_MASK 0x00FFFFFF 
int delay (unsigned int n) 
{ 
    unsigned int ra; 
    while(n--) 
    { 
     while(1) 
     { 
      ra=GET32(STK_CSR); 
      if(ra&(1<<16)) break; 
     } 
    } 
    return(0); 
} 
int notmain (void) 
{ 
    unsigned int rx; 
    PUT32(STK_CSR,4); 
    PUT32(STK_RVR,1000000-1); 
    PUT32(STK_CVR,0x00000000); 
    PUT32(STK_CSR,5); 
    for(rx=0;;rx++) 
    { 
     dummy(rx); 
     delay(50); 
     dummy(rx); 
     delay(50); 
    } 
    return(0); 
} 

Makefileの

​​

また、あなたが好む場合は、このアプローチを使用する/してみてください。私は理由がありません、TL; DW。ある程度STはあなたのための微分を公開するアームドキュメント間

void dummy (unsigned int); 
#define STK_MASK 0x00FFFFFF 
#define STK_CSR (*((volatile unsigned int *)0xE000E010)) 
#define STK_RVR (*((volatile unsigned int *)0xE000E014)) 
#define STK_CVR (*((volatile unsigned int *)0xE000E018)) 
int delay (unsigned int n) 
{ 
    unsigned int ra; 
    while(n--) 
    { 
     while(1) 
     { 
      ra=STK_CSR; 
      if(ra&(1<<16)) break; 
     } 
    } 
    return(0); 
} 
int notmain (void) 
{ 
    unsigned int rx; 
    STK_CSR=4; 
    STK_RVR=1000000-1; 
    STK_CVR=0x00000000; 
    STK_CSR=5; 
    for(rx=0;;rx++) 
    { 
     dummy(rx); 
     delay(50); 
     dummy(rx); 
     delay(50); 
    } 
    return(0); 
} 

(誰もがあなたがまだ腕に行くべきであるとい)。プラスst docs。

uartベースのブートローダが組み込まれています(USBなどの可能性があります)。これはインターフェイスがかなり簡単です。プログラムをダウンロードするホストコードは数百行のコードで、おそらく夕方または書き込みするafternoont。 YMMV。とにかく、それらのデバッグの終わりを使用して他のstm32や他の非stアームチップをプログラムすることができます(すべてではなく、openocdがサポートするものに依存します)。など)が、専用のstlink usbドングルよりも30%安く入手でき、拡張usbケーブルなどが不要です。YMMV。すでに述べたように、openocdまたはtexane stlinkで確実にstlinkを使うことができます。

私は2つの例を提供しています.1つは、openocd経由でダウンロードして、ラムにダウンロードして、その方法で実行することですが、フラッシュを使用することは間違いありません。実行時に開始アドレス。私はこの方法が好きです。 YMMV。

このアプローチは、移植性があり、HALの制限や要件、ビルド環境などによって完全に妨げられるものですが、さまざまな方法を試すことをお勧めします。このようなベアメタルは、1つ以上のstソリューションとcmsisアプローチを備えたHALタイプのベアメタルです。毎年またはもう一度試してみてください。あなたが選んだものがまだあなたが好きなものかどうかを確認してください。

この例では、全体的に大したことはありませんが、この例では説明しています。私はarmv7m thumb2の拡張を避けるために単にcortex-m0を選んだ。それらの拡張機能を持たない親指は最もポータブルなアーム命令セットです。コードはほとんど何もしませんが、systickタイマーを持つstm32 cortex-mでは何もしません。

あなたは、リンカーは、最小限の非Cコードになり養うために必要なものは何でも一緒にEDIT

これ。

.global _start 
_start: 
.word 0x20001000 
.word reset 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 

そして、これはチップベンダーとコアあらゆる小さい事のどんな小さな割り込みのためのベクターの百数十が可能に応じて省略されます。この場合、ラベルのリセットとハングは、これらのベクトルを扱うC関数の名前になります(チップとコアのドキュメントによって、どのベクトルが何を処理するかが決まります)。最初のベクトルは常にスタックポインタの初期化値です。 2番目は常にリセットされ、次のいくつかは一般的です。その後は、チップベンダーがワイヤリングするコアの汎用割り込みピンであるため、チップベンダーのドキュメントを参照する必要があります。

コアデザインは、レジスタが保存されるようになっているため、アセンブリを少し必要としません。ブートストラップがなくても、.bssをゼロにしたり.dataを初期化したりしないことを前提としています。実際の実装ではデモテストのためにリセット機能からリターンすることはできません。終了)。

あなたのツールチェーンには、これを行うための別の方法があるかもしれません。すべてのツールチェーンアセンブラとアセンブラは単語のテーブルを生成することができなければならないので、そのオプションが常にあり、doesntのは本当にこのためにまた別のツールと言語を作成しても意味がなく、一部の人々は必要性を感じています。あなたのツールチェーンは、_startという名前のエントリーポイントを必要としないかもしれません、そして/またはそれは異なるエントリーポイント名要件を持つかもしれません。あなたはキールを使用する場合でも

することは、あなたも、キールよりもかなり多くの支援と世界での経験を得るために(簡単に)簡単に、GNUのツールを試してみてください。 Kielのようなコードの「良い」コードとは言えませんが、いつもあなたのバックポケットに入れておく必要があります。常にgnuツールのヘルプを見つけることができます。

+0

返信ありがとうdwelch!私はあなたがここでアセンブリ言語を使用しているのを見て、私はそれらが親指の指示であると推測します。私はARMでのアセンブリプログラミングに全く慣れていません。 Keilでは、cortex m3のコアヘッダーファイル、システム起動ファイル(アセンブリで書かれた唯一のファイル)、デバイスヘッダーなど、いくつかのファイルをインクルードしていました。これらのファイルをインクルードして使用し、そこからMakefileとクロスコンパイラ(ベアメタル)を使用したいと思っています。私は自分自身を明確に説明してくれることを願っています何か明確にするために私に尋ねなさい。あなたの時間をもう一度ありがとう。 – Navin

+0

はい、皮質-Mあなたはフラッシュからブートする場合は、あなたが必要とする唯一の非Cの事は、ベクタテーブル(井戸やある種のリンカスクリプトやコマンド)です。上の私のフラッシュコードでは、.wordの部分を持つ部分がこのツールチェーンの最小値になり、後者の例では揮発性のポインタを使用します。 –

+0

cortex-mはサムのみのマシンであり、フルサイズのアーム命令はサポートしていません。 M0、M0の+は、ARMv6-Mであり、親指に加えthumb2拡張少数の、M3及びM4を有し、それらがサポートthumb2拡張機能の数が多いM7。 Thumb without thumb2は、arm7tdmiから現在までのすべての腕のコアで機能する唯一の命令セットであり、学習するのが簡単です。 –

関連する問題