DFU@DW基板
日々忙しくて、なかなか迷路を出してきて作業ができない。
最近は細切れ時間でもできることとして、DW付録基板をいじっている。
stm32はチップ単体で、シリアルローダーで書き込んで、動かしてはみているのだけれど、なにか便利なことは無いかと期待してDFUも試してみる。
考えすぎで遠回りしてしまったけれど、ようやく手作り評価基板のと同じコードで、LEDチカチカが動くようになった。
------
以下、覚書き
------
DWの記事では、DFUは起動時に、ポートの状態を読み、0x08003000にジャンプする、とある。
正確には、0x08003000から普通にベクタテーブルを配置し、規定のベクタ(+0x4)にプログラムのエントリアドレスを記述すればいいみたい。
DFUが0x08003000番地にあるコードを呼ぶような印象を受けるけれど、そうではないようだ。
何も考えずに、普通に0番地から置いておけば起動するコードを、開始アドレス0x08003000にしてリンクしなおし、置いておけばいいだけだ。
DFUがいらなければ、0番地から始まるようにリンカスクリプトを直して、システムブートモードにしてシリアルフラッシュ書き込みで書いてしまえばいいはず。
------
ここまでやってくれるなら、0x08003000からのベクタテーブルに記述したスタックアドレスを反映してくれているかも。
と思って、当該の部分に何も無い空間のアドレスをおいてみると、やはり動かない。
DFUはちゃんと、反映してくれているようだ。
ちゃんとできている。あたりまえか。
------
DFU DEMOは書き込み操作のたびに、オブジェクトを更新してくれるみたいなので、起動しっぱなしでも大丈夫。
DFU File Managerは、Generateボタンを押すだけでは、組み込むオブジェクトを更新しないので、毎回起動するか、度ごとにImageをdeleteして、指定しなおさないといけないらしい。
ちょっと面倒。
------
コードを配置するアドレスは0x08003000でも0x00003000でも、実行に支障は無いけれど、DFUファイルを作る時には、0x08003000に配置しないとFLASH書き込みができない。
プロセッサが、0x08000000からのエリアに対してしか書込み操作ができないことによるものだろう。
実行は0x00003000から行われるようなので、0x08003000から配置されるようなリンカスクリプトを書くのは抵抗があるのだけれど。
気にしすぎか...
ヘキサ形式のオブジェクトはアドレス情報を含んでいるので、DFU File ManagerでのDFUファイルへの組み込み時に、アドレスを変更できないようだ。
そのため、0x08003000から配置するしかなく、やむをえないのか。
オブジェクトは0x00003000から配置されるようにして、HEXやSファイルを作るときに、コード部分だけを0x08003000番地から配置されるように、objcopyにパラーメータを与えてやれば、DFU File Managerの操作時に少しは楽できるかも。
やっぱり、分かりにくいだけかな?
自分では使うときはバイナリで出力しているので、DFU File Managerでアドレスを0x08003000に指定して組み込んでいる。
------
DW記事には、間違えて0x08000000からのアドレスに書き込むと、JTAGデバッガでないと復旧できないとある。
実際にはDFUでは、0x08000000~0x08002FFFのアドレスには、書き込みができないので、DFUを使っている限りは心配しなくてもよさそう。
また、JTAGデバッガが無くても、シリアルでもオブジェクトを書き込めるので、シリアルポートがあれば、DFUの復旧も無理ではなさそうに思える。
JTAGでも書けるだろうけど。
------
ひとまず、DW基板は終了かな。
マウスに使うなら、シリアルとUSBどちらがいいかな?
書き込み時間は、どちらでも大差はないし。
マイクロSDを搭載して、ロガーデータを取り込んで、Windowsからいきなりドライブとして認識できると便利そうだ。
USBシリアルデバイスとしても同時に使えて、いつものコンソールとしても使えるならベストなのだけれど。
複合デバイスとして動かせばできるはずだけれど、エンドポイント個数の制限とかでできないかな?
その場合でも、一番最初のブート(DFU書き込み)のためにJTAGかシリアルポートが接続できるようにしなければならないけど。
------
(追記)
DFUを使う場合、ベクタテーブルオフセットレジスタだけは、自分で指定しなおさないといけないようだ。
SCB->VTOR = 0x00003000;
とやるだけだけど。
| 固定リンク | 0
コメント