banner

ブログ

Jul 04, 2023

Raspberry Pi RP2040: 手

RP2040 マイクロコントローラーを搭載した Raspberry Pi Foundation の Raspberry Pi Pico ボードのリリースは、ここ数か月間メーカー コミュニティで大きな話題を呼びました。 特に 2 つのプログラマブル I/O (PIO) ステート マシン ペリフェラルを使用して、DVI ビデオ ジェネレータやその他のデジタル ペリフェラルを作成する方法を多くの人が実証しています。

この興奮とともに、STM32、SAM、その他の Cortex-M ベースの MCU を使用している私たちにとって、これらのいずれかが大きな混乱を引き起こすのではないかという疑問も生じます。 RP2040 はおそらく私たちのプロジェクトの一部にとって有効な選択肢になるでしょうか? RP2040 はデュアル Cortex-M0+ プロセッサ MCU であるため、32 ビット ARM MCU 分野における現在の有力企業の 1 つである ST マイクロエレクトロニクスの製品と同等に扱うのは当然のことと思われます。

Raspberry Pi Foundation の pipsqueak は、ST のエンジニアにそれがどのように行われるかを示すことができたでしょうか。それとも、前者は前提条件の一部を再検討する必要があるのでしょうか? そして、低レベルのコードを STM32 から RP2040 に移植するのはどれほど難しいのでしょうか?

簡単に言うと、RP2040 が私の目に留まった後、C++ ベースの STM32 フレームワークをこの新しい MCU に移植してみるのは面白いかもしれないと考えました。 ただし、デュアル Cortex-M0+ コアはそれほど重要ではありません。STM32H7 デュアルコア (M4 および M7) MCU が手元にあり、RP2040 の詰め込みを簡単に克服して、より多くの I/O を確保できます。 私が最も興味をそそられたのは、RP2040 のこのステート マシン ペリフェラル (PIO) で、詳しく見る価値があると思われました。

STM32 での経験に基づいて、いくつかのファイルをすぐに移植し、プロジェクト内に新しい「RP」アーキテクチャ ブランチを作成して、レースに出場できると考えました。 Cortex-MはCortex-Mですよね? 新しい ARM ベースの MCU の通常の手順は、データシート、リファレンス マニュアル、および CMSIS デバイス ファイルを入手することです。 この後、コアレベルのデバイス (SysTick、NVIC など) は同じままで、新しいペリフェラルの名前付けとレジスタ レイアウトを使用するように低レベルのコードを簡単に適応させることができます。

おそらく世間知らずだったのでしょう、CMSIS サポートを確認することも、リファレンス マニュアルを一読することもせずに、Raspberry Pi Pico ボードを注文してしまいました。 驚いたことに、CMSIS のサポートや他の Cortex-M エコシステムとの相互運用性さえまだ注目されていないことがわかりました。 それでも、RP2040 MCU の SVD ファイルは「Pico SDK」で提供されており、デバイス ヘッダーの生成に使用できます。 RP2040 を使用した CMSIS のブートストラップに関する Chris Hockuba の取り組みのおかげで、最終的に実用的なソリューションが完成しました。

STM32 プロジェクトの場合、ベアメタル プロジェクトをターゲット MCU 上で動作させるために必要なアイテムがいくつかあります。 これらには、環境の基本的なセットアップを実行するスタートアップ コードと、割り込みハンドラのベクタ テーブルが含まれます。 すべてのビットが正しいメモリ オフセットに到達することを保証するリンカー スクリプトもあります。 これはすべて非常に最小限であり、MCU はブート時にデフォルトのアドレスにあるフラッシュ ROM からファームウェア イメージをロードします。

RP2040 の最初のハードルは、チェーンされたブートローダー プロセスを理解することです。 昔の起動可能なフロッピー ディスクや PC の HDD/SSD と同様に、外部 QSPI フラッシュ ROM は基本的に MCU によって潜在的な起動デバイスとして扱われます。 第 1 段階のブートローダーは、MCU のブート ROM、アドレス 0x0000 0000 に統合されており、起動時に QSPI インターフェイスをチェックして、そこから 256 バイトをロードしようとします。 これは有効な CRC32 ハッシュの一致がチェックされ、一致する場合は第 2 段階のブートローダーであるとみなされます。

この第 2 段階のブートローダーで実行できることはたくさんありますが、その中には必須のものもあります。 今のところは、同様に SPI ROM を使用するいくつかの有名な STM32 クローン (GigaDevices の「信じられない、本物ではない」STM32 クローンなど) と比較して、RP2040 のこのプロセス全体が複雑であると言うだけで十分です。直感的でなく、十分に文書化されておらず、透明性も低く、多くの障害があります。

STM32 のペリフェラル クロック マネージャーが RP2040 システム アーキテクチャにどのようにマッピングされているかを理解するために、RP2040 データシートを調べたり、尋ねたりするのにかなりの時間がかかりました。 結局のところ、RP2040 のバージョンは RESETS と呼ばれ、基本的に逆に動作します。ブロックのクロックを有効にするには、ブロックのリセット条件の設定を解除する必要があります。 GPIO クロックを有効にするには、RESETS_RESET (PADS_BANK0) のビット 8 を切り替える必要があります。

共有