DevEnv » History » Revision 11
Revision 10 (mole lord, 08/29/2020 01:30 PM) → Revision 11/23 (mole lord, 08/29/2020 01:53 PM)
# 開発環境 {{>toc}} STM32CubeIDEは全部入りで楽なのですが、以下の問題があります。 * ファームウェアライブラリとして最新版しか使えない(CubeMX上で古いファームウェアライブラリを選択できない) * ファームウェアライブラリのパスがWindowsのログイン名によって異なり、IDEプロジェクトを他人の環境で再現するのが困難 STMicroのファームウェアライブラリはバージョンが上がると新しいバグが入ることが多く、ライブラリのバージョンが固定できないのは「完成したソフトを半年後にリビルドすると動作しない」原因になります。 そこで、CubeIDEは避け、バージョンの固定ができる下記のような開発環境を考えました。 * IDEとして [GNU MCU Eclipse](https://gnu-mcu-eclipse.github.io/) を使う * コンパイラとして [GNU Arm Embedded Toolchain](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm) を使う 注:開発PCのOSがWindows10であることを前提としています。 この開発環境の場合、Eclipseに依存せずコマンドラインのみでビルドが行えるという利点があります。 ## インストール 基本的に、 [GNU MCU Eclipse のサイト](https://gnu-mcu-eclipse.github.io/) の右側にある DownloadsやInstallのリンク先の記事に従っています。 ただし、xPack Managerでコンパイラまで入れるとコンパイラのバージョン管理がしづらくなる欠点があるので、コンパイラに関してはねむいさんの公開している手順を参考にしています。 ### まずtoolchainとeclipse 1. [ねむいさんのぶろぐ-Windows10対応軽量シンプルなARMマイコンのGCCビルド環境を構築する(2020年度版)](http://nemuisan.blog.bai.ne.jp/?eid=188089) の手順に沿ってC:/Devzフォルダを作ります 1. 他のPCにインストールするとき手間を省くために、C:/Devzをzip圧縮して保存しておきます 1. あとでeclipseやCubeMXをインストールするための、中身がカラのC:/Dev0フォルダを作ります 1. [GNU MCU Eclipseのリリース物](https://github.com/gnu-mcu-eclipse/org.eclipse.epp.packages/releases) から、 20200127-1311-gnumcueclipse-4.7.2-2019-12-R-win32.win32.x86_64.zip をダウンロードします 1. 上記zipを C:/Dev0 に展開します 1. eclipseを動かすために、https://jdk.java.net/14/ からOPENJDK14をダウンロードして展開し、jdk-14.0.2をjreにリネームして、C:/Dev0/eclipse/ に移動します(C:/Dev0/eclipse/jre/bin/javaw.exeとなるように) 1. C:/Dev0/eclipse/eclipse.exe をダブルクリックして、起動するか確かめます * 起動できたら、この時点では何もする必要はないので、終了させます * javaがインストールされていない場合、eclipse.exeを起動しようとするとjavaランタイムが見つからないという趣旨のダイアログが出ます この時点で以下のようなフォルダ構成になります。 ~~~ C:/ +-Dev0 | +-eclipse/ | +-jre/ +-Devz/ +-ARM/ | +-launchpad/ +-Coreutils/ ~~~ ### eclipse上でJTAG(SerialWire)デバッガを使えるようにする 1. [ゆっきぶろぐ-【丁寧解説】GNU MCU Eclipseのインストール](https://yukblog.net/gnu-mcu-eclipse-install/) に倣い、XPackのインストールまで終わらせます * Node.jsのインストーラでは、 □Automatically install the necessary ~のチェックはつけなくても大丈夫です 1. コマンドプロンプトで `xpm install --global @gnu-mcu-eclipse/openocd` します 1. コマンドプロンプトで `xpm install --global @gnu-mcu-eclipse/qemu` します 1. [ゆっきぶろぐ-【丁寧解説】GNU MCU Eclipseのプロジェクト作成手順【画像多め】](https://yukblog.net/gnu-mcu-eclipse-project/) に倣い、CMSIS Packs managerの初期化まで終わらせます ### eclipse起動のためのバッチファイルを作る 以下の2つのファイルを、C:/Dev0に作ります。 armgcc.cmd ~~~ cmd @echo off set tooldir=C:\Devz set gccdir=%tooldir%\ARM\launchpad rem set PATH=%gccdir%\bin;%gccdir%\arm-none-eabi\bin;%tooldir%\Coreutils\bin;%PATH% set PATH=%gccdir%\bin;%tooldir%\Coreutils\bin;%PATH% set tooldir= set gccdir= ~~~ armeclipse.cmd ~~~ cmd @echo off call armgcc.cmd start C:\Dev0\eclipse\eclipse.exe ~~~ armeclipse.cmdをダブルクリックすると、arm用のgccにパスが通った状態でeclipseを起動できるようになります。 ### CubeMXを使えるようにする STM32CubeMXを動かすために、OPENJDK8を入れます。 ただし、レジストリへの設定も必要なようでSunオフィシャルな?OpenJDKだとうまくいかないので、 [adoptopenjdk](https://adoptopenjdk.net/) で配布されているものを使います。 参考 [ST Community - With Windows 10 I installed openjdk version 1.8.0_222 but STM32CubeMX does not see that openjdk is there. Says it can not find java runtime environment. The readme with STM32CubeMX said openjdk would work.](https://community.st.com/s/question/0D50X0000B8hXhZ/with-windows-10-i-installed-openjdk-version-180222-but-stm32cubemx-does-not-see-that-openjdk-is-there-says-it-can-not-find-java-runtime-environment-the-readme-with-stm32cubemx-said-openjdk-would-work) 1. https://adoptopenjdk.net/ へアクセスします 1. ●OpenJDK 8(LTS) と ●HotSpot が選択された状態で、Latest Releaseをクリックしてダウンロードします 1. AdoptOpenJDKのインストーラでは、 `Set JAVA_HOME variable` と `JavaSoft(Oracle) registry keys` を「ローカルハードドライブにインストール」します * インストールパスはあまり気にする必要ありません。デフォルトでも、 C:/Dev0/jdk8でもよいです 1. [STM32CubeMX](https://www.st.com/en/development-tools/stm32cubemx.html) をダウンロードし、インストールします 1. スタートメニューからSTM32CubeMXを起動します 1. メニューバーのHelp-Updater Settingsを選びます 1. Repository Folderを `C:\\Dev0\\CubeRepo` に直します * デフォルトのままだと、他人の環境でeclipseプロジェクトを再現するとき困るので、変えています 1. STM32CubeMXを閉じます ## ボード毎にやること OpenOCDではST-Linkは扱えない?ようなので、Nucleo上のST-Link部分をJ-Linkに書き換えます。 なお、STM32G系のNucleoボードはST-Link/V3なので、J-Link化は非対応のようです。 参考: [STLink conversion utility for STLink v3](https://forum.segger.com/index.php/Thread/6397-SOLVED-STLink-conversion-utility-for-STLink-v3/) [Converting ST-LINK On-Board Into a J-Link](https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board/) に従ってください。 * J-Link化されたものと元のST-Link/V2-1の見分け方 * デバイスマネージャでも識別できますが面倒です * ST-Linkの場合は、PCに挿すとUSBメモリ風にドライブとして認識されます * J-Link化後は、PCに挿してもストレージデバイスとして認識されなくなります * TeraTermを起動して、COMポートの名前を見ることでも識別できます ## プロジェクト毎にやること CubeMXでピン設定の初期化コードを吐き、Eclipseでそれを取り込み、ビルド、デバッグしてLEDチカチカまでする例です。 ### CubeMXでプロジェクト作成 1. CubeMXを起動します 1. ACCESS TO BOARD SELECTOR をクリックします 1. Commercial Part Numberに `f429` と入力すると NUCLEO-F429ZI が候補に出るので、それを選択します 1. 画面右下のボード画像をクリックし、右上の Start Projectをクリックします * この画面のDocs&Resourcesタブで、UsersManual(UM1974.pdf 回路図入り)などが入手できます 1. `Initialize all peripherals with their deafult Mode?` と聞かれたらNoを選びます * 今回使わないペリフェラルまで有効化されて邪魔なので、Noを選んでいます * Noを選んでも、LEDなどごく一部は最初から有効に設定されます 1. `Project Manager` タブをクリックし、以下のように設定します * Project Name は `nuc-f429-blink` * Project Location は `C:\work\stm32\ide_ws1` * Application Structure は `Advanced` * Toolchain Folder Location は 気にする必要ありません * Toolchain/IDE は `Makefile` * Minimum Heap Size は `0x0` (FreeRTOSのヒープを使うつもりのため) 1. 画面左の`Code Generator`をクリックし、以下のように設定します * `〇Add necessary library files ~` をクリック(FWライブラリのソースはバージョン管理の対象にしたくないため) * `□Enable Full Assert` をチェックします 1. 右上の GENERATE CODE をクリックします この時点でCubeMXのプロジェクトファイル .ioc と、自動生成されたファイル群をgitリポジトリにコミットしておくと、どこを手で書き換えたかはっきりするので開発しやすいです。 ### Eclipseで取り込み 1. バッチファイル `armeclispe.cmd` をダブルクリックしてEclipseを起動します 1. Workspace: に `C:\work\stm32\ide_ws1` を入力し、Launchします 1. □Always show Welcome at start up のチェックを外したあと、Welcomeを閉じます 1. メニューバーの File - New - Makefile Project with Existing Code を選びます 1. Exising Code Location右のBrowse...をクリックし、 `C:\work\stm32\ide_ws1\nuc-f429-blink` を選びます 1. Toolchain for Indexer Settings は ARM Cross GCC を選び、Finishします  この状態だと、プロジェクトをBuildしようとしたときに「Cannot run program "": Launching failed」と出て失敗するので、まだ手順の続きがあります。 1. https://yukblog.net/gnu-mcu-eclipse-project/ に沿って、CMSIS Pack Managerの初期化を済ませます 1. https://yukblog.net/gnu-mcu-eclipse-project/ に沿って、CMSIS Pack(今回の場合はF4xx用)のインストールを済ませます 1. C/C++パースペクティブに戻します 1. プロジェクトを右クリック-Propretiesを開きます 1. C/C++ Build-Settings で、Devicesタブを開き、Devices-STMicroelectronics-STM32F4 Series-STM32F429-STM32F429ZI を選択して、Apply and Closeします これでBuildに成功するようになります。 なお、プロジェクトのProperties-C/C++ 必須ではありませんが、プロジェクトのProperties-C/C++ BuildのBehaviorタブで □Enable parallel buildしておくと、ビルド時に開発PCのCPUコアを複数使用するのでビルドが高速になります。 ### ソース修正 まだコードを何も書いていないので、LEDを点滅させるためにmain.cを修正します。 ~~~ c /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin); HAL_Delay(500); /* USER CODE END WHILE */ ~~~ 1. Eclipse上または適当なテキストエディタで、 `Core/Src/main.c` を開きます 1. main()のwhileの中に `/* USER CODE BEGIN END WHILE */` と書かれているのを探して、上記のようにコードを挿入します 1. Ctrl-Bでビルドします 1. プロジェクトを右クリック-Debug As-Debug Configurationsを選びます 1. `GDB SEGGER J-Link Debugging` をダブルクリックします * `nuc-f429-blink Default` ができます 1. Debugボタンを押すと、デバッグ実行が開始され、main()の先頭でbreakした状態で止まります * Debugボタンを押すとJ-LinkのTerms of useの画面が出るので、□Do not show ~のチェックをして、Acceptします * Terms of useの画面で手間取ってエラーになった場合は、Run-Debug history-nuc-f429-blinkでやり直してください ## トラブルシューティング * CubeMXが起動しない * AdoptOpenJDKのインストールが済んでいるか確認します * プロジェクトをBuildしようとしたときに「Cannot run program "": Launching failed」と出て失敗する * https://yukblog.net/gnu-mcu-eclipse-project/ にあるように、Settings - Devicesをマイコンに合わせて選ぶとBuildに成功するようになります * Eclipse上のmakeの出力が文字化けする * `C:/Devz/Coreutils/share/locale/ja/LC_MESSAGES/make.mo` を適当にリネームします * ja/LC_MESSAGES/make.mo が見つからなければ英語表記になるので、文字化けは解消します