組み込みボードSTM32-P407のデバイスドライバについて

ARM CortexM3を載したSTM32-P407(STM32-P407)上で外部SRAMを利用するにあたってデバイスドライバを触った時の経験について纏めてみる。
STM32-P407はLCD、イーサネット、USB、I2Cといった組み込みボードが持つ一般的な入出力機器を備えている評価ボードのようだったので、過去PICマイコンしか触ったことのない組み込み初心者には丁度いいんじゃないかと思い使ってみた。

どれだけのメモリが利用出来るのか

結論から言うと、STM32-P407には外部RAMが搭載されているのだが、これが無いとメモリが不足してプログラムが全く動かないような状態だった。

ベンダのHP(STM32-P407)にあるユーザマニュアルを参照してこの評価ボードで利用可能な記憶領域を確認。

上記の画像はユーザマニュアル中のメモリマップを表す図の一部。
どうやらSTM32-P407ではアドレスが0x10000000から始まる64KBと、0x20000000から始まる128KB(メインRAM)が利用出来るようだ。
またこの他にもアドレスが0x60000000から始まる512KBが外部SRAMとして利用出来るよう。
コンパイル後のバイナリはROMに配置されたCode Segmentに置かれるので、バイナリのサイズはあまり問題にはならなかった。

どうやって使用するのか

メインRAMと0x10000000から始まる64KBは普通に触ることが出来るが、512KBの外部SRAMを使用するためにはいくつかのレジスタの値を変更する必要があるようだった。
そのレジスタを触るためのコードがデバイスドライバにあたる。
STM32-P407のデバイスドライバは以下のページのサンプルに含まれていた。
https://www.olimex.com/Products/ARM/ST/STM32-P407/
STM32-P407 demo packageの
/DemoSoft_STM32-P207_IAR_6.20/modules/ExternalSRAM.h
というファイルがそれだ。

#define EXT_SRAM_BASE_ADDRESS 0x60000000
#define EXT_SRAM_SIZE 0x80000

int ExtSRAM_Initialize(void);
void ExtSRAM_Deinitialize(void);

外部SRAMがメモリにマッピングされている開始アドレスと、そのサイズが書かれていることからも明らかだ。
ExtSRAM_Initializeを呼べば外部SRAMが使用出来るようになる。

このコードの中身がどうなっているかというと、GPIO(General Purpose Input/Output)とFSMC(Flexible Static Memory Controller)のピンを叩いているようだ。
メモリの種類やメモリのバンド幅、書き込み許可などを設定している。

ほんの触り程度だが、デバイスドライバとは何か、どういった動作をしているのか、知ることが出来た気がする。