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