COM portからSTM8S discoveryのFLASHを焼けるか?

STM8S-discovery で何個も工作していると、たった\750の基板だけれど、もっと安く入手できないかと思うようになってきます.

とりわけ、わたしの場合、ホストPCとのインターフェースとして、FT232RLをつかったCOMポート経由で行う仕組みを好んで使っているので、秋月電子のUSBシリアル基板(\950)もペアで購入しているわけです.しかも、開発が終わったら、STM8S-discoveryの半分を占めるSTM32Fの部分は捨てちゃうわけです.な〜んかお金がもったいない気分.

そこで、STM8S+FT232RLが載った基板を自作したくなってきます.この自作基板には、STM8S discoveryに載っているSTM32Fは載せません.ゆえに、STM32Fが果たしていた、USB通信+FLASH焼き+デバッガの3役のうち、FLASH焼きとデバッガをどうするか決めなければなりません.デバッガはあきらめるとしても、FLASH焼きは必須です.



FLASH焼きの代替手段について、STMicro社のdocument UM0560 14798.pdf を読んでみると、FLASH焼き機能を、UARTあるいはSPIあるいはI2C インターフェースで実現する手段がちゃんと用意されていることがわかりました.

そのキモとなるプログラムを、ブートローダコード (zip) と呼び、STM8Sを買ったときにすでにブートローダコードが6000H番地以降に焼かれて売られています.(そうじゃないとウンともスンとも言わなくなってしまう)   リセット後のSTM8Sでは、いつも6000H番地から実行されますので、必ず最初にブートローダコードが走ります.

ブートローダコードはつぎの3つの行動のどれかをします.

1) STM82内部FLASHが空っぽだったら、FLASH書き込み操作されないかなぁと永久に待ちます.FLASHが空っぽかどうかの判断根拠は、リセットベクタである8000H番地=82HでもACHでもない場合に空っぽだと判断します.

2) STM8S内部FLASHにプログラムが書かれていて、かつ、{487EH番地,487FH番地}=55AAH だったら、FLASH書き込み操作されないかなぁと1秒間だけ待ちます.FLASH書き込み操作とは、UART, SPI, I2C経由で書き込みコマンドが来るかどうかが判断根拠です.この487EHと487FH番地はなにかというと、STM8Sのペリフェラルの機能を定義するオプションバイトと呼ばれる不揮発性のメモリの一部です.487EH番地,487FH番地は、ブートローダコードがFLASH書き込み待ちするかどうかを決めます.STM8S discoveryの購入時は、boot loader disableになっています.   (boot loader enableにする方法は後述します)

3)1でも2でもなかった時には、8000Hのリセットベクタに飛んで、アプリプログラムに制御を明け渡します.STM8Sには、裏のリセットベクタ6000Hと、表のリセットベクタ8000Hの2つあるというわけです.

したがって、STM8S discoveryのブートローダコードの行動は、いつも3番なわけです.なので、買ったばかりのSTM8S discoveryの場合は、SWIM経由でのFLASH焼きならできますが、UART, SPI, I2C経由ではFLASH焼きできないという仕様になっているわけです.  (下図ケースA)

ですが、今わたしは、STM8S discoveryに、2番の行動をさせたいわけです.そのためには、SWIM経由で、オプションバイトを書き換えて、boot loader enableにしなければなりません.  (下図ケースAの赤枠)    その やりかたはこちら です.boot loader enable にした場合の副作用は、リセット後の起動時間が1秒多くかかることだけですので、大きな問題は生じません.

STM8Sのいろいろな状態別に対処方法をまとめるとこうなります.
howto-start-auto-loader.jpg


さて、ブートローダコードの行動を、2になるようにできたとして、その後の手順はどうなるのか?

STMicroが提供する Flash loader demonstrator というプログラムで、ホストPCから、UART経由でFLASHを焼くことができますので、その手順を以下で説明します.

●Flash loader demonstrator ver2.2.0 のプログラムは こちらからDL (zip)します.
説明書は、 UM0462 13916.pdf なのですが、どうも2010.8現在のver2.2.0の動作とは食い違っているようで、さりげなく無視して、以下の手順に従うことをオススメします.

●インストールは適宜やってください

●STM8S discoveryに、下記の写真のように、FT232RLを利用したUSBシリアル変換回路を取りつけておきます.参考回路はこちら です.(ちょっと違うんだけどね)    写真の左側のUSBコネクタが、COMポート経由でホストPCと通信するところです.このコネクタを通じて、STM8SのFLASH焼きをするのが目標です.  (ちなみに、右側のUSBコネクタは、SWIM経由でFLASH焼きするところです)
また、後述する理由で、リセットのためのプッシュSWも取りつけてあります.(回路図に描いてありません)
STM32Fの基板につけたトグルSWは、SB1とSB2を切断するためのSWです.(回路図に描いてありません)
左側のUSBコネクタとホストPCをつないでください.
photo1.jpg


●Flash loader demonstrator を起動します.
下記のように設定を選びます.
COMポートネームは、プルダウンメニューから、最も大きなナンバーのを選べばたぶん当たります.
ボーレートは、115200でなくても良く、ブートローダコードが4800〜115200まで自動追従してくれます.
Echo Modeを選ぶところがver2.2.0のミソのようです.ここが、STMicro UM0462の解説と異なるところで、UM0462ではDisabledにせよ、と書かれていますが、それは無視してください.
flash-loader-demo1.jpg


●いよいよ、STM8SのブートローダコードとホストPCを、UART経由で通信確立させます.

ここに、克服するにはかなりの工夫を要するコツがあります.それは、Flash loader demonstrator と STM8Sをほぼ同時に起動させなくてはいけない、ということです.こういう手順を踏まなければなければなりません.

STM8Sをリセットする   →   STM8Sのリセットを解除する  →  0.5秒待って  →  Flash loader demonstrator の Next ボタンを押す

なんで0.5秒なのか? それは、ブートローダコードの仕様が、FLASH書き込みコマンドが来るかどうかを待つのがリセット解除後1秒間しか待たないという仕様だからです.

ですが、リセット解除後0.5秒でNextボタンを押すという動作は、とてもじゃないけど、USBコネクタを抜き差ししたのでは対応できません.そこで、わたしは、STM8SのNRST端子(pin1)にプッシュSWを取りつけました.それが、上記の写真のプッシュSWの存在理由です.

Flash loader demonstrator の Next ボタンを押すと、次のwarningが出ますが、OKを押してください.
flash-loader-demo2.jpg


●下記の画面が現れます.STM8SのFLASHは32kBなので、TargetをSTM8_32Kにします.
flash-loader-demo3.jpg


●Nextボタンを押すと、どのメモリセグメントを読み書きしますか?を聞いてきます.とりあえず全部セレクトでOKしちゃいましょう.
flash-loader-demo4.jpg


●まずためしに、STM8SのFLASHを全部吸い出してみましょう.
Upload from deviceをチェックし、ファイル名を指定します.
flash-loader-demo5.jpg


●Nextを押すと吸い出しが始まります.しかし、なぜか吸い出しはとても遅いです.
flash-loader-demo6.jpg


●8分14秒もかかって、ようやく33kBの吸い出しが終わりました.なんで遅いのかは不明です.
flash-loader-demo7.jpg


●吸い出した.hexファイルの例はこんなです.8000H番地付近.
:208000008200847F820098CE820098CE820098CE820098CE820098CE820098CE820098CE83
:20802000820098CE820098CE820098CE820098CE820098CE820098CE820098CE82008B0ECD
:20804000820098CE820098DD820098CE820098CE820098CE820098CE820098CE820098CED1
:20806000820098CE820098CE820098CE820098CE820098CE820098CE820098CE820098CEC0


●次に、吸い出した.hexファイルをもうちどSTM8Sに上書きしてみます.
こんどは、Download to device をチェックし、ファイルを選択します.
時間がかかるのでVerify after downloadにはチェックしませんでした.
flash-loader-demo8.jpg


●Nextを押すとFLASH焼きが始まりますが、焼くときはとても早く、たった18秒で終わりました.
Closeを押して終了します.
flash-loader-demo9.jpg


●STM8S discoveryに取りつけたリセットボタンを押して離すと、いま焼いたユーザープログラムが走ります.
ちゃんと、UART経由でFLASHを焼けたことがわかりました.



release 2010.8

inserted by FC2 system