STM32およびC ++で動作するようにClionおよびCmake IDEを構成する

私のセットアップの例の前に、ちょっとした歌詞。



長い間、私はマイクロコントローラで自分自身を試してみたかったのですが、むしろ、私が本当に実装したかったアイデアがありました。 最初にPIC32で開始-消防コントローラー。 そのため、最初にポートを短縮し、電力を過大評価しました-殺すことはできません(完全にはわかりませんが、ポートが一度燃え尽きましたが、コントローラー自体は動作し続けました)。 IDpl MplabXは悪くありません。選択されたMK上の占有RAM /フラッシュの表示でグラフィックブロックを埋めました-便利ですが、IDEとしてのNetBeans自体は、まあ、Ideaの後は便利ではありません。 しかし、それは問題ではありませんでした-後で判明したように、PICは入手するのが難しく、それらを運ぶ人はほとんどいません。



それから私はSTM32に向かって掘ることに決めました-それらは大量にあり、基本的な周辺機器についてはあまり求めていませんが、主なものは配達可能性です。 (ただし、STMのコードジェネレーターはMicrochipよりも劣っています。ファイル全体がコメントや関数で汚染されています。もちろん、非常に残念です。Microchipの場合、生成された関数はすべて別のファイルに移動し、main.cはほぼきれいです)。

(UPD:私はここで間違っていたと認めています、 ゴルフ2109に感謝します 、彼はmain.cファイルのコメントと機能を取り除くことができ、生成されたコードを別々のファイルに入れる設定でオプションをオンにすることを提案しましたが、私はまだ迷っていますデフォルト設定、それは論理的に見えるでしょう)



STM32のIDEについて説明します。



賞賛されたKeilを試してみました-確かにメモ帳よりも優れていますが、非常に便利ではありません(通常のヒントも通常のフォーマットも、Ideaの後、一般的にはそのコートではありません、特にパッケージの作成方法、パッケージを作成して続行するためにボックスをクリックできない理由はまだわかりませんでした-私は交尾したい)。



その後、CooCoxを試しました-インターフェイスははるかに良く、より快適で、フォーマットはうまく構成されています(メソッドのパラメータ転送設定に直接満足し、他の設定は非常に便利です)が、再び、Ideaからの十分な多くの利点がなく、パッケージの整理に問題がありました。



ClionはC / C ++のみのアイデアとほぼ同じであり、すぐにそれを固定したかったのですが、非常に問題があることが判明しました(特に、プラス、特にあらゆる種類のコンパイラーとコンパイラー、数百のコンパイルオプションに強くない人にとって)。 JetBrainsブログから始めました。 詳細については説明しますが、これは以前のバージョンのSTM32CubeMXの場合です。新しいディレクトリではディレクトリ構造が少し変更されたため、コンパイルできない理由がしばらく理解できませんでした。 それから私はそれを考え出した-パスを変更し、cortex-m3が-mfpuオプションを削除した。 しかし、再びコンパイルされませんでした。 さらに、間違ったコンパイラをインストールしたか、ダウンロードしただけで、アセンブリファイルにパスを指定しなかったことが判明しました(夜遅く考えるのは難しいです)。



Clionの主なことは、「編集時にCmakeプロジェクトを自動的にリロードする」設定(設定->ビルド、実行、展開-> Cmake)を確認することです。編集後、手動で何もクリアする必要はありません。



もう1つの変更-ブログで言及されているデバッガーはOzoneに名前が変更されましたが、まだテストされていません。後で登録を解除します。



最後の問題は、脳を掘削することです。 私は本当にOOPを望んでいましたが、C ++ファイルを追加した場合、プロジェクトがコンパイルされませんでした。関数が見つからない(たとえば、_exit、_sbrkなど)エラーが多数ありました。 ここには2つの問題がありました。





その後、プロジェクトは正常にコンパイルを開始し、そのサイズは正常範囲内になりました(-specs = nano.specsオプションを使用しない場合、サイズが約110 kbの空のプロジェクトのサイズは10倍になりました。オプション-18 kbを使用すると)



だから私がやったこと:



  1. クライオンを置く
  2. 設定([設定]-> [ビルド、実行、展開]-> [Cmake])に移動し、[編集時にCmakeプロジェクトを自動的に再読み込み]チェックボックスをオンにします。
  3. ここで、パラメータ-DCMAKE_TOOLCHAIN_FILE = STM32L1xx.cmakeをCmakeオプションフィールドに入力し、生成パスフィールドにビルド配置します (変更する場合は、CMakeLists.txtおよびSTM32L1xx.cmakeファイルでも変更する必要があります)
  4. ARMコンパイラを入れて( ここで私はそれを取った
  5. プロジェクト(以前にSTM32CubeMxで生成された)をインポートします。CMakeLists.txtを作成できると言います。
  6. ここまたは私のリポジトリから CMakeLists.txtの内容をClionで作成されたものコピーし、ファイルSTM32L1xx.cmakeを追加します(好きな名前を付けることができます)
  7. STM32L1xx.cmakeでは、プロジェクトディレクティブのプロジェクト名を修正し、C ++が不要な場合はCXXを削除できます。
  8. add_definitionsディレクティブのCMakeLists.txtファイル(-DSTM32L100xC)をコントローラーに置き換えます
  9. 信頼性のために、次のことができます:ツール-> Cmake->キャッシュをリセットしてプロジェクトをリロードしてから、ツール-> Cmake-> Cmakeプロジェクトをリロード
  10. 今、あなたは構築することができます


CMakeLists.txtファイル



project(Skeleton C CXX ASM) cmake_minimum_required(VERSION 3.5.0) add_definitions(-DSTM32L100xC) set(FREERTOS_DIR Middlewares/Third_Party/FreeRTOS/Source/) file(GLOB_RECURSE USER_SOURCES "Src/*.c") file(GLOB_RECURSE HAL_SOURCES "Drivers/STM32L1xx_HAL_Driver/Src/*.c") file( GLOB_RECURSE FREERTOS_SOURCES "${FREERTOS_DIR}/*.c" "${FREERTOS_DIR}/CMSIS_RTOS/*.c" "${FREERTOS_DIR}/portable/GCC/ARM_CM3/*.c" ) add_library( CMSIS Src/system_stm32l1xx.c startup/startup_stm32l100xc.s ) include_directories(Inc) include_directories(Src/gps/parser/nmea) include_directories(Drivers/STM32L1xx_HAL_Driver/Inc) include_directories(Drivers/CMSIS/Include) include_directories(Drivers/CMSIS/Device/ST/STM32L1xx/Include) include_directories(${FREERTOS_DIR}) include_directories(${FREERTOS_DIR}/CMSIS_RTOS) include_directories(${FREERTOS_DIR}/include) include_directories(${FREERTOS_DIR}/portable/GCC/ARM_CM3/) include_directories(${FREERTOS_DIR}/portable/GCC/MemMang) add_executable(${PROJECT_NAME}.elf ${USER_SOURCES} ${HAL_SOURCES} ${LINKER_SCRIPT} ${FREERTOS_SOURCES}) target_link_libraries(${PROJECT_NAME}.elf CMSIS) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.map") set(HEX_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.hex) set(BIN_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.bin) add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE} COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE} COMMENT "Building ${HEX_FILE} \nBuilding ${BIN_FILE}")
      
      





ファイルSTM32L1xx.cmake:



 INCLUDE(CMakeForceCompiler) SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_SYSTEM_VERSION 1) # Specify the cross compiler. arm-none-eabi-gcc and arm-none-eabi-g++ are full path required CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU) CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GNU) SET(LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/STM32L100RCTx_FLASH.ld) SET(COMMON_FLAGS "-mcpu=cortex-m3 -O2 -mthumb -ffunction-sections -fdata-sections -g -fno-common -fmessage-length=0") SET(CMAKE_CXX_FLAGS_INIT "${COMMON_FLAGS} -std=c++11") SET(CMAKE_C_FLAGS_INIT "${COMMON_FLAGS} -std=gnu99") SET(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-gc-sections -specs=nosys.specs -specs=nano.specs -T ${LINKER_SCRIPT}")
      
      





仕事をするのは楽しみになりましたが、今のところはSTMユーティリティを使用してファームウェアをアップロードし、後でOZONEを巻き上げてみます。 質問に答えます(可能な場合)。



All Articles