TrueSTUDIO for STM32を動かしてみた

最近STMicro社が買収して、無料で配布されるようになったIDE「Atollic TrueSTUDIO for STM32」を動かしてみました。
買収により、「Pro Versionが無料で使用できるようになる」そうです。

TrueSTUDIO Developers using STM32 devices get an early holiday gift from STMicroelectronics

このIDEはEclipseをベースとしていますので、基本的にはSW4STM32とよく似ています。
以下、とりあえずインストールして動かしてみた、という記録です。

ダウンロードは以下から行えます。Linux版とWindows版があります。
Mac版はありません。SW4STM32にはMac版があるのに、何故でしょうね。

TrueSTUDIO – Atollic

また、サポートされているボードの一覧がこちらにあります。
ほぼ全てのボードがサポートされているようですので、困ることは無いと思います。

STMicroelectronics – Atollic

デバッガには、インストール時にST-LinkとSEGGER J-Linkのいずれも選択することができます。

truestudio01.png

起動すると、以下のようなおなじみのEclipseの画面が現れます。
SW4STM32を使ったことがあれば、基本的な使い方にはあまり迷うことはないと思われます。

truestudio02.png

新規のプロジェクトを作成するには、ファイル→新規→C Projectを選択します。
するとプロジェクト作成Wizardが起動されます。

truestudio03.png

Project TypeにはEmbedded C Projectを選びます。

truestudio04.png

ボードの選択画面になりますので、使用するボードを選びます。
とりあえず手元のNUCLEO-F767ZIを選びました。

truestudio05.png

ランタイムライブラリはnewlibと機能簡略版newlib-nanoが選べます。
とりあえず機能簡略版でいいでしょう。

truestudio06.png

デバッグプローブは、今回はST-Link内蔵のボードを使うのでST-Linkを選びます。

truestudio07.png

これで必要なファイル一式がセットアップされ、ワークスペースに表示されます。

truestudio08.png

この時点で、ビルドまで終わっています。mainには、

while(1){ i++; }

というコードが入っています。

メニューから「実行」→デバッグを選択すると、ウインドウ配置がデバッグモードになり、mainの最初のところで一時停止状態になります。
ここから先はSW4STM32とあまり違いません。

TrueSTUDIOをCubeMXと一緒に使用することも可能です。
CubeMXでは、Project SettingsでTrueSTUDIOをIDEに指定することもできるようになっています。
また、TrueSTUDIOからCubeMXを呼び出すことができます。そのためのプラグインは以下にあります。

STSW-STM32095 – STM32CubeMX Eclipse plug in for STM32 configuration and initialization C code generation – STMicroelectronics

TrueSTUDIOからは、「ヘルプ」メニューから「新規ソフトウェアのインストール」を選択します。
そして、「作業対象」へ上記からダウンロードしたZIPファイルを指定するとインストールできます。

CubeMXを開くには、「ウインドウ」メニューから「Perspective」→「パースペクティブを開く」→「その他…」でSTM32CubeMXを選択します。

もっとも、CubeMXを使用して生成されるコードはどのIDE向けでも大差ないので、CubeMX+SW4STM32に慣れているのであれば、あえてTrueSTUDIOを使う意味は大きくは無いかもしれません。

NUCLEO-F767ZIでST-Link経由のシリアル通信をprintfで使う

NUCLEOはUSB経由ST-Linkでボード本体と接続されていますが、同時にVitual Portという機能でST-Link上でシリアルポートを使うことができます。
Arduinoでは「Serial」でホスト側とUART通信を行えるようになっていますが、Virtal Portが使えれば、STM32用のソフトウェアを開発するときもArduinoのSerialと同様に使えて便利そうです。

この記事は、Virtal Portを使用するプロジェクトをCubeMXで作成する方法のメモです。
こちらにSTM32F7 Discovery用の解りやすいチュートリアルがYouTubeありましたので、この記事はほぼこのビデオそのままの内容です。

(1)CubeMXで開発ボードを選択したら、まずPinout→Clear Pinoutsで全てリセットします。

uart01.png

次に、先にプロジェクトの設定をしておきます。
Project→Settingsで設定ウインドウを開き、
・プロジェクト名
・Toolchain/IDE
を設定します。

(2)シリアルポートの設定をしていきます。
UM1974の26ページに、ST-LinkにはUSART3がPD8とPD9で接続されていることが記載されています。

uart02.png

そこで、CubeMXでUSART3を使えるように設定します。

このとき、USART3を有効にしてはいけません。USART3という「機能」をどのピンに割り当てるかは可変なのですが、初期状態からUSART3を有効にするとPD8とPD9ではない別のピンに自動でこの機能が割り当てられてしまいます。

まずPD8とPD9を探します。
CubeMxにはピンを検索する機能がありますので、そこに「PD8」と入力します。

uart03.png

すると、ピン配置図の上で該当のピンが分かりますので、そのピンをクリックします。

uart04.png

そのピンに指定できる機能(Alternate Function)のリストが出ますので、その中から「USART3_TX」を選択します。

uart05.png

PD9についても同様に「USART3_RX」を指定します。最終的に図のようにPD8とPD9の機能が指定できればOKです。

uart06.png

ちなみに、どのピンにどんなAlternate Functionが割り当てられているのかは、CPUのデータシートを見ると一覧表があります。データシートは何をするにも必携です。

ここでようやくUSART3の機能を設定します。
ModeはAsynchronousにします。Hardware Flow ControlはDisabledのままです。

uart07.png

SYSセクションでは、DebugをSerial Wireにしておきます。

uart08.png

(3)Clock Configurationタブに移ります。

uart09.png

ここではHCLKを最高値(NUCLEO-F767ZIでは216MHz)に設定します。

uart10.png

以下のようなダイアログが出た場合にはOKを押してください。

uart11.png

(4)Configurationタブに移り、UARTの設定をします。

uart12.png

「USART3」のボックスをクリックすると設定ウインドウが開きます。
Word Lengthは8bitsにしておくのが良いでしょう。

uart13.png

(5)最後にProject→Generate Codeでスケルトンコードが生成されます。

uart14.png

シリアルポートに読み書きするには、

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

を使います。 第1引数はUARTを表す構造体です。生成されたスケルトンコードでは、UART構造体が

UART_HandleTypeDef huart3;

として定義されています。
第2引数はバッファ、第3引数はバッファ長、第4引数はタイムアウト(msec)です。
第2引数の型はuint8_tへのポインタです。

main()関数からメッセージを表示させるには、こんな感じで書きます。

  HAL_UART_Transmit(&huart3,(uint8_t *)"Hello\r\n", 7, 100);

しかしこれは、ちょっと使い勝手が悪いですね。
CubeMXのサンプルには、printfでUARTに出力できるようにするサンプルが付属していますので、これを自分のプロジェクトでも使ってみましょう。

該当するサンプルは、CubeMXのライブラリ(STM32CubeF7)では

STM32Cube\Repository\STM32Cube_FW_F7_V1.8.0\Projects\STM32F767ZI-Nucleo\Examples\UART\UART_Printf\SW4STM32

にあります。

まず、上記のフォルダにある「syscalls.c」を自分のプロジェクトにコピーしてください。
このファイルにはprintfから呼ばれる_write()の実装が入っています。

このファイル自体は変更する必要はありません。
その代わりに、printfを使いたいファイル(今回はmain.c)の中で、

int __io_putchar(int ch)

を再定義します。

これも上記のプロジェクトのmain.cにあるとおりにすればよいのですが、該当部分を抜き出すと以下のようになります。

ここでは、1文字出力する関数をUSART3へ1文字出力するように書き換えています。
printf()は_write()を経由して最終的に__io_putchar()を呼ぶように実装されているので、上記を追加することでprintfでST-Link経由でPC側へ文字列を送ることができるようになります。

ちなみに読み込みのほうは、syscalls.cにある_read()の実装が、バッファ分のデータを読み込むまで終わらないようになっているので、こちらにも手を入れる必要がありそうです。