* STM32CubeMX で make [#m8563ef1] 諸般の事情でアナログ回路の実験は中止して,nucleo をいじり始めました. nucleo といっても種類がたくさんあるけれど,今回は以前買って積み基板になっていた nucleo F401RE を使います. #af_amazon(B00RCALR58) ** STM32Cube とは [#j48bbe18] STM32Cube は,STmicro が提供するドライバ・ミドルウェア環境で :STM32CubeF1, STm32CubeF4, ...|各マイコンごとのドライバ・ミドルウェアで,末尾の F1, F4, などが対象とする STM32 マイコンを表しています. :STM32CubeMX|STM32CubeF4 などからソースコードを抽出して,初期化コードを含むソースコードツリー(プロジェクト)の雛形を作るツール から構成されています. ** 環境 [#e49c3132] Windows 上でプログラムを書く気は無いので,Linux 上で. :ターゲットボード|nucleo F401RE :OS|debian stretch (testing) -- JRE (Java ランタイム) をインストールしておくこと.arm-none-eabi-* のツールチェーンも必要です. ** 困ったことに [#u5de8dda] 困ったことに,STM32CubeMX が生成するソースコードツリーは IDE 用で,Makefile は出力してくれません. その IDE も eclipse などではなくて,Windows 上の IDE のようです. というわけで,最初,[[STM32CubeMX GCC Makefile project>http://www.ba0sh1.com/stm32cubemx-gcc-makefile/]] を試してみました. STM32CubeMX で生成されたソースコードツリー下の設定ファイルを読み込んで Makefile を自動生成する python スクリプトです. が,どうもスクリプトが想定している設定ファイルの書式と食い違っているようで,途中でエラーが出てうまく動作してくれません. ならば,と探してみると,[[STM32CubeMX for make and gcc>http://wunderkis.de/stm32cube/index.html]] というものがありました. こちらは,ソースコードツリーの各所の Makefile を tar ball で固めただけのものです. ただ,STM32CubeMX はいろんな CPU・基板のソースコードツリーを生成できるので,自分のターゲットボードと一致していない場合は,トップレベルの Makefile の設定をいじらないといけません. (が,それだけでビルドできてしまうスグレモノです.) こちらはうまく動きました. ** 手順 [#v1e6f68f] L チカまでの手順をまとめてみます. *** STM32CubeMX のインストール [#fe2cf810] http://www.st.com/content/st_com/ja/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html#getsoftware-scroll からダウンロードし,一般ユーザでインストーラを起動し,STM32CubeMX をインストール. ホームディレクトリの直下に STM32cubeMX ディレクトリが作成され,その下に実行ファイルがインストールされます. *** STM32CubeMX の起動 [#ue0243c6] xterm などのターミナルエミュレータ上から $ ~/STM32CubeMX/STM32CubeMX と入力し,STM32cubeMX を起動します. #ref(スクリーンショット_2016-05-18_00-53-07.png,center,50%) 既存のプロジェクトは無いので「New Project」をクリックします. *** CPU・評価ボードの選択 [#j458cefa] すると,CPU や評価ボードの選択画面が現れます. #ref(スクリーンショット_2016-05-18_00-56-13.png,center,50%) 画面上部の「Board Selector」タブをクリックし,現れる画面の右側の Boards List からお目当ての「NUCLEO-F401RE」をダブルクリックします. *** I/O ピンの設定 [#ud07064c] マイコンでは内部にたくさんの入出力デバイスを詰め込んでいて,どの機能をどの I/O ピンに割り当てるか設定するのが普通です. 完全に自由に割り当てられるわけでもなくて,ピンによって割り当てられる信号もある程度決まっています. また,ピンの物理的な位置によってもプリント版パターンの引きやすさも変わってきます. なので,「どの入出力デバイスをどのピンに割り当てるか」というのは,パズルを解くような作業になりがちです. STMCube32MX では,このパズルを解きやすくするための GUI 画面があります. #ref(スクリーンショット_2016-05-18_01-03-15.png,center,50%) まぁ,今回は L チカだけで,PA5 には既に設定が済んでいるので,このままにしておきます. *** クロック [#jde5129d] クロックまわりについても GUI の設定画面があります. 従来なら,リファレンスマニュアルと見て設定レジスタの値を計算してソースコードに書き込むという作業になります. #ref(スクリーンショット_2016-05-18_01-20-21.png,center,50%) ここも,L チカでは設定不要なので,いじらずにこのままにしておきます. *** プロジェクト出力の設定 [#a5d9465d] 生成するソースコードツリーの設定をします. 画面上部のプルダウンメニューの「Project」→「Settings」を選択すると,設定画面が出てきます. #ref(スクリーンショット_2016-05-18_01-28-04.png,center,50%) [[STM32CubeMX for make and gcc>http://wunderkis.de/stm32cube/index.html]] のページの説明にあるように - Toolchain で "TrueSTUDIO" を選択 - "Copy only the necessary library files" を設定 と設定します. もちろん,ソースコードツリー(プロジェクト)の出力場所も設定します. 今回は,生成場所(Toolchain Folder Location)を「/home/imai/progs/nucleo_test/nucleo_led」としておきます. (しかし,Toolchain って表現,誤解するよなぁ.arm-none-eabi-gcc の場所を指定するのかと思ったぞ) *** プロジェクトの生成 [#fa2e3534] いよいよ,プロジェクトのソースコードツリーの生成です. 画面上部のプルダウンメニューの「Project」→「Generate Code」を選択すると,設定した場所にソースコードツリーが生成されます. これで STM32CubeMX は用済みなので,必要ならばプロジェクトの設定を保存し,終了させます. *** L チカコードの追加 [#q6486b24] 生成されたソースコードツリーでは,初期化コードが入っているだけで何もしないので,L チカするコードを追加します. nucleo_led/Src/main.c の /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_TogglePin ( LD2_GPIO_Port, LD2_Pin ); /* この行と */ HAL_Delay ( 2000 ); /* この行を追加.*/ /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } の部分に追加. *** Makefile のコピー [#o8624a45] [[STM32CubeMX for make and gcc>http://wunderkis.de/stm32cube/index.html]] での tar ball を適当な場所に展開します. そして,Makefile を cp -a でソースコードツリーにコピーします. *** Makefile の修正 [#pb366006] トップレベルの Makefile を自分の基板に合わせて修正します. 今回は, DEVICE_FAMILY = STM32F4xx DEVICE_TYPE = STM32F401xE STARTUP_FILE = stm32f401xe SYSTEM_FILE = stm32f4xx ... LDSCRIPT = STM32F401RE_FLASH.ld としました. *** ビルド [#sb261085] トップディレクトリで $ make で,main.bin ファイルが生成されました. main.out が elf ファイルになります. *** ターゲットボードへのファームウェアの書き込み [#h40ed6e4] mbed 環境でプログラムを書いたときと同様に + nucleo 基板を Linux マシンに USB ケーブルで接続 + マスストレージデバイスに main.bin をコピー でマイコンにファームウェアが書き込まれ,プログラムが実行されます. *** 2016/06/15 追記 [#a6129e10] ** 2016/06/15 追記 [#a6129e10] Makefile の変更箇所に LDSCRIPT 行を追加