DATE: 2019/05/19(日)   CATEGORY: 未分類
Nucleo32F303k8でJ-LinkRTTを使ってUARTピンを節約してみた

お久しぶりです。
今日は久しぶりにブログを書きたいと思います。
内容はタイトルの通りです。

以前から書いていたNucleo32マウスと直接関係はありません。
しかし、初心者の人でもわかるような内容だと思います。
→自分も初歩的な部分しかわかってないから


実はNucleo-32Boardの書き込みは
SWDという形式でST-Linkというデバッガを用いて行われています。
SWDの詳しい説明は自分もわからない部分があるのでできませんが、

・SWDIO…データ通信線
・SWCLK…クロック
・VTref…ターゲット電圧(マイコンの動作電圧)
・GND…グランド
・nRESET…リセット
・SWO…いろいろ出力できる追加機能。(オプションなので無くてもよい)
(SWOの働きについてわかりやすいと思った資料はこちら)

の6本があると思っといてください。
上のリンクを読めばわかるのですが、
SWOを経由すればITMという機能でSWVターミナルにprintfを用いた出力が可能です。
(他にもいろいろできます)

これは「SWOでITMを使えばUARTでターミナルに出力をしなくてもよい」ってことです。
加えて、より多くの機能も増えるということで楽しいことばかりです。
じゃあNucleo-32でもSWOでITMを使ってみよう!と思った、あなた。
残念ながら、Nucleo-32ではSWOは接続されてないんですね(´;ω;`)

SWOだけ仲間はずれ

必須ではないことから、32ピンと少ないピン数のマイコン
なので割り当てられてないのでしょうか?
ジャンパ用の0Ω抵抗で繋げられれば良かったのですが、残念です、、、

そんな悲しみの中にいたときに、
某🍡くんというお方に助け船をいただきました。

それがSEGGER社のJ-LinkというデバッガでのRTTという機能です。
Real-Time Transfer | SEGGER - The Embedded Experts

こちらを使うとSWDIO経由でターミナルにprintfで出せるようです。
→RTTの存在自体は知っていたのですがSWDIO経由で出せるのは知りませんでした
また、容量に限りはあるがバッファに書き込むため後でまとめてデータを吐き出せます。

これの何がすごいかというと、
「UARTやSWOなどのターミナルへ出力用のピンが必要なくなります。」
つまり、一つ自由に使えるピンが増えるということです。

Nucleo32F303k8ではPA2がTX、PA15がRXとして使われています。
特にPA2は貴重なAD変換が可能なピンです。
これらのピンを自由に使えてピンアサインの自由度が上がるのは素晴らしいですね。
(適宜ジャンパ用の抵抗を外すことは忘れずに)


ということでNucleo32を使ってRTTに挑戦した備忘録を残しておきます。
まだまだわからないことも多いので、
こいつ知らなそうだなってとこがあれば教えてください。

参考にした記事はこちら
TrueStudioでJ-Link RTTを使う -Dango Kajero
超便利 最強デバッガ J-Link -id研


・必要な物

ここから以下の2つをDLします
J-Link / J-Trace Downloads -SEGGER

① ST-Link Reflash Utility
→Nucleo上のST-LinkをJ-Link化する。ST-Linkにも戻せます。
② J-Link Software and Documentation Pack
→いろいろ便利なものが入っています。全部は触っていないので不明な物も多いです。


・NucleoのST-LinkをJ-Link化

①の中のST-Link Reflash.exeを用いてJ-Link化します。
J-Link化前はデバイスマネージャーから確認するとST-Linkになっています。

STLinkの確認

ST-Link Reflashの使い方は説明する部分がほとんどありません。
Accept数回して、Upgrade to J-Linkをやれば終わりです。

STLinkReflesh.png

J-Link化後はデバイスマネージャーから確認するとJ-Linkになっています。

JLinkの確認


・デバッグの構成をJ-Linkに変更

TrueSTUDIOのデバッグの構成から以下の通りにしました。
デバッグの構成


・SEGGERのRTT APIを使えるようにする

②でダウンロードしたJLink_Windows_V644g.exeを起動していろいろ入れます。
C:\Program Files (x86)\SEGGER\JLink_V644g\Samples\RTTの中にある
SEGGER_RTT_V644g.zipをどっかに解凍します。
解凍したSEGGER_RTT_V644g\RTTの
・SEGGER_RTT.c
・SEGGER_RTT_printf.c
・SEGGER_RTT.h
・SEGGER_RTT_Conf.h

を自分のプロジェクトにコピーなりインポートしたりします。

APIセット

SEGGER_RTT.hをインクルードし、
SEGGER_RTT_V644g\ExamplesのMain_RTT_PrintfTest.cを参考に
テストプログラムを作成したら書き込みができるかチェックします。
printftest.png


・JLink RTT Viewerにて出力の確認

C:\Program Files (x86)\SEGGER\JLink_V644gの中にある
JLinkRTTViewer.exeを起動します。
以下のような接続確認の後に無事に、
テストコードのように出力されたらOKです。

RTTViewer接続確認
Viewer出力確認


・printfに組み込む

syscalls.cにある_write関数を以下のように書き換えます。
syscalls.cにもSEGGER_RTT.hのインクルードを忘れずに行います。


int _write(int32_t file, uint8_t *ptr, int32_t len) {
/* Implement your write code here, this is used by puts and printf for example */
/* return len; */

// int DataIdx;
//
// for (DataIdx = 0; DataIdx < len; DataIdx++) {
// HAL_UART_Transmit(&huart2, ptr++, 1, 1);
// }
(void) file; /* Not used, avoid warning */
SEGGER_RTT_Write(0, ptr, len);
return len;
}


また、%f形式でも出力できるようにLinkerの設定から
「-u _printf_float」が有効かを確認します。
これでprintf関数の出力をRTTで行えるようになりました。


・その他いろいろについて

APIの関数の扱い方、RTT Viewerの扱い方の他にも
J-Linkに関する様々な物のマニュアルは
C:\Program Files (x86)\SEGGER\JLink_V644g\Doc\Manualsの中の
「UM08001_JLink.pdf」を見れば良さそうです。
RTT Viewerはターミナルへの出力をログにして出せたり、
文字の制御コード(エスケープシーケンス)に対応していたりして扱いやすいです。

迷路確認


・なんだかんだで

無事に以前やっていたことはRTTでできるようになりました。
UARTモジュールからRTT APIに変更したら
プログラムの容量が減ったことも嬉しかったです。
ただ、たまに制御コードが反映されず
ゴミデータ的に入り込んでしまう場合もあったりするといった現象もありました。

しかし、全体的にプラスの面が多かったので
これからはRTTを使っていこうと思います。
まだまだ勉強不足ですので
新しい発見があればまた記事に残していきたいです。

スポンサーサイト
Copyright © うむ夫の歩み. all rights reserved.