STM32Cubeライブラリから標準的な例を実行した方法

こんにちは 箱から出して動作する標準的な例が良いことであることは秘密ではありません。ボードにアップロードして楽しんでください。 これは、クイックリファレンスに便利です。 しかし、その後、自分で何かを作成する場合は、サンプルコードを解析し、ドキュメントを読み、独自のコードを記述し、長時間デバッグする必要があります。 このため、 STM32Cubeライブラリの標準的な例をEmboxに統合する方法についてお話したいと思います。



したがって、Emboxは他のOSと同様に、スレッド、メモリ管理など、多くの素晴らしい機能を提供します。 STM32Cubeには、機器の使用例が数多くあります。 各例は、MDK ARM、EWARM、およびSW4STM32(Eclipseの上にあるもののようです)のプロジェクトファイルを含む自己完結型のソースファイルのセットです。 ボタンをクリック-すべてが集まり、ボードがロードされて起動しました。 問題は、このような例をオペレーティングシステムのインフラストラクチャに統合する方法です。 例がどのように配置されているかを詳しく見てみましょう。



何が起こったのかをすぐに見て、技術的な詳細をスキップしたい場合は、 ここにジャンプしてください :)



LCD画面の例とSTM32F746G-DiscoveryデバッグボードのBSPを使用します。 画面の例を考えてみましょう。 プロジェクトファイルに加えて、readme.txt、Inc /およびSrc /がソースツリーにあります。 それらが必要です。ソースフォルダーに移動して、そこにあるものを確認します。



# ls Projects/STM32746G-Discovery/Examples/LTDC/LTDC_Display_1Layer/Src/ main.c stm32f7xx_hal_msp.c stm32f7xx_it.c system_stm32f7xx.c
      
      





ファイルsystem_stm32f7xx.cはすべての例で使用でき、組み込みフラッシュメモリ、PLLの初期化が含まれ、SystemFrequencyも設定します。 これらの関数は、main()の前に呼び出されます。 Emboxでは、システムの起動時に同じ設定が行われるため、このファイルは使用しません。 さらに進むと、stm32f7xx_hal_msp.cファイルには、特定のタスクに固有のハードウェア初期化関数が含まれています。 これらは* _MspInitという形式の関数であり、最初はWEAKとして定義されており、再定義が可能です。 このファイルをEmboxに持ち込みます。 さらに、stm32f7xx_it.c-ここでは、ハードウェア割り込みと例外ハンドラーが再定義されています。 そして最後に、main.c-ここではすべてが明確です-メインロジック+初期化。



この例は、import_stm32_cube_example.pyスクリプトを使用してEmboxに転送されます。

起動後、最初のものがソースツリーreadme.txt、Inc /およびSrc /にコピーされます。 次に、 Emboxビルドシステムファイルを生成する必要があります。 この目的のために、サンプル名、ソースコード、プラットフォーム(f7またはf4)および必要な依存関係が置き換えられたテンプレートが使用されます。



 /* GENERATED FILE */ package stm32_PLATFORM_.cmd @AutoCmd @Cmd(name="_EXAMPLE_", help="") @BuildDepends(third_party.bsp.stm_PLATFORM_cube.core) module _EXAMPLE_ { source "Src/embox_main.c" depends _EXAMPLE__Lib } @BuildDepends(third_party.bsp.stm_PLATFORM_cube.core) module _EXAMPLE__Lib { @Cflags("-Wno-unused") @IncludePath("$(ROOT_DIR)/platform/stm32_PLATFORM_/cmds/_EXAMPLE_/Inc") _SOURCES_ depends third_party.bsp.stm_PLATFORM_cube.stm32_PLATFORM__discovery_bsp depends third_party.bsp.stm_PLATFORM_cube.stm32_PLATFORM__discovery_components depends third_party.bsp.stm_PLATFORM_cube.stm32_PLATFORM__discovery_utilities }
      
      





third_party.bsp.stmf7cube.stm32f7_discovery_bspおよびthird_party.bsp.stmf7cube.stm32f7_discovery_componentsモジュールには、CubeのBSPライブラリとさまざまな補助ライブラリが含まれています。 通常、これらのソースはCubeプロジェクトファイルに明示的にリストされていますが、システムでは共通であり、どの例でも同じ方法で一度に接続されます。 これらのライブラリとサンプルのすべてのソースコードは、Embox内の静的ライブラリにコンパイルされます(そうしないと、Embboxコマンドと弱いCube関数のリンクが解除されます)。



アセンブリシステムを見つけたので、OSがそれらを受け入れるように、キューブから割り込みハンドラーを何らかの方法でやり直す必要があります。 Cubeの割り込みハンドラーの形式はvoid(* handler)(void)ですが、Emboxでは署名が異なります。 EmboxのDMA2_Stream7_IRQHandlerハンドラーの例を使用すると、これは次のように実装できます。



 static irq_return_t embox_DMA2_Stream7_IRQHandler(unsigned int irq_nr, void *data) { DMA2_Stream7_IRQHandler(); return IRQ_HANDLED; }
      
      





そして、このラッパーを登録します。



 irq_attach(DMA2_Stream7_IRQn + 16, embox_DMA2_Stream7_IRQHandler, 0, NULL, "DMA2_Stream7_IRQHandler");
      
      





Cubeの割り込みハンドラーの名前は非常に明確な構造-* _IRQHandler (および割り込み番号の名前-* _IRQn )を持っていることがわかります。 したがって、この例のすべての割り込みハンドラーを自動的に見つけるには、最初にcppプリプロセッサーでファイルを調べ、結果のファイルですべて* _IRQHandlerを見つけます。 そして、import_stm32_cube_example.pyはSrc / embox_stm32f7xx_it_lib.cファイルを生成します。このファイルには、必要なすべての割り込みハンドラーと、割り込みハンドラーが登録する呼び出しであるグローバル関数embox_stm32_setup_irq_handlersが含まれます。



周辺機器からの割り込みに加えて、ハードウェアタイマーについても忘れる必要があります。Cubeタイマーハンドラー( SysTick_Handlerと呼ばれる)でオーディオバッファーの充填などのアクションが発生する可能性があるためです。 したがって、第1レベルのハンドラーはEmboxのハンドラーであり、最後に既にSysTick_Handlerを呼び出します。



最後に、Src / main.cを修正する必要があります。 まず、キューブの例のメイン関数には、常に3つの標準呼び出し-CPU_CACHE_Enable ()、 HAL_Init ()、 SystemClock_Config ()が含まれています。 これらの関数は、Emboxの開始時にすでに呼び出されているため、この例では非常に有害であるため、自動的にコメント化されています。 最後に、割り込みハンドラーの登録が追加されます。 通話を見る



 if (0 != embox_stm32_setup_irq_handlers()) { printf("embox_stm32_setup_irq_handlers error!\n"); }
      
      





その結果、本格的なOSモジュールが作成され、すぐに構成に含め、Emboxをボードにアップロードし、コマンドラインから通常のコマンドとして実行できます。



上記のすべてを実証するために、私が言ったように、2つの例を選択しました-1)LCDスクリーン2)BSPから音声を録音する例



遊びたい人のために 以下に、STMのリンクとレシピを示します。 おそらく、Emboxをビルドして実行する方法に関する記事が役に立つでしょう。



STM32F746G-DiscoveryのLCDの例


Emboxを使用してフォルダーに移動し、例を追加します。



# ./scripts/stm32/import_stm32_cube_example.py f7 ./build/extbld/third_party/bsp/stmf7cube/core/STM32Cube_FW_F7_V1.5.0/Projects/STM32746G-Discovery/Examples/LTDC/LTDC_Display_1Layer







長い名前のこのディレクトリは、Emboxを初めてアセンブルした後、アセンブル中に表示され、STM32Cube for F7のアーカイブがダウンロードされ、必要な場所にコピーされます。



これで、サンプルLTDC_Display_1Layerがプラットフォーム/ stm32f7 / cmds /フォルダーに表示されます。 あなたは自分でフォルダに入って、あなたがそれを信じていないかどうかを見ることができます:)



conf / mods.config構成にstm32f7.cmd.LTDC_Display_1Layerとして追加します。 Emboxを再構築し、スティックにロードします。 ミニコムコンソールでEmboxを読み込んだ後、LTDC_Display_1Layerコマンドを使用して例を実行します。 女の子の絵が画面に描かれます。



STM32F746G-Discoveryのサウンドの例(+タッチスクリーン)


Emboxを使用してフォルダーに移動し、例を追加します。



# ./scripts/stm32/import_stm32_cube_example.py f7 ./build/extbld/third_party/bsp/stmf7cube/core/STM32Cube_FW_F7_V1.5.0/Projects/STM32746G-Discovery/Examples/BSP







これで、プラットフォーム/ stm32f7 / cmds /フォルダーにBSPの例が表示されます。 この例は、STM32F7-Discoveryの多くの機能を示しています。



stm32f7.cmd.BSPとして構成に追加します。 Emboxを再構築し、スティックにロードします。 ミニコムコンソールで、Emboxを読み込んだ後、BSPコマンドを使用して例を実行します。 開始後、ユーザーボタン(青色のジョイスティック)を押して目的の例を選択し、マイク(MEMSマイク、ボードに組み込まれた小型マイク)からの音声の録音を開始できます。その後、録音は数秒で再生されます。



BSPのいくつかの例を含むビデオ。




ここで実装を見ることができます



以上です。 ご質問をお待ちしております。



All Articles