SNSへはこちら

STM32F042でCMSIS-DAPを作れた

追記(2018/9/30)
USBのD+とD-の接続が逆でした。やはり酒を飲みながら記事を書くべきではないですね。すみません。

ご無沙汰ぶりです。けんきうしつの発表準備に忙殺されていました。すっげえつらい。でもまあ出席してくださった教授2人中2人からお褒めの言葉を頂いたので嬉しかったですねぇ。

さて、今回の記事は STM32F042 の USB を遊んでみた!!...と思ったらなんだか分からないが STM32F042 が CMSIS-DAP になってしまった! ということを書きつけます。

まず STM32F042 ってなんぞ?

ST 社のマイコンで(そりゃそうだ)、コアは Cortex-M0+ となります。なぜこれを取り上げるかなのですが、秋月電子にて取扱があるから というのがめちゃめちゃ大きいからなのです。商品ページは以下。

チップ単体で250円ポッキリ。基板も含めると合計で 330円 で開発ができることになります!
とは言っても「USB シリアル変換とかで別途お金掛かるだろうしなあ」とお思いの方も多いでしょう。しかしこのマイコンはその USB シリアル変換モジュールが不要 というのが大きなメリットなのです。

USB による書き込み

実はこのチップ、USB による DFU 書き込みに対応していて、USB端子直挿しでそのまま書き込むことが出来ます。すごい。大事なことなので強調しますが、電源は VBUS(5V)なので、絶対に絶対に 3.3V までレギュレータで落としてくださいね。これはマジ。いくら 5V トレラントのピンがあるからって電源でやらかしたらこんがりジューシーに焼けます。

接続方法は以下。図で書くのが面倒くさいので表でなんとかしました。ピンは上の秋月で販売している QFP32 のものです。

USBピン マイコンピンNo.
VCC(VBUS) →(3.3Vレギュレータ)→ #1, #5(VDD, VDDA)
D- #21(USB_DM)
D+ #22(USB_DP)
GND #32(GND)

大事なことなので二度言います。VBUS は 3.3V のレギュレータに通してください。5V のままだとマイコンが焼け死んでしまいます。
あと、VBUS-GND 間のセラコンも必須。入れないとめちゃくちゃ発振します。僕は USB 端子のVBUS-GND間を 10uF、レギュレータ直近の Vout-GND 間を 0.1uF とし、接続は安定しています。

使うツールはdfu-util というもの。こちらで書き込みできます。接続したら dfu-util -l で接続されているデバイス一覧を表示して、その後書き込みです。以下に一連の実行結果を示しますね。

$ dfu-util -l                                                                                                                                        [master]
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Deducing device DFU version from functional descriptor length
Found Runtime: [05ac:828f] ver=0137, devnum=4, cfg=1, intf=3, path="20-3", alt=0, name="UNKNOWN", serial="UNKNOWN"
Found DFU: [0483:df11] ver=2200, devnum=13, cfg=1, intf=0, path="20-1", alt=1, name="@Option Bytes  /0x1FFFF800/01*016 e", serial="FFFFFFFEFFFF"
Found DFU: [0483:df11] ver=2200, devnum=13, cfg=1, intf=0, path="20-1", alt=0, name="@Internal Flash  /0x08000000/032*0001Kg", serial="FFFFFFFEFFFF"
$ dfu-util -a 0 -d 0x0483:0xdf11 -s 0x08000000 -D DAP42.bin                                                                                          [master]
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Deducing device DFU version from functional descriptor length
Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash  "
Downloading to address = 0x08000000, size = 15764
Download    [=========================] 100%        15764 bytes
Download done.
File downloaded successfully

ということで、ID は 0x0483:0xdf11 で、プログラムを書き込むには alt が 0 であればいいということになります。0x08000000 はフラッシュ領域の先頭アドレスで、まあ固定でいいです。

F042 の CMSIS-DAP 化

当ブログで CMSIS-DAP とか DapLink とか言うとこことかここのようにLPC11U35を使ったものでした。

いまのところ、この F042 で CMSIS-DAP 化が出来ています。Daplink もやりたいんですが、今のところよく分からん。すみませんね。
さてこの作業は自分でやる、ということはなく、なんとたまたま F042 で CMSIS-DAP を作っている例が見つかりましたので、こちらを拝借することとします。

CMSIS-DAP debugger firmware for STM32F042Fx and STM32F103xx - devanlai/dap42

リンク先のリポジトリを clone してください。このリポジトリは他のリポジトリも含んでいますので、再帰的に clone する必要があります。コマンドは以下。

$ git clone --recursive https://github.com/devanlai/dap42

そんで、ディレクトリ内で make をすれば一撃で完了です。それにしても簡単だ。
終わったら build/DAP42.bin を上のコマンドで焼けばいいんですね。こんな風に。

$ dfu-util -a 0 -d 0x0483:0xdf11 -s 0x08000000 -D build/DAP42.bin

F042 による CMSIS-DAP の使い方

Daplink では無いのでシリアル通信を使いながら SWD をやろうとすると失敗してしまうのですが、そこはご勘弁を。Daplink の登場が待たれます。
電源が不安定で発振していたためでした。電源周りがしっかりしていれば、このファームウェアではちゃんと SWD と USB シリアルの同時接続が可能です。やったね!!

さて接続ピンはここにあるのですが、SOP(SSOP?) によるものです。今回は
QFP なのでまあ面倒くさいでしょうから それ用のピン配置をまたしても表で示しますね。

ピン番号 ピン名
11 SWDIO
12 SWCLK
15 RST
8 RXD
9 TXD

あとは、CMSIS-DAP として使うだけです。通信速度がやや遅い気もしますが、十分でしょう。

以上になります。これでSTM32 を STM32 でデバッグするという謎の行為が可能になりますね。実際これでデバッガアダプタを作るということを検討されると良いと思いますよ。マイコン本体 250 円。その他端子を合わせてもかなりの低価格で基板構成が可能なのではないでしょうか。

また、この F042 の USB 機能をコンポジットの2ポートで利用した記事が後日AT Noteに記事が出るようなのでこちらもどうぞ。後日ですよ。

コメント

  1. じゅんじゅん より:

    はじめまして。
    おかげさまで、STM32F042にDFUで書き込むことができました。
    こんなに便利な機能なのに、このマイコンでの情報がほとんど無くて・・・
    STM公式のAN2606読むとこのマイコンではDPのプルアップが要るのか要らないのか
    よくわからなかったのですが、この記事のおかげで吹っ切れました。(要らない)
    WindowsでDfuSeでがんばってたのですが、書き込めたようで実際は書き込めておらず、
    (BOOT0[#31]ピンをLにして通常起動させたつもりなのにDFUで立ち上がってくる)
    2日ぐらい悩んでたのですが、dfu-utilであっさり解決。
    本当にありがとうございました!

    僭越ながら・・・#21(USB_DP)、#22(USB_DM)は、#21(USB_DM)、#22(USB_DP)
    ですね。

    • shima-529 より:

      マイコン動作、おめでとうございます。
      僕も手探りで色々やりながら記事にしていましたが、お役に立てて嬉しいです。
      というかアプリケーションノートあったんですね(サボって調べていないだけ)。以後参考にします。

      ピン配置ですが・・・ご指摘の通り間違ってますね。こっそり修正しておきます(笑)