Boot Configuration of STM32F4-DISCOVERY.

sorry. japanese only. [はじめに] Discoveryボードを使っていて,少々面倒だなと思うことの一つに,毎回フラッシュROMに 書き込んで実行というのがあると思います。 「折角内蔵SRAMが192KBもあるのに...ちょっと試すぐらいなら,そっちでいいだろ...」 と思った事がある人もいるのではないでしょうか。 ただ,その為にわざわざロード用の仕組みを作ってたりするのも敷居が高いでしょうし, 何よりも気に入ったアプリをフラッシュから消さずに,何とかならんものか...と そこで,ちょっとした改造をして,stm32のブートコンフィグレーションにより,内蔵SRAM 上にあるアプリケーションを実行出来るようにしてみましょう。 まずブートコンフィグレーションとは,リセットやスタンバイからの復帰の際に,BOOT0と PB2(BOOT1)の信号レベルによって,メモリの先頭アドレスにリマップする領域を切り替え 出来る機能です。(Boot0,1の信号レベル毎に以下のようなリマップとなります) BOOT0 BOOT1 リマップ動作  L  * フラッシュROM(0x08000000-)をメモリ先頭アドレス0x00000000にリマップし て起動する。通常のフラッシュROM上のアプリ起動動作モード。  H  L SystemROM(0x1FFF0000-)をメモリ先頭アドレス0x00000000にリマップして, 起動する。STmicro謹製のブートローダが起動するモード。  H  H 内蔵SRAM(0x20000000-)をメモリ先頭アドレス0x00000000にリマップして, 起動する。予め何らかの方法でSRAMにアプリケーションを書いておく必要が あります。ある意味デバッグ用の便利モード。 このリマップ機能を使用することで,リセット直後のベクタテーブル(初期時0x00000000) がリマップされるので,フラッシュROMの内容を書き換えることなく,SRAM上のプログラム 実行が可能となります。 これによってスクラッチ&ビルドの開発で色々試したり,フラッシュの書換え寿命を気に したり,消去などの煩わしさから解放されて,一層お手軽にプログラミングが出来るよう になります。 [改造方法] RAM boot method discoveryボードのRAMブート小改造概要 Discoveryボードでは,PB2(BOOT1)が10kΩのプルアップと510Ωの抵抗でプルダウンされ ており,プルダウン側はSB19というソルダジャンパでGNDに接続されています。このSB19 を取り除いてPB2をプルアップされた状態にしてしまいます。 BOOT0も同様の回路になっていますが,こちらはボードのピンヘッダで隣接するピンにVdd がありますので,ジャンパプラグでこれらのピンを接続することで,容易にHレベルに出来 ます。(改造例は上の写真の通り) Boot0とVddを接続したジャンパピンを取り除けば,従来どおりのフラッシュからの起動に 簡単に戻せます。 Boot0=H,PB2(Boot1)=Hの状態でも通常と同じように,ST-Link utilityが使用できてメモリ の書込みも行えますので,後はリンカスクリプトなどでSRAM上動作への変更をすればOKです。 (リンカスクリプトの例は,サンプルデモのアーカイブを参照してください) 内蔵SRAMへの書込みはフラッシュに比べて,かなり速いのでストレスも減ります。 [OpenOCDを使って改造無しでSRAM上での実行をする] ↓のようなスクリプトを読み込んでおいて,OpenOCDのコマンドでload_run foo.elf等と 実行することで,改造せずともSRAM上にロードして実行することができます。 proc load_elf { loadfile } { # vector table address set vbr 0xe000ed08 # vector address (top of SRAM) set vectaddr 0x20000000 # reset and halt reset halt # set vector table address mww $vbr $vectaddr # load ELF file onto SRAM(0x20000000-) load_image $loadfile return } proc run_sram { } { # vector table address set vbr 0xe000ed08 # vector address (top of SRAM) set vectaddr 0x20000000 # get initial SP and reset handler mem2array vect 32 $vectaddr 2 # display top of vector 4 elements mdw $vectaddr 4 # set initial SP into SP reg sp $vect(0) # set reset handler int PC reg pc $vect(1) # execute now resume return } proc load_run { loadfile } { load_elf $loadfile run_sram return } [サンプルデモ] 内蔵SRAM上で実行するLEDチカチカのサンプルアーカイブ 展開すると,stm32f4dis_demo1とstm32f4dis_demo2というディレクトリ以下にサンプル プロジェクトが展開されますので,make ON_SRAM=YES all により内蔵SRAM上で実行する プログラムがobj/template.hexとして生成されます。 (ON_SRAM変数がYES以外の場合には,フラッシュROM上で実行するプログラムが生成される) [留意すべき点について] フラッシュに比べて内蔵SRAMは容量やアドレスの差異は兎も角,168MHzのフルスピードでも 0waitで実行可能なため,プログラムのデバッグが終わって,フラッシュROM上実行とする 場合には,wait設定やそれに伴う実行速度の差異を留意する必要があります。 サンプルデモでは,フラッシュROMアクセスのwait設定を行っており,waitによるプログ ラム実行速度への処理依存がないようになっています。 [ご注意] ・このページの記載事項については,一切無保証です。
inserted by FC2 system