それがどのように機能するかを学ぶには、上記のどれも使用したくないでしょう。アームクロスコンパイラとstのドキュメントを取得します。コーディングを開始します。これらのチップは一般にプログラムが非常に簡単です。ドキュメントには、どのレジスタのどのビットが何をするかが示されています。
これらのライブラリのいずれか/すべては、あなたからその理解/負担/作業を取り除き、アプリケーションプログラミングエクスペリエンスのようなAPIを呼び出すだけのように感じさせることを目的としています。これは多くの人が望むものです。これらのライブラリのすべてのソースを使用して理解を深めることができますが、上手くいくと、ライブラリに穴や問題、場合によっては非常に怖いコードが見つかります。一緒に投げられ、一般的に書かれ、チップからチップに大まかに移植されたコード、チップにない機能などをサポートします。そして、それらはすべて過度のオーバーヘッドを持っています。タスクに対して10〜100倍のコードが多すぎます。多くのコードが最適化されてしまう可能性がありますが、そもそもなぜそこにあるのでしょうか。
自分でライブラリを作成する場合でも、これらのライブラリを使用する場合でも、使用しているライブラリのソースを調べて、ライブラリの動作に満足できるかどうか、理にかなっている場合、チップのドキュメントと一致するかどうかを確認する必要があります。うまくいかないのは、その理由を見つけるために、あなたのものと同じくらいそれらのものを掘り下げる必要がある可能性が高いからです。
チップのドキュメントも完璧ではないことに注意してください、それは楽しみの一部です。
ベアメタルプログラミングについての議論でアセンブリが出てくる理由がわかりません。ごくわずかな組み立てで対応できます。これらのcortex-mチップの場合、技術的にはこのasmを起動するだけで十分です。
.globl _start
_start:
.word 0x20001000
.word main
データやbssに依存することはできず、最小限のasmでmainから戻ることはできません。しかし、それがベアメタルのベアリストに必要なすべてです。割り込みを実行する場合は、ベクターテーブルにさらにエントリが必要です。より多くの.word行。私はより多くのasmをお勧めしますが、おそらく10または20行以上です。
これは通常、私が使用するすべてのasmです。
.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 GET16
GET16:
ldrh r0,[r0]
bx lr
.thumb_func
.globl dummy
dummy:
bx lr
.end
うん、それはcortex-m0と言っていますが、これは私のm4コードの実際のブートストラップです。私はこれがthumb2ではなくthumbであることを好みます。そして、このコードを1つのcortex-mから別のcortex-mに再利用し、必要に応じてスタックポインターアドレスを変更するだけで、m0、m3、m4で機能します。私はまだm7を持っていないし、あまり研究していません。
fpuを有効にするには、特定の指示が必要なため、asmの行がさらにいくつか必要になる場合があります。しかし、ポイントは、低レベルのプログラミングとasmを混同しないでください。Cには、チップの構成やアプリケーションの作成に必要なものがあります。あなたが話しているライブラリはasmではなくCで書かれているため、明らかにasmを使用する必要はありません。
内部の仕組みを学びたい場合は、独自のコードを作成してください。これらのライブラリを参照として以外に使用しないでください。コードを読むよりも、ハッキングする方が簡単な場合があります。(STだけでなく、すべてのベンダー。ベンダーの1つがコード行を持っていたので、私はそれをインタビューの質問として使用しているので、ここでは投稿しません。
STはもちろんですが、他のベンダーも同様に、電力を節約するために、チップのセクションのクロックを有効にします。そのため、LEDを点滅させようとする前に、そのgpioブロックの有効ビットを見つけて出てくるかどうかを確認する必要がありますリセットが有効になっている場合、有効になっていない場合、クロックを有効にせずにそのgpioロジックと通信すると、応答しないロジックからの応答を待機しているため、プロセッサがハングします。彼らは常にこれらの可能性についてあなたに話してはいけません。一度有効にすると、特定の周辺機器の初期化について説明します。ST docsはかなり優れています。ドキュメントのグレードがかなり悪いマイクロチップから来るので、問題はないはずです。
Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
またはDrivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
それぞれにあります。