「基本」マイクロコントローラーからARM Cortexに移行する方法


22

さまざまなメーカーの8ビットコア(8051、PIC、AVRなど)で長年の経験があり、現在Cortex M0を把握しています。具体的にはこれですが、それよりももっと一般的になりたいと思います。

システムのさまざまな部分をさまざまな詳細レベルで説明する複数のドキュメントがあり、実際にすべてを結び付けているものは見当たりませんでした。これは、すべてを説明する1つのデータシートを持つことに比べて。そもそもドキュメント化するものがはるかに多いことは理解していますが、フォーマットの変更によりループが発生しています。

上記のWebサイトには、各サブシステムとペリフェラルの概要を説明するドキュメントと、各レジスタの詳細を説明するドキュメントがあり、ヘッダーファイルやいくつかの複雑な例を含むSDKのすべてのソースコードがありますが、それがすべて一緒に接続する方法を説明するものは何もない

Cortexアーキテクチャの簡潔なウォークスルーがあり、CPUから周辺機器への複数のバス層(それぞれが独自のウォッチドッグタイマーを備えているなど)の小さなコントローラーにはない機能と、それらのすべての接続方法について説明していますか?


製造元からプロセッサの実際のデータシート/ユーザーマニュアルを入手したかどうかは、説明からわかりません。これで、全体像と詳細がわかります。リンクしたサイトの写真の1つからは、NXPプロセッサのように見えます。製造元の部品番号を調べ、そのサイトでプロセッサのドキュメントを検索してください。ARMのサイトarm.com/products/processors/cortex-m/cortex-m0.phpもあります。
DigitalNinja

これに戻るのが遅れて申し訳ありません。私は他のプロジェクトで忙しかった。経験の声をありがとう@アダム。
アーロン

そして、@ Richardの考え方の概要と、ピン設定の印刷に関するメモをありがとう。私はあなたの両方を支持しました。
アーロン

極端な価格要件を見つけた場合を除いて、あなたは二度と戻らないでしょう。さらに、安価なCortex-Mがかなりあるため、誘惑されることもあります。
ローナンパイサン

回答:


40

私は、AVRとARM Cortex-M3 / M4 / R4ベースのMCUに取り組んできました。一般的なアドバイスを提供できると思います。これは、アセンブリではなくCでプログラミングしていることを前提としています。

CPUは実際には簡単な部分です。基本的なCデータ型は異なるサイズになりますが、とにかくuint8 / 16 / 32_tを使用していますか?:-)そして今、すべての整数型は適度に高速で、32ビット(int)が最速です。あなたはおそらくFPUを持っていないので、フロートとダブルを避けてください。

まず、システムレベルのアーキテクチャの理解に取り組みます。これは、IO、クロッキング、メモリ、リセット、および割り込みを意味します。また、メモリマップされた周辺機器の概念に慣れる必要があります。AVRでは、レジスタには一意のグローバル変数が定義された一意の名前があるため、それについて考えることを避けることができます。より複雑なシステムでは、ベースアドレスとオフセットでレジスタを参照するのが一般的です。それはすべて、ポインター演算に要約されます。ポインターに慣れていない場合は、今すぐ学習を開始してください。

IOの場合、周辺機器の多重化がどのように処理されるかを把握します。どのピンが周辺信号で、どのピンがGPIOであるかを選択するための中央マルチプレクサ制御はありますか?または、周辺レジスタを使用してピンを周辺モードに設定しますか?そしてもちろん、GPIOを入力および出力として構成し、オープンドレインモードとプルアップ/プルダウンを有効にする方法を知る必要があります。通常、外部割り込みもこのカテゴリに分類されます。GPIOは非常に汎用的であるため、ここでの経験が役立つはずです。

クロッキングはいくつかのことを要約します。通常、水晶または内部RC発振器のクロックソースから始めます。これは、1つ以上のシステムレベルのクロックドメインを作成するために使用されます。高速チップはPLLを使用しますが、これは周波数逓倍器と考えることができます。さまざまなポイントにクロック分周器もあります。考慮すべき重要な点は、CPUクロック周波数がどうあるべきか、通信周辺機器に必要なビットレートです。通常、これはかなり柔軟です。より高度になれば、通常はクロックゲーティングに基づいた低電力モードのようなことについて学ぶことができます。

メモリとは、フラッシュとRAMを意味します。十分なRAMがある場合、開発の初期段階でプログラムをそこに保持しておく方が速い場合が多いので、フラッシュを何度もプログラミングする必要はありません。ここでの大きな問題はメモリ管理です。ベンダーはサンプルのリンカースクリプトを提供する必要がありますが、プログラムの性質に応じて、コード、定数、グローバル変数、またはスタックにより多くのメモリを割り当てる必要があります。より高度なトピックには、コードセキュリティとランタイムフラッシュプログラミングが含まれます。

リセットは非常に簡単です。通常は、デフォルトで有効になっているウォッチドッグタイマーを探すだけです。デバッグは、同じコードを繰り返し実行するときにリセットがより重要です。このようにシーケンスの問題があるため、バグを見逃すのは簡単です。

割り込みについて知っておくべきことが2つあります。割り込みを有効または無効にする方法と、割り込みベクトルを構成する方法です。AVR-GCCはISR()マクロを使用して後者を行いますが、他のアーキテクチャでは、関数アドレスをレジスタに手動で書き込む必要がある場合があります。

マイクロコントローラー周辺機器は通常互いに独立しているため、一度に1つずつ学習できます。ペリフェラルを1つ選択し、それを使用してシステムレベルのものの一部を学習すると役立つ場合があります。CommペリフェラルとPWMはクロッキングとIOに適し、タイマーは割り込みに適しています。

複雑さのレベルに怖がらないでください。これらの「基本的な」マイクロコントローラは、あなたが知る必要があることの多くをすでに教えています。何か明確にする必要がある場合はお知らせください。


4
いい答えだ。もう1つ注意が必要なのはDMAペリフェラルです。これは、経験上、複雑で文書化されていないインターフェイスを持つ傾向があります。
ダグマックリーン

3
「そして今、すべての整数型は同等に高速になるはずです。」実際、Cの整数プロモーションルールにより、8/16ビットタイプを使用すると、符号/ゼロ拡張が多くなり、フラッシュメモリが少ない場合に問題になる可能性があります。したがって、RAMに余裕がある場合は、32ビット型をもっと使用するか、少なくともスタック変数にint/ int_leastN_T型を使用するほうが有利かもしれません。
-user694733

私のコメントを間違えました。私は言うつもりでした。int_fastN_t型ではなくint_leastN_t型を使用します。
user694733

@ user694733:C標準により、メモリ内の特定のサイズを占有し、特定の範囲内の値を操作できる整数をコードが要求できるようになりますが、その範囲を超えるとセマンティクスが緩やかに指定されます。ARMのようなものでは、int16_t多くの場合int32_t、メモリに格納されている値と同じくらい速くなりますが、標準でintは、17ビット以上のプラットフォームでは-32767にint16_t x=32767; x+=2;設定xする必要があり、コードがそうであっても符号拡張命令を頻繁に必要としますラッピング動作を利用しないでください。
-supercat

@supercat C標準では、符号なしの型に対してのみラップ動作が必要です。符号付きタイプの場合、可能な表現が異なるため、すべてのラッピングはUBです。そのx+=2ため、コンパイラは値がラップしないと仮定する可能性があるため、16ビット型の命令を使用することは合法です。しかし、ARMにはこれを可能にする16ビットのADD命令がないと思います。(間違っている可能性があります
。ARM

8

ARMはマイクロプロセッサの知的財産を所有しているが、実際には部品を製造していないことを覚えておくと便利です。代わりに、メーカーはさまざまなARMプロセッサバージョンのライセンスを取得し、機能と周辺機器を個別に組み合わせて独自の部品を製造しています。

そうは言っても、もしあなたがこのアーキテクチャを初めて使用するのであれば、基本的にはそのようなマイクロプロセッサーすべてのベースライン文書であるARMの文書から始めるのが理にかなっているでしょう。

たとえば、Cortex-M0はARMのWebサイトで説明されています

また、さまざまなニーズや関心に応えるARM関連の書籍のリストもあります。

最後に、特定のメーカーのデータシートがあります。M0の場合、サイプレス、NXP、およびSTMicroelectronicsは、Cortex-M0をベースにした実際の部品の多くのメーカーのうちの3社にすぎません。

(そして、いや、私はARMで働いていませんし、持っていません。)


1
これはかなり一般的な回答であり、Cortex-M0のドキュメントへのリンク以上のことは行いません。OPは自分で見つけることができると確信しています。
ジェイカールソン

1
全体的なドキュメントを見つけるのに助けを求めた質問に直接対処します。この答えは、必要なものに直接答え、物事がそのままある理由を説明します。
エドワード

8

大きな違いの1つは、ベンダーが提供するライブラリの使用です。PIC、Atmelなどの場合、基本ライブラリ(gpio、タイマー、adcなど)はほとんどの開発者によってあまり使用されませんでした。私の経験では、人々は(せいぜい)独自のコードを書くときのガイドとしてそれらを使用します。

ただし、ARMでは、ほとんどの場合ライブラリが使用されます。メーカーが従うことが推奨されている標準「CMSIS」があります。ほとんどの場合。コードの移植性(異なるARM間およびメーカー間)を支援し、コードを構造化するための「標準化された」方法を提供します。人々はライブラリ関数を見て理解することに慣れます。

確かにレジスタに直接アクセスする開発者もいますが、それらは外れ値です:)

あなたの質問に答えるために、私は図書館の資料を一読することは非常に役立つと思いました。STには、Doxygenが作成した大規模なヘルプファイルを含む、十分に開発されたコードがあります。各ハードウェアモジュールのすべてのオプションを確認できます。

GPIOを例として使用するには、初期化関数が次を処理します。

  • 方向(インまたはアウト)
  • プルアップ/プルダウン
  • オープンコレクター/プッシュプル
  • スルーレート

オプションを見ると、何が可能かがわかります。そして、もちろん、これらのオプションをInit関数に渡す方法を学びます!

さて、私はそれを言ったので、あなたの特定のARMにはCMSIS準拠のライブラリがないことがわかります。代わりに、独自のSDKをダウンロードできます。私は彼らのSDKドキュメントを調べ始めました。

この特定の製品と結婚していない場合は、より準拠したライブラリを持つ別のベンダーを見つけることをお勧めします。とにかく学習曲線を登るので、投資をよりポータブルにすることもできます...

ARMは楽しいです!私は振り返っていない。


「PIC、Atmelなどの場合、ほとんどの開発者はライブラリをあまり使用しませんでした。」どこから来たのかわからない。私はAVRではなくPICのみを使用しましたが、たとえばUSBホストインターフェイス、TCPスタック、またはSDカードファイルシステム用に独自のライブラリを作成したくないことは確かです。これらすべてのマイクロチップ社のライブラリは非常に適切なようです。
-tcrosley

ああ、@ tcrosley、あなたは間違いなく正しい。基本的な周辺機器でカバーされている機能のみを参照しようとしていた:gpio、タイマー、
adc

同意します。私は通常、GPIO、タイマー、クロック、およびUART R / Wに直接アクセスします。私は時々 、常にI2C、SPI、ADCおよびUARTのセットアップのための彼らのライブラリの呼び出しを使用しますが、ありません。PIC(特にPIC32)かARMかを問わず、多くのレジスタ。
-tcrosley

この答えは、OPの特定のコントローラーには適用されませんが、この質問に対してリストされている最も実用的な答えだと思います。AHBやNVICを理解しなくても、かなりの組み込みエンジニアリングを行えると思います。
ジェイカールソン

@JayCarlsonありがとう!この回答に対するあなたの編集は拒否されました。これは、他の人の投稿をそれほど変更しないはずだからです。しかし、それは本当に良い情報でした!あなた自身の回答として投稿することをお勧めします。そうすれば、人々を助け、支持されることにもなります:)
ビットマック

5

移動する良い時間です。8ビットは急速に消滅しています。(たとえば)かなり高性能な32ビットARMマイクロコントローラー(USBでも!)であるSTM32F103を使用して5ドルのボードを購入できる場合、間違いなく時代は変わっています。

あなたはすでにいくつかの優れた答えを持っていますが、主に「アセンブリを忘れて」、「CPUが低レベルでどのように機能するかを気にすることを忘れて」と言います-いつかそれを掘る必要があるコーナーケースがあります(特定の最適化またはデバッグ用)が、ARMコアは(設計により)Cコードを非常にうまく実行しますが、変化することはほとんどありません。

これは、コンパイラー(および特にリンカーとメイクファイル)の問題に頭を突っ込むのに一定の時間を費やすことを意味します。

ARMの仕組み(つまり、ARM CPUブック)の根幹は密集しており、実際に最適化する必要がある日まではあまり興味がありません(32ビットのレジスターとPLLがあるときは、驚くほどです) d CPUクロックは100MHz程度です。

「古いskool」ARM命令セットは、最新の「Thumb2」(ほとんどの最新のマイクロコントローラレベルのARM(Cortex)で見られるもの)よりも逆アセンブリを読む方がはるかに簡単ですが、アセンブリ言語命令の内部ほとんどが背景にフェードインします。適切なツールセット(特に、ブレークポイント/シングルステップなどを備えた適切なソースレベルデバッガー)があれば、それがARMであることにあまり関心がありません。

32ビットのレジスタと32ビットのデータバス幅、そしてオンチップで利用できるようにしたいものすべての世界に入ったら、再び8ビットCPUに戻ることはありません。基本的に、「簡単に」、コードを効率的に読みやすくするためのペナルティはありません。

しかし...周辺機器...はい、摩擦があります。

確かに、最新のMCUで使用できるものは山ほどありますが、その多くはかなり派手なものです。多くの場合、AVR、PIC、8051オンチップ周辺機器をはるかに超える洗練された世界を見つけます。

1つのプログラム可能なタイマー?いや、8つあります!DMA?プログラム可能な優先度とバーストモードおよびチェーンモードと自動リロードを備えた12チャネルはどうですか。

I2C?I2S?多数のピン多重化オプション?オンチップフラッシュを再プログラムする15の異なる方法 もちろん!

多くの場合、飢amineから周辺機器でごちそうになったように感じますが、一般的には、チップのチャンク全体が賞賛されるがほとんど使用されません(したがって、クロックゲーティング)。

オンチップハードウェアの量(およびたった1つのベンダーのチップラインのバリエーション)は、今日ではかなり気が遠くなります。もちろん、あるチップベンダーはIPブロックを再利用する傾向があるので、特定のブランドに慣れると簡単になりますが、「最近はすっごく楽しかったです」。

周辺機器とその相互作用(およびDMAと割り込みとバスの割り当ておよびand ...)が非常に複雑な場合(および、データシートに記載されているとおりではない場合があります)、エンジニアは頻繁にお気に入りのARM MCUを使用し、周辺機器と開発ツールに精通しているという理由だけでそれを使い続けたいと思う傾向があります。

優れたライブラリと開発ツール(つまり、適切なデバッガーを使用した高速コンパイル+デバッグサイクル)と、動作するサンプルコードプロジェクトの大規模なセットは、現在のARM MCUの選択に不可欠です。ほとんどのベンダーが非常に安価な評価ボードを持っているようです(

ご存知のとおり、ARMでマイクロコントローラーレベルを超えてSOCレベル(Raspberry Pi / etcスタイルのSOCなど)に到達すると、ルールが完全に変わり、どのLinuxを使用するかが決まります実行するために-わずかな例外を除いて-あなたは他のことを試みるために怒ってbarえているでしょう。

基本的に; このギグで事前に選択されている可能性のあるCPUに関係なく、いくつかの異なるベンダー(TI、STM、Freescaleなど)からいくつかの超安価なCortexベースの評価ボードを購入してください。提供されたサンプルコードをハックしてください。

最後のアドバイス。使用している正確な部品番号チップのピン多重化オプションを説明するページまたは3をデータシートで見つけたら、それを印刷して壁に貼り付けることができます。プロジェクトの後半で、ピンの多重化のために特定の周辺機器の組み合わせが不可能であることがわかり、時にはその情報が埋もれてしまい、隠そうとしていることを誓います:-)


簡単な補足-プロジェクトが最も単純なコントローラーよりもはるかに大きい場合は、RTOSの使用を検討してください-選択したものには学習曲線がありますが、最近ではマルチスレッドOSを実行するための小さなARMでも十分な能力があります。個人的には、ChibiOSはリーンでありながら優れた組み合わせであることがわかりました(特に、素敵な周辺機器ライブラリが付属しているSTM32で実行されています)が、多くの選択肢があります。
リチャードアプリン

4

私もAVRから来ましたが、現在は通常STM32(Cortex-M)に固執しています。ここに私が最初に推奨するものがあり、私が始めたときの私自身の困難を反映しています:

  1. デバッガ、または少なくともJTAGコネクタを備えたボードを入手します(その後、JTAGデバッガを購入します)。安いものがたくさんあり、それを使うことで多くの時間を節約できます。

  2. すべてが含まれた優れたIDEを入手してください。ずっと前にCooCox CoIDEをお勧めしていました。それ以来、開発を停止して再開したため、現在どのようになっているのかわかりません。「A IDE」を使用すると、基本的なHello World LEDをすぐに点滅させることができます。

  3. 「良いIDE」は、製造元のCMSISヘッダーをセットアップする必要があります。これは基本的に、C / C ++プログラムの簡単な記述を可能にするレジスタマップであり、プレーンな数字とポインタの代わりに変数名を使用します。

  4. 絶対的な最高のパフォーマンスが必要ない場合は、メーカーの周辺機器ライブラリを使用してみてください。あなたは学習しているので、実際には今のところしません。後でさらに絞る必要がある場合は、ライブラリコードを調べて、どのように機能するかを確認してください。ライブラリの良いところは、通常、同じコードで同じメーカーの多くの異なるチップを使用できることです。

  5. AVRとは異なり、ARMチップは周辺機器を無効にして起動します。最初に有効にする必要があります。優れた周辺機器ライブラリには、周辺機器を適切に使用する方法の例があり、デバイスのデータシートから詳細情報を入手できます。そのため、使用する前にクロックと周辺機器を必ず有効にしてください。はい、I / Oポートも周辺機器と見なされます。

  6. 学習しながらコーディングします。それは本当に非常に複雑なので、一度にすべてを理解しようとしないでください。まず、クロックツリー(APB、AHBなどのバス)と、クロックとクロック分周器の相互作用を学習します。次に、IDEがデバイスのリンカースクリプトスタートアップコードを保存する場所を確認します。リンカスクリプトは、メモリ(RAM、フラッシュ、ISRベクタテーブルなど)を整理する方法とほぼ同じです。スタートアップスクリプトはプログラムをセットアップします(グローバル変数初期化子をフラッシュからRAMにコピーするなど)。一部のIDEにはASMにスタートアップスクリプトがあり、一部にはCにあります。場合によっては、好みの言語でGoogleを使用して別のスクリプトを作成できます。

  7. できるだけ早くデバッガを入手してください。最初に何かをすること(通常はハードウェアの初期化)を必要な順序とは異なる順序で行うことはよくあることです。これにより、while(1);プログラムを停止する無限ループ(ISRのデフォルト実装)に陥るISR例外がトリガーされることがあり、デバッガーを使用してもトレースが困難です。デバッガなしで想像してください。

  8. デバッガーについて話して、UARTも動かしてみて、それからシリアルUSBアダプターを使ってそれを読んでください。printf()デバッグは常に便利です:-)


3

8051、AVR、またはPICについてはあまり作業していません。しかし最近、ARM Cortex MXプロセッサのラインを検討し始めました。したがって、8051、AVRまたはPICからの移行についてはあまり説明できませんが、ほとんどは初心者の観点からです。

ARM®Cortex™-M4プロセッサはハーバードアーキテクチャに基づいているため、データバスと命令バスが別々になっています。以下は、高レベルの画像です。

ここに画像の説明を入力してください

今週、NXPの代表者が当社の施設を訪れます。NXP ARM-Cortex Mxリソースについて確認し、ここに投稿します。Freescaleには、ARM®Cortex®-Mコア基づいたKinetis低電力32ビットマイクロコントローラー(MCU)があり、ARMプロセッサーの学習に関する同様のガイドがあることも理解しています。残念ながら、私はそれらを研究していません。


参照:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.