STM32のフラッシュプログラミング

当記事の内容はもう古すぎるのでこちらを参照してください。





…あづい…あづいですね…まだ5月なのに〜…
まぁおかげでバイト帰りのいなちゃんの汗n





CQ-STARMは最初からUSB経由でファームウエアのアップロードができる
DFUというプログラムが書きこまれているため、外部のプログラマーが
必要ないのが特徴です。

その代り、開発に際してプログラム開始位置は0x08000000->0x08003000
からになる。という制約を受けます。
DFUを使用してアプリケーションを作るときは、0x08003000からプログラムが
スタートするように考慮しなければなりません。DFUのプログラムは
0x08003000に決め打ちですっ飛んで行きますので。
(この辺AVRだと楽なんですよね〜、ブート領域がメモリの後方にあって
ヒューズビットでいつでもスイッチできるからアプリの方はプログラム
メモリ容量以外は何も考えなくていいという)

考慮の方法は以下の2点です。
1.ソースコード内の割り込みベクタのアドレスを
0x08000000->0x08003000にする。
2.リンカスクリプト内のスタートアドレスを
0x08000000->0x08003000にする。
デバッグはDFU経由で書いて本ちゃんはまっさらからスタートしたい、
もしくはDFUなんていらんという人もいるでしょう。そういう時こんなの
いちいち書き変えてたらめんどいのでmakefileの記述で一発で切り替え
できるようにしちゃいましょう。

1.の部分、こんな感じで
2.の部分、ここをこうして
最後にmakeで切り替えられるようにする

と後あと楽です。ケアレスミスもなくなりますし。
以前のMassStorageClassDemoにもこれを適用していますので詳しくはこちらをご参照ください。
(RAMスタートの記述も形だけあるけど未サポートです。)

ちなみにCQ-STARMでDFUを使う場合、USBディスコネクトの回路を追加して
いると「Leave DFU mode」が正しく動くようになります…ってこれが当たり前か。
DFUなぞ使わないという人にはJTAGで書く方法とシリアルで書く方法が
あります。今回はシリアルで書く方法を紹介します。JTAGは次回にでも。

STM32はオンチップフラッシュROM、オンチップSRAM、オンチップのシステム
メモリの3種のブートモードをサポートしていて,DFUや通常のアプリは
フラッシュROM、RAMスタート時はオンチップSRAM、そしてSERIAL経由で
STM32のフラッシュを書き換えたい時はシステムメモリからの起動を選択できます。

JTAGあるしシリアルなんていらんジャンなんていう人もいると思いますが、
変なプログラムを書きこんでしまってJTAGが一切アクセス不可能に陥った
場合、強力な回復手段となるので、このモードがあるというくらいは
覚えておいてくださいね。

私はフラッシュ、システムメモリの2つのブートモードが選択できる
ように拡張基板にタクトスイッチを追加しました。どことどこを繋ぐかはこんなかんじで
シリアルは、USB-SERIAL変換のICしか使う気がないのでレベル変換かまさ
ずにTTLレベルのままで置いときました。
USB-SERIALのユニットはCP2102使って、TTLレベルでRxD,TxD,GNDの3つだけ
しか使わない凄く小さいのを
一つ作っておくと使い回しが効いて楽です。

用意ができたらBOOT0をVCCに吊ったままリセットを解除してシステムメモリ
からの起動を行います。その後PCにインストールしたFlashLoaderDemonstratorを起動します。USB-SERIALが繋がってる仮想COMポートを選択し、正常に通信ができていれば
こういう画面になります。そっからはフラッシュを消したり読んだり
書き替えたりプロテクト掛けたりと自由自在です。
CQ-STARMを仮想COMポートに化かしてももちろん行けます。基板2つもってる人は
一方を仮想COMポートにして試してみるよいでしょう。



おっと言い忘れてた、毎度毎度のことですが、自己責任でどうぞ!

Comments

Post a Comment








Go to top of page