Top Page Index About Link Mail Form ●このページの応用機器製作します |
STMicroの STM32や NXP LPCシリーズは USART(シリアル)でファームウェアを書き込めたりできるので、その書き込み用兼、シリアルデバッグ用の USBシリアルコンバータを作ってみました。小規模の回路でいろいろ操作する場合はボタンやLED、液晶パネルなどを並べることもありますが、それよりは USARTコネクタ一つつけておいて PCとつなぎ、PC側でターミナルソフトを起動すればかなりのことができます。あと、printf()でデバッグをするオールドタイプ御用達?
画像は大きく見えますが、左側のケーブルは microUSBで、ケースはタカチの SW-53S(53mm x 36mm x 11mm)を使っています。
押ボタンはリセットと、BOOTモードの切り替え用です。これらのボタン操作をして BOOTモードに切り替えてシリアルで書き込みをします。また、書き込み後はシリアルでデバッグやメンテナンスなどを行えます。(プログラム側で対応が必要ですが。)
ターゲット側のコネクタのピン配置は以下の通り。
ピン | 名称 | 備考 |
---|---|---|
1 | TXD | 出力 |
2 | RXD | 入力 |
3 | GND | グランド |
4 | RESET | リセット信号出力 |
5 | BOOT | BOOT信号出力 |
6 | VCC | 電源検出 / 3.3V出力 |
6ピンでターゲット側との接続・電源投入を検出します。電源が入ったら画像左上、左から2番目のLEDが点灯します。ジャンパーピンをショート設定にすると6ピンと基板内の 3.3Vがショートされます。小型の回路で実験する時の電源として利用できます。また、ターゲットとのシリアル接続を TXD/RXD/GNDの3線だけ接続する場合にショートします。
LED、3番目は送信時、4番目は受信時に一瞬点灯します。
内部の基板。FT232RL等の USBシリアル変換専用チップを使わずに STM32F042K6T6を使っています。表に出ない小さい押ボタンスイッチはこのチップ自体の RESET/BOOT0スイッチです。これを押して BOOTモードにすると USB DFU書き込みで自身のファームウェアが変更できます。
TXD/RXD信号のバッファに SN74LV1T126を使っています。入出力トレラント、OFFトレラントで、また、レベル変換の機能があるのでターゲット回路は 1.8V〜5Vに対応します。OFFトレラントなのでターゲットにつないだまま、PCの電源を落としたり USBを抜いたりしても特に問題ありません。また、ターゲット電源を検出してから1秒後に出力バッファを ONにするようにプログラムしてあるので、ターゲット電源を入れたまま、このモジュールをつないでもほぼ問題がありません。稼働中のシステムで問題が起こった時に状態を調べる際、ケーブルをつないだらリセットがかかったりするなどしてターゲットの状態が変わってしまうと困るので。
活線接続で使うことが前提なので、バッファを含め、保護回路をきっちり入れてあります。水晶発振子を使わずに内蔵CR発振で済ませていますが、STM32F042は USB信号のクロックで CR発振周波数の補正が可能でそれを使っています。
→バイナリファイル
→ソースファイル
→ライブラリソースファイル
ソースも公開しておきます。MITライセンス扱いでいいのかな。USBドライバーなどは STMicroのライブラリを使っています。VID, PIDもそのまま。売り物に使うのなら IDを取得するべきでしょうが、自分で作って自分で使う分には問題ないかと。
STMicroのコードなので、Windowsの場合はそれ用のドライバが必要です。Linux系の場合はそのままで /dev/ttyACM0 として認識されると思います。
シリアル(USART)の方は自前でコーディングしてます。今回は DMAを使ってみました。特に受信時は CPU不介在で勝手にバッファにデータが入っていいですね。ただ、USARTにエラーが発生すると DMAが止まるので、エラー発生時に割り込み起動してエラークリアしてます。
あと、「コマンドモード」も実装。ターミナルソフト使用時、1秒以上待ち、+++、1秒以上待ち、の昔のモデム同様のシーケンスでコマンドモードに入ります。コマンド発行して今までの送受信バイト数やエラー発生数、ターゲット電圧など調べたりできます。こんな感じ。
+++ ←入力 # Enter Command Mode info ←入力 Target Power = 3.31 V USART: 115200 bps, 8 bit, parity NON, stop 1 bit Tx Count = 6 TxDMA IRQ = 6 Rx Count = 42902 Rx Error = 0 Parity Error = 0 Framing Error = 0 Noize Detection Error = 0 Overrun Error = 0 Tx Buff Max = 1 / 256 Rx Buff Max = 13 / 256 USB: RecvBuff Max = 1 / 1024 SendBuff Max = 331 / 1024 exit ←入力 # Command Mode Exit
ターゲット電源が切れるかコネクタを抜くかすると自動的にコマンドモードになります。その後またターゲット電源を検出すると自動的に USB-シリアル変換モードとなります。
ターゲット回路につないでいるの図。最近わたしが作る基板は大抵この為のコネクタがついています。STM32の場合、BOOT0ピンは HIGHで BOOTモードになるのでわざわざ論理反転してあります。例えばこれとか。
ちなみに Raspbianには gcc-arm-none-eabi や gcc-avr 、avrdude などのバイナリパッケージが用意されてるので Raspberry Pi上で開発することも可能。synaptic をインストールした後、検索してみるとよい。
$ sudo apt install synaptic