STM32CubeProgrammerのSWV(Serial Wire Viewer)でSWO(Serial Wire Output)を覗く


ちょっと前に、STM32CubeProgrammerでSWOが表示できるようになったらしい。

SWO viewer for STM32CubeProgrammer?

やってみよう。


マイコン側では

inline void ITM_SendStr(const char *str)
{
    while (*str)
    {
        ITM_SendChar(*str++);
    }
}

のような関数を作り、ITM_SendStr("hello world\n");のようにすれば文字列を出力できる。

GUIの場合は、画面をポチポチしたら見える。

CLIで使う場合は以下のような感じで起動する(bashの場合とcmdの場合)。

"/mnt/c/Program Files/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin/STM32_Programmer_CLI.exe" -c port=SWD mode=hotplug -swv freq=168 portnumber=0
"C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe" -c port=SWD mode=hotplug -swv freq=168 portnumber=0

SWOにはSWDが必要だが、SWOを指定したからと言ってSWDの指定が不要になるわけではない。
mode=hotplugを指定しないとSWD接続時にリセットがかかるので注意。逆に、起動直後から見たいなら指定しないでリセットしてもいい。

SWVモードに入っても直ちにビューアが起動するわけではなく、rキーを入力してreseptionを開始する必要がある。また、sを押せば受信を中止し、rで再開できる。他に、eを押すとSTM32_Programmer_CLI.exeを終了できる。
このrの入力を省略する方法は今の所存在しないようだ(たとえばecho r|"/mnt/c/Program Files/(以下略のようにすると、SWD接続を確立した段階でハングアップする)。

STM32_Programmer_CLI.exe -c port=SWD -d build/*.hex -s -swv freq=168 portnumber=0のようにすれば、HEXの書き込みを行ってから直ちにSWVを起動することもできるが、やはりrの入力が必要になる(rの入力は、人間の反射速度であれば任意のタイミングでいい)。

自動で受信を開始してくれればコマンド1発で書き込みからビューア起動までできて便利なのだが。

なお、SWVで受信した内容はすべて$USER_HOME/STMicroelectronics/STM32Programmer/SWV_Log/swv.logにログが残る。セキュアな情報を流すときは要注意(そんな使い方するやつがいるかは別として)。ヘルプファイルにはログファイルを変更できると書いてあるんだけど、使い方はわからなかった。全部swv.logに追記されるっぽい。


ちなみに、SWOの通信プロトコルは、なんの変哲もない2MbaudのUARTらしい。

SWOは文字列の出力以外にもいくつかの機能があるので、用途に応じて01hのヘッダが変化するんであろう。文字1バイトにヘッダが1バイトついているので、実効速度は1Mbaud程度になる。通信速度はそれほど早くない(一般的なUARTやI2CやCANよりは早いけど)。FIFOとかも入ってはいないだろうし、ITM_SendStrは文字数に応じて(1文字あたり10マイクロ秒くらい)プログラムがブロックされる。タイミングクリティカルな部分だと「printfを入れると動く」みたいな事象になる可能性がある。

例えばSPIであれば21Mbit/s(SPI1@168MHzコア)で通信できるし、STLINK-V3ならUARTで15Mbaudの通信ができるので、SWOより26倍や15倍の速度で通信ができる(さらに、SPIなら4byteまではほぼノーウェイトで転送できる)。

正直、SWOをprintfの出力として使うのは、ペリフェラル初期化コードが不要以外のメリットが見えない(そして、ペリフェラルの初期化は難しいことではない)。
他の機能と組み合わせたらプロファイラみたいな使い方とかできるのかな?

追記

SWOは最大で100Mbaudオーダーの速度で通信できるらしい。2MbaudはST-Linkの都合らしい。今後サポートが拡充されればさらに高速な通信ができるようになるかも。