STM32F103にプログラムを書き込んだり、デバッグするのにST-LINKを使用してます。Blue Pillボードは、書き込み/デバッグ用にVCC, GND,DIO,CLKの4ピンが用意されています。デバッグしているときにコンソールにprintfで出力したい時もありますよね? そんな時は、UARTやUSBからシリアルで出力したりとかしていますよね。
でも、ST-LINKに付いているSWOを使えば、printfでSTM32CubeIDEのコンソールに直接出力できます。
ただし、AliExpressなどで売っている¥200程度の中華版ST-LINKはSWOが無いため使えませんのでご注意を。ST純正デバッガST-LINKを使ってください。多分、DiscoveryボードなどについてるST-LINKでも使えると思います(未確認)。ST純正(の格好をしている?)デバッガST-LINK/V2も¥1,000以下で買えますので、それでも良いと思います。
- STM32F103C8T6の場合、SWOはPB3です。STM32CubeIDEのMXを使ってPB3ポートのプロパティをSYS_JTDO_TRACESWOにします。
- メニューの「Debug Configuration…」を開き、以下の通り設定します。デバッグプローブ: ST-LINK GDB server
インターフェース: SWD を選択し、シリアル ワイヤ ビューア(SWV)を有効にします。
コアクロック:STM32F103C8T6のクロック周波数を設定します。(標準の8MHz XTALを使っていれば最高周波数は72MHzです) - デバッグを開始します
SWV ITM Data Consoleを表示させます。
Window → Show View → SWV → SWV ITM Data Console を選択し、デバッグウィンドウに SWV ITM Data Consoleを表示します。 - デバッグウィンドウのSWV ITM Data Console のタブを選んで、横にある設定アイコン(ドライバとスパナ)をクリックします。
「ITM Stimulusポート」の「0」をチェックします。 - デバッガでプログラムを実行する前に、
SWV ITM Data Consoleタブを選んで横にある赤●ボタンを押します。
「実行する前」に赤●ボタンを押さないとダメですよ。 - プログラム内のprintf()が実行され、SWV ITM Data consoleに出力されます。 上の例では、printf()の代わりにtiny_printf()を使用しています。
- FreeRTOSでは、標準のprintf()はメモリの消費が大きいためか、正常に動作しませんでした。FreeRTOSにポーティングされた printf-stdarg.c のtiny_printf()を使いました。
SWOから出力させるように、vOutputChar()にITM_SendChar(cChar);を追加します。
1 2 3 4 5 6 7 |
#include <stm32f1xx.h> void vOutputChar( const char cChar, const TickType_t xTicksToWait ) { /* Eg. send a byte to the UART. */ ITM_SendChar(cChar); } |
1 2 3 4 5 |
/* * Return 1 for readable, 2 for writeable, 3 for both. * Function must be provided by the application. */ BaseType_t xApplicationMemoryPermissions( uint32_t aAddress ); |
この関数も自前で作る必要があります。
コメントに書いてあるように、読み出しできるアドレスは「1」を、書き込みできるアドレスは「2」を、読み書きできるアドレスの場合は「3」を返すようにします。
これで、STM32CubeIDEのコンソールに文字や変数値を出力できるようになり、デバッグにとても便利です。