マイコンの基礎 - メモリマップ
概要
メモリマップとは、マイコンの持っているメモリの位置情報(プログラムエリアやデータエリア等の割り当て)を、アドレスを縦軸にして帯状に記述した図である。
割り当て内容は、各マイコンによって異なる。
ここでは、例として、STマイクロエレクトロニクスのSTM32F4シリーズとSTM8Sシリーズのメモリマップを下図に示す。
製品ごとにデータシート上での表記は異なるが、機能的に分類すると共通項目は以下のようにいくつかある。
- コード
- ユーザープログラムを書き込むエリア
- 内蔵RAM
- 演算の途中経過などを一時的に格納するRAMのエリア(スタックも含む)
- 周辺モジュール用レジスタエリア
- マイコンに搭載されている周辺機能(タイマ、UART、ADC等)レジスタの割り当てエリア
STM32F4は、外部メモリや外部デバイスを接続することができるため、外部RAMと外部デバイス用のエリアを持っている。
また、コアであるCortex-M4用のエリア(プライベート周辺バスなど)も定義されている。
プライベート周辺バス等は、STM8Sの場合は「CPU / デバッグ / 割り込み用レジスタエリア」に相当する。
マイコンの持つ機能でメモリマップに現れている違いは、EEPROMエリアである。
STM8SにはEEPROMが内蔵されているので、EEPROM用にエリアが割り当てられている。
また、STM8のブートベクタまたはブートROMは、STM32F4ではコードエリアに含まれている。
このような細かい点については、各製品のマニュアルを参照する必要がある。
Cortex-M4のメモリマップ
はじめに、STM32F4のコアであるCortex-M4のメモリマップの詳細を下図に示す。
各エリアについて、アドレスの大きい方から順番に簡単に説明する。
例えば、Cortex-M4を搭載しているマイコンは、以下のような共通のメモリマップになる。
しかし、共通となる基本的な構成に対して、各マイコンベンダー特有の機能を盛り込むため、若干扱いが変わる。
- ベンダー固有
- 従来システムと互換性をもつペリフェラルの実装を可能にするためのエリア
- プライベート周辺バス
- システムコンポーネント用のエリア、Cortex-M4のデバッグを実行するCoreSightや割り込み処理を行うNVIC等、Cortex-M4特有のシステム用エリア
- 外部デバイス
- 外部デバイスまたは配列 / ノンバッファが必要な外部メモリへの拡張用エリア
- 外部RAM
- 外付けメモリの拡張用エリア
- 周辺モジュール用レジスタエリア
- マイコンに搭載されている通常の周辺モジュール用レジスタエリア
- 内蔵SRAM
- マイコンの内蔵RAMエリア(スタックエリアも含む)、演算の途中経過などを一時的に格納
- コード
- ユーザプログラム(ファームウェア)の書き込みエリア
STM32F4シリーズのメモリマップ
次に、STM32F4シリーズのSTM32F429を例に挙げて、実際のマイコンではCortex-M4のメモリマップがどのように扱われているかを見る。
下図aがCortex-M4のメモリマップ、下図bがSTM32F429のメモリマップである。
ここでは、アドレスの大きい方から順番に見る。
上図bには、さらに内部バスが扱うアドレス空間も記載されている。マニュアルのブロック図等で、各バスの接続ルートを確認すると、内部構造の理解が深まる。
- ベンダー固有 & プライベート周辺バス
- 前述したように、ここはCortex-M4特有のエリアであるため、STM32F429では特記はなく、Cortex-M4 Internal Peripheralとして記述されている。
- このエリアの詳細については、STM32F429のマニュアルではなく、Cortex-M4やCoreSightのマニュアルを参照する必要がある。
- 外部デバイス
- STM32F429は外部デバイスにアクセスするための機能(FMC:Flexible Memory Controller)を持っている。
- このエリアは、FMCのBlock5とBlock6のアドレス空間に割り当てられている。詳細は、マニュアルのFMCの章に記載されている。
- 外部RAM
- このエリアは、FMCで外部メモリにアクセスするために割り当てられている。FMCのBlock3とBlock4のアドレス空間に割り当てられている。
- こちらも、詳細はマニュアルのFMCの章に記載されている。
- 外部デバイスと外部RAMでは、FMCから出力される制御信号のタイミングが異なる。
- 例えば、外部に市販のSRAMを接続する場合、外部RAMを使用しなければ一般的なSRAMのアクセス信号とタイミングが合わなくなってしまう。
- 周辺モジュール用レジスタエリア
- マイコンに搭載されている通常の周辺モジュール用である。
- 例えば、SPI、USB、UART、タイマやRTC等の周辺機能のレジスタが、このエリアに割り当てられている。
- 割り当てアドレスは、マニュアルまたはデータシートに記載されている。
- 内蔵SRAM
- 内蔵RAMエリアが割り当てられている。スタックエリアもここに含まれる。
- コード
- ユーザープログラムの書き込みエリアであるが、その他にも、例外処理のベクターテーブル、ハードウェアのオプションを設定するオプションバイト、
- ブート用のプログラムがここに割り当てられている。
- 割り当てアドレスは図中に記載されているが、各機能の詳細は、マニュアルまたはデータシートを参照する必要がある。
STM8Sのメモリマップ
次に、STM8Sのメモリマップを説明する。
下図aはSTM8Sシリーズ共通のメモリマップ、下図bは実際の製品であるSTM8S207のメモリマップをデータシートから抜粋したものである。
上記のセクションでは、アドレス空間を比較しやすいようにアドレスの一番小さい0番地を下側に記載したが、
下図bのように、実際の製品のマニュアルでは一番大きいアドレスが下側に記述されている場合もあり、製品によって記載方法は様々である。
こちらは、アドレスの最も大きい番地にコードエリアが割り当てられており、その次に、CPU / デバッグ / 割り込み用レジスタエリアが割り当てられている。
STM32F429と比較すると、コードエリア内に入っていたブートベクタ、ブートROMが独立したアドレスに割り当てられている。
周辺モジュール用レジスタエリアは、STM32F429とアドレスは異なりますが機能は同じである。
また、STM32F429でコードエリア内に入っていたオプションバイトは、独立したアドレスに割り当てられている。
EEPROMエリアはSTM8Sの特徴的な機能である。
最後に、一番小さい番地に内蔵RAMが割り当てられている。
このように、同じマイコンベンダーの製品でも、基本的なアドレス割り付けをはじめ、製品またはシリーズごとに異なっている。
ユーザは各製品のマニュアルまたはデータシートを熟読して、メモリマップの各項目の意味を理解する必要がある。
より複雑なメモリマップ
ここまで説明した製品のメモリマップは、各エリアが直線的に並んでいて、各項目も単純な機能であるため、比較的簡単で理解しやすいものである。
バンク切り替え機能を持つマイコンや仮想記憶機能を持つMPUではより複雑なメモリマップになる。