FriskSDRですが、部品が揃ってきたので組み立てを開始しました。組み立ては段階を踏んで動作確認しながら行います。実際には時間のかかる作業はソフトウェアですので、今回はその手前まで行います。
まずは何はなくても電源です。USBマイクロBコネクタとレギュレータですので簡単です。マイクロBを使うのは初めてだったのですが、mini-Bに比べてちょっと扱いが難しく、機械的に弱いです。スマホ等で剥がれる事例を散見しましたが、さもありなん。位置合わせの突起があることに気付いておらず、基板側に穴を開け忘れました。とりあえず突起を削って対処します。
続いてクロック源のSi5351Aです。今回はこれを使ってみたいがために始めたプロジェクトです。25MHzの水晶として3225サイズ(3.2x2.5mm)を使いましたが、チップが薄くてハンダ付けしにくいです。厚い水晶だと側面に金メッキされたくぼみがあり付け易いのですが、使った水晶はこれがほとんどありません。またパッドサイズもギリギリのため、ハンダゴテを当てるスペースがありません。手ハンダするならパッドをもう少し大きくしておくべきでした。裏面にハンダメッキしてから確実に取り付けます。Si5351Aやパスコン、そしてついでにジョンソンカウンタのAHC74を取り付けます。
上の写真はこの段階でテストしたものです。Si5351Aモジュールを試したときのブレッドボードがありましたのでこれをそのまま使い、基板からI2Cと電源の4本の線を引き出して接続します。そして電源を入れてみればArduino(Pro Micro)からI2Cでコマンドが送り込まれます。無事に発振することを確認できました。
MCUが届いていなかったので、他のチップを取り付けてしまいました。アナログスイッチTS5A23157は今回初めて使ってみます。I2SコーデックはおなじみのTLV320AIC3204です。ヘッドフォンに接続するためのキャパシタはアルミ電解だと大きくて(6mm角)サイズが厳しかったので、タンタルにしてみました。これなら3220サイズで済みます。いろいろご意見はあるかと思いますが、電源もタンタルです。あとは1:4トランスはMiniCircuitのTC4-1です。コスト的な問題と、正負のバランスがこれに依存してしまうのとで悩ましいところです。この段階が下の写真です。
この段階でちょうど良いタイミングでMCUが届きました。48ピン、72MHz Cortex-M4のSTM32F303CBT6です。QFPの取り付けは簡単ですのでさくっとやってしまいます。さていよいよブートしてみます。BOOT0ピンをHにするとブートローダが起動するはずです。ジャンパワイヤを差し込んでプルアップし、USBから電源を投入します。
ところがDFUが動作しないのです。んーと思ってデータシートを確認してみると、USBのブートローダ(DFU=Device Firmware Updateという標準です)が動作するためには、二つ足りないものがありました。
今回のボードは、MCU用には水晶を取り付けず、Si5351Aから供給するつもりでいました。なので、パワーオン時はSTM32内のRCオシレータで起動させた後、I2Cでコマンドを送ってSi5351Aでクロック生成を開始する必要があります。DFUを動作させるためにはあらかじめHSE(High Speed External)からクロックを供給する必要があります。もう一つはD+を1.5kΩでプルアップしておく必要があります。これらのことは常識的なことなのですが、実はこのボードを設計した時、STM32F072を試用していたのですが、このチップはクロックとプルアップが無くてもDFUを動作させることが可能なのです。新しめのSTM32チップでは、だんだんと気の利いた機能が用意されるようになってきており大変便利なのですが、STM32F303もそうだと勘違いしていたのでした。
DFUはうまくいかないことが明らかになったので、他の作戦を考えます。ブートローダはシリアルでも使うことが可能です。ツールはWindows用が提供されています。ところがこれも試してみたのですがうまくいきません(F072では実績があります)。
次善の策としてST-Link2というSTMのデバッグアダプタを用意してあったので、これで確認してみたところ無事動作を確認できました。こんなこともあろうかと、JTAG/SWD用の50mil 10ピンのパタンを用意してあったので、ここからSWDの信号を引き出して、ST-Link2に接続します。便利のため電源もST-Link2から供給するようにしました。下の写真ではBOOT0のジャンパを付けていますが、ST-Link2を使うだけなら不要です。ST-LINK V2と書かれているのがST-Link2アダプタで、安価に入手可能です。実はわざわざ購入しなくても、ST-Link2はNUCLEOにも搭載されてますので、これを使うことも可能です。ST-Link2/1とちょっとバージョンが違うのですが、ドライブとしてマウントし書き込むことができとても便利です。ST-Link2の左に付いているのは、電圧電流を確認できるアダプタです。動作状態がモニタできるのでこれも便利です。こちらも安価に入手可能です。
ST-Link2をOSX/Linuxで使うために、st-utilというツールをインストールしておきます。OSXではbrewでインストール可能です。
$ brew install st-link
ST-Link2が接続されている状態で、st-infoコマンドを–chipidというオプションを付けて実行します。MCUへのアクセスが成功すると0x0422と表示されます。
$ st-info --chipid
0x0422
もし接続がうまくいっていないと何も表示されません。
接続がうまくいったなら、今度はst-utilコマンドを実行します。
$ st-util
2016-03-21T16:23:45 INFO src/stlink-common.c: Loading device parameters....
2016-03-21T16:23:45 INFO src/stlink-common.c: Device connected is: F3 device, id 0x10036422
2016-03-21T16:23:45 INFO src/stlink-common.c: SRAM size: 0xa000 bytes (40 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 2048 bytes
2016-03-21T16:23:45 INFO gdbserver/gdb-server.c: Chip ID is 00000422, Core ID is 2ba01477
2016-03-21T16:23:45 INFO gdbserver/gdb-server.c: Target voltage is 3525 mV
2016-03-21T16:23:45 INFO gdbserver/gdb-server.c: Listening at \*:4242...
デバッガからの待ち受け状態になりますので、ここでgdbを起動します。arm-none-eabi-というプリフィクスの付いたツール類が必要です。ARM用のGCCをインストールするか、EclipseまたはLPCxpressoに含まれているツールを使うことも可能です。パスを通っていることが確認できたら、gdbを起動します。
$ arm-none-eabi-gdb
gdbのプロンプトに下記のコマンドでst-utilに接続します。
(gdb) target extended-remote :4242
接続するとst-util側にも反応があるはずです。
あとはメモリを確認したり、バイナリをロードしたり何でも可能です。
ここまでできたら後はソフトウェアです。ここからが本番ですが、また記事を改めることにします。
方針としてはRTOSとしてChibiOSを使ってみる予定です。F072で試した時はUSB-CDCを使えていたので、今回のボードもまずはこれを目指します。
この方針で作業開始していますが、まずはChibiOSをこのボード用に最低限のポーティングしました。そして、ここからが難航したのですがI2CでSi5351Aを動作させることができています。これでUSBを動かせるはずですのえ、CDCとDFUを動かせたらあとはかなりラクになるはずです。
リファレンス
- ChibiOS https://www.chibios.org/dokuwiki/doku.php
- ST-LinkをLinuxから使うためのコマンドst-link https://github.com/texane/stlink