STM32 FLASH Writer Program Using Python

STM32のFLASHへシリアルポート経由でUSARTを使ってデータを書き込むプログラムを作った. 書き込むデータはモトローラS形式ファイル(.mot)でなければならない. また,書き込み先はFLASHである必要はなく,RAMでもよい.

プログラム言語には,ほとんどOSに依存しないコードにするためにpythonを使った. また,シリアルポートを操作するために,pyserialモジュールを使っている.

プログラム本体

stm32writer ディレクトリの中身が書き込みプログラム(pythonスクリプト)であり, 下記2点は便利に使うためのスクリプトである.それぞれの使い方は後述する.

対応素子

STM32のF1, F2, およびF4シリーズに対応するように努めた.(2012/03/18現在)

しかし,実際に動作確認がとれているのはほんの一部の素子だけである. 当然,新しい素子には対応していない可能性がある. その場合,以下のパラメータ定義ファイルに新しい素子を追加すれば使えるかもしれない.

stm32writer/stm32_prm.py

使用環境構築

python環境とpyserialモジュールがインストールされている必要がある. Windowsの場合,以下の手順でセットアップする.

  1. pythonをインストールする.
  2. pyserialをインストールする.

使用方法1

基本的な使い方は,オプションと書き込むファイルをコマンドライン引数にして "stm32writer/stm32writer.py" を実行すればよい. 例えば,次のように使う.

$ stm32write.py --port=com1 --baudrate=115200 --show-erase-page --compare --go --time filename.mot
各オプションの意味は以下の通りである.

オプション 説明
--port=(PORT) シリアルポートを指定
--baudrate=(RATE) ボーレートを指定
--show-erase-page 消去するページもしくはセクター番号を表示する
--compare 書き込み後,読み込んで元データと比較する
--go 書き込み後,スタートアドレスにジャンプする
--time STM32との接続がとれた瞬間からの経過時間を表示する
書き込み先の領域がFLASHであれば,そのページもしくはセクターは自動で消去するようになっている. この仕様は便利機能であって,通常問題となることはないが,消去したくないページ(セクター)に1byteでも 書き込みが指示されている場合はページ(セクター)内全てのデータが消えるので注意すること.

使用方法2

上記「使用方法1」が基本ではあるが, 毎回オプションを指定するのはあまりに面倒なので, 各オプションをあらかじめ設定したpythonスクリプト(write_main.py, write_static.py)を準備した. 書き込み後TeraTermなどの通信ソフトを起動するようにしている.

環境と目的にあわせてスクリプト内のいくつかの項目を書き換える必要がある.

使い方は以下の通りである.

  1. "STM32program" と合わせて使用するとき,
    mainプログラムを書き込むときは "write_main.py" を, staticプログラムとmainプログラム両方を書き込むときは "write_static.py" を 実行する.
  2. 任意の.motファイルを書き込むとき,
    書き込むファイルを引数として "write_main.py" を実行する. (書き込むファイルを "write_main.py" にドラッグ&ドロップする.)

参考にした情報

本プログラムを作成するにあたって参考にした情報を列挙する.

  1. AN3155, Application note, "USART protocol used in the STM32 bootloader"
  2. AN2606, Application note, "STM32 mecrocontroller system memory boot mode"

1, 2 ともにSTMicroelectronicsのSTM32のページ内のResourcesから入手できる.