STM32のバイナリをQEMUで動かしてみた

qemu-stm32.png

Raspberry PiのベアメタルプログラミングではQEMUを使うことができましたが、同様にしてSTM32のソフトウェアもエミュレータで動かすことができます。
オリジナルのQEMUはSTM32のボードをサポートしていませんが、ここからフォークしたGNU MCU Eclipse用のQEMUでは、いくつかのSTM32ベースのボード(と、Cortex-m7)をサポートしています。

The GNU MCU Eclipse QEMU

Windows版のQEMUをダウンロードして、SW4STM32でビルドしたバイナリを動作させてみました。
最新版では現在Windows版がありませんが、以前のバージョン(私はv2.8.0-20161227を使いました)で問題ありません。

サポートされているボードの中から、NUCLEO-F411REを使ってみることにしました。
CubeMXを使って、Lチカを作成します。
F411REではオンボードLEDがPA5に接続されていますので、メインループを

  while (1)
  {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    HAL_Delay(500);
  }

としました。

ビルドして、QEMUで起動します。オプションは

C:\>"C:\Program Files\GNU ARM Eclipse\QEMU\2.8.0-201612271623-dev\bin\qemu-system-nuarmeclipse.exe" -verbose -board NUCLEO-F411RE --image qemu-test-f411re.bin

のように指定します。最後のbinファイルはビルドしたバイナリファイルです。

すると、

GNU ARM Eclipse 64-bits QEMU v2.8.0 (C:\Program Files\GNU ARM Eclipse\QEMU\2.8.0
-201612271623-dev\bin\qemu-system-gnuarmeclipse.exe).
Board: 'NUCLEO-F411RE' (ST Nucleo Development Board for STM32 F4 series).
Device: 'STM32F411RE' (Cortex-M4 r0p0, MPU, 4 NVIC prio bits, 86 IRQs), Flash: 5
12 kB, RAM: 128 kB.
Image: 'qemu-test-f411re.bin'.
Command line: (none).
Cortex-M4 r0p0 core initialised.
Cortex-M4 r0p0 core reset.

C:\Program Files\GNU ARM Eclipse\QEMU\2.8.0-201612271623-dev\bin\qemu-system-gnu
armeclipse.exe: Attempt to set CP10/11 in SCB->CPACR, but FP is not supported ye
t.

というようにエラーで止まってしまいました。
エミュレータがサポートしていないFPUを利用しようとしたため、ということのようです。
そこで、ソースコード中でこの処理を行っている部分(system_stm32f4xx.c)を以下のようにコメントアウトして再度ビルドしたところ、うまく動作しました。

void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
//   SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
#endif

本当はこのあと、GDBに接続させてQEMU上のバイナリをデバッグしてみたいところですが、SW4STM32にGNU MCU EclipseのQEMU Debuggingプラグインを入れただけではうまく動作しませんでした。

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を使う意味は大きくは無いかもしれません。