技術コラム
STマイクロエレクトロニクスリファレンスボードでFreeRTOSを動かしてみた

ネクスティ エレクトロニクスの開発部隊による技術コラムになります。 当社取り扱い商材を活⽤したリファレンスボードを使ったソフトウェア開発の内容を発信します。
今回は当社で開発したSTマイクロエレクトロニクスリファレンスボード(以下、ST版リファレンスボード)を使⽤して、FreeRTOS搭載の簡単なマルチタスクソフトウェアを作成していきます。

概要

  • STマイクロエレクトロニクス製MCUは、同社が頒布している初期化コード⽣成ツール「STM32CubeMX」を使⽤することで、GUIでペリフェラルやミドルウェアの設定を簡単に⾏うことができます。
    FreeRTOSは主に組込みシステム⽤のリアルタイムOSで、MITライセンスのオープンソースなため、商⽤・⾮商⽤でも無償で使⽤することができます。
    本記事ではST版リファレンスボードに搭載されている4つのLEDを異なるタスクで動かすソフトウェアを作成します。 各LEDは以下のように点滅させます。

  • LED名 トグル間隔 タスク名
    LD1 500msec defaultTask
    LD2 100msec myTask2
    LD3 1000msec myTask3
    LD4 2000msec myTask4
    • STマイクロエレクトロニクス製MCU搭載リファレンスボード内LEDイメージ

必要なもの

  • 今回紹介するソフトウェア開発で必要となるハードウェア、ソフトウェアと使⽤しているバージョンを以下に挙げます。

  • 名前 用途 備考 画像
    ST版
    リファレンス
    ボード
    使用ボード 携帯MCU:
    ボード
    STM32H753XIH6
    STマイクロエレクトロニクス製MCU搭載リファレンスボード画像
    i-jet ファームウェア
    書き込み用デバッガ
    Ver: B Ii-jet画像
    STM32CubeMX 初期化コード生成
    ツール
    Ver: 6.12.1
    IAR EW for Arm IDE Ver: 9.30.1

STM32CubeMXでの操作

STM32CubeMXを使⽤してピン設定とFreeRTOSの設定をしていきます。

  • 1.MCU選択

    STM32CubeMXを起動すると、以下のような画⾯が表⽰されるので、「ACCESS TO MCU SELECTOR」をクリックします。

    • cubemx_startイメージ

    以下のような画⾯が表⽰されるので、「Commercial Part Number」にST版リファレンスボードに搭載されているMCU名「STM32H753XIH6」を⼊⼒します。すると右下部分のMCU候補が2つに絞られます。

    • cubemx_mcu_select_1イメージ

    表⽰された2つの候補の「STM32H753XIH6」の⽅をクリックして選択し、右上の「Start Project」ボタンをクリックします。

    • cubemx_mcu_select_2イメージ

    今回のソフトウェアではMPU(メモリ保護ユニット)を使⽤しないため、以下のようなメッセージボックスが表⽰される場合は、「Yes」をクリックします。

    • cubemx_mpu_messageイメージ
  • 2.ピン設定

    今回のハンズオンでは、ST版リファレンスボード上に実装されている4つのLEDを使⽤するので、これらを使⽤するためのピン設定をしていきましょう。
    4つのLEDのピンは以下になります。

    端⼦名 Port
    LD1 PK3
    LD2 PK4
    LD3 PK5
    LD4 PK6

    STM32CubeMXのPinout & Configurationタブが表⽰されているので、右下の検索テキストボックスに 「PK3」と⼊⼒します。するとテキストボックスの上の図でのPK3に対応するピンが点滅します。

    • cubemx_pin_1イメージ

    点滅したピンをクリックすると、以下の図ようにプルダウンメニューが表⽰されるので、「GPIO_Output」をクリックし、GPIO出⼒設定にします。

    • cubemx_pin_2イメージ

    PK4, PK5, PK6も同様に設定します。

  • 3.FreeRTOSの追加・設定

    続いて、FreeRTOSを追加・設定していきます。
    STM32CubeMXの左側のペインの「Middleware and Software Packs」をクリックし、その中の「FREERTOS」をクリックします。

    • ubemx_rtos_1イメージ
    • cubemx_rtos_2イメージ

    すると、「FREERTOS Mode and Configuration」というペインが表⽰されます。今回はCMSIS V2インタフェースを使⽤しますので、Interfaceのプルダウンメニューをクリックし、「CMSIS_V2」を選択します。

    • cubemx_rtos_3イメージ
  • 4.タスクの追加

    STM32CubeMXでは、FreeRTOSのタスク設定をGUIで⾏うことができます。今回はLED4つに対してそれぞれタスクを作成します。 STM32CubeMXの真ん中下のConfigurationペインのTasks and Queuesタブをクリックします。
    Tasksリストにはデフォルトで「defaultTask」というタスクのみがあるので、さらに3つのタスクを作成していきましょう。各タスクの設定(優先度、スタックサイズ等)は全てデフォルト値とします。
    Tasksリストの下のAddボタンをクリックします。

    • cubemx_rtos_4イメージ

    NewTaskウィンドウが表⽰され、OKボタンをクリックすると、Tasksリストに「myTask02」が追加されます。ここで、Entry Functionの値(StartTask02)がタスク関数名となります。

    • cubemx_rtos_5イメージ

    同様に「myTask03」、「myTask04」を追加します。

  • 5.タイマー設定

    FreeRTOSではSystick以外のタイムベースの使⽤を推奨しているため、今回はTIM6を使⽤することにします。 STM32CubeMXの左側のペインの「System Core」をクリックし、その中の「SYS」をクリック、中央上部の ペインのプルダウンメニューをクリックし、「TIM6」を選択します。

    • cubemx_rtos_6イメージ
  • 6.プロジェクトの設定、コード⽣成

    続いてIDEで使⽤するプロジェクトの設定を⾏います。
    STM32CubeMXの「Project Manager」タブをクリックし、Project Nameに作成するプロジェクト名を、Project Locationにプロジェクトを作成するディレクトリを⼊⼒します。ここでは、プロジェクト名を「st_pfp_rtos_sample」、Project Locationを「C:\work\HMI_platform\st_board\rtos_for_blog」としています。今回はIDEとしてEWARMを使⽤するので、Toolchain / IDEをEWARMに設定します。その他項⽬はデフォルト値でOKです。 右上のGENERATE CODEボタンをクリックすると、IDEのプロジェクトファイルとコードが⽣成されます。

    • cubemx_code_genイメージ

IDE(EWARM)での操作

STM32CubeMXで⽣成したプロジェクトファイル、コードをIDE(EWARM)で操作します。

  • 1.EWARMでプロジェクトを開く

    STM32CubeMXのProject Managerタブで設定したディレクトリのEWARMフォルダを開き、その中のファイル「Project.eww」をダブルクリックします。 今回使⽤しているEWARMのバージョン9.30では、以下のメッセージウィンドウが表⽰されますので、「Yes」ボタンをクリックします。

    • ewarm_project_version
  • 2.タスク関数のコーディング

    STM32CubeMXで⽣成したコードのタスク関数にLEDを点滅させる処理を追加していきます。 EWARMのワークスペースから、「main.c」をダブルクリックし、main.cを開きます。

    • warm_workspaceイメージ

    main.cには、STM32CubeMXで設定したタスクの空関数(StartDefaultTask, StartTask2, StartTask3, StartTask4)があるので、各関数の無限ループ内に以下のようにLEDをトグルし、指定したミリ秒ウェイトする処理を追加します。


    
    /* USER CODE BEGIN Header_StartDefaultTask */
    /**
     * @brief Function implementing the defaultTask thread.
     * @param argument: Not used
     * @retval None
     */
    /* USER CODE END Header_StartDefaultTask */
    void StartDefaultTask(void *argument)
    {
        /* USER CODE BEGIN 5 */
        /* Infinite loop */
        for(;;)
        {
            HAL_GPIO_TogglePin(GPIOK, GPIO_PIN_3);
            osDelay(500);
        }
        /* USER CODE END 5 */
    }
    
    /* USER CODE BEGIN Header_StartTask02 */
    /**
     * @brief Function implementing the myTask02 thread.
     * @param argument: Not used
     * @retval None
     */
    /* USER CODE END Header_StartTask02 */
    void StartTask02(void *argument)
    {
        /* USER CODE BEGIN StartTask02 */
        /* Infinite loop */
        for(;;)
        {
            HAL_GPIO_TogglePin(GPIOK, GPIO_PIN_4);
            osDelay(100);
        }
        /* USER CODE END StartTask02 */
    }
    
    /* USER CODE BEGIN Header_StartTask03 */
    /**
     * @brief Function implementing the myTask03 thread.
     * @param argument: Not used
     * @retval None
     */
    /* USER CODE END Header_StartTask03 */
    void StartTask03(void *argument)
    {
        /* USER CODE BEGIN StartTask03 */
        /* Infinite loop */
        for(;;)
        {
            HAL_GPIO_TogglePin(GPIOK, GPIO_PIN_5);
            osDelay(1000);
        }
        /* USER CODE END StartTask03 */
    }
    
    /* USER CODE BEGIN Header_StartTask04 */
    /**
     * @brief Function implementing the myTask04 thread.
     * @param argument: Not used
     * @retval None
     */
    /* USER CODE END Header_StartTask04 */
    void StartTask04(void *argument)
    {
        /* USER CODE BEGIN StartTask04 */
        /* Infinite loop */
        for(;;)
        {
            HAL_GPIO_TogglePin(GPIOK, GPIO_PIN_6);
            osDelay(2000);
        }
        /* USER CODE END StartTask04 */
    }
    
                           
  • 3.デバッガの設定

    ファームウェア書き込み⽤のデバッガを設定します。
    EWARMの「ワークスペース」ペインの「st_pfp_rtos_sample-st_pfp_rtos_sample」を右クリックし、プルダウンメニューの「オプション」をクリックします。

    • ewarm_optionイメージ

    オプションウィンドウのカテゴリ「デバッガ」をクリックし、「設定」タブの「ドライバ」のプルダウンメニューで「I-jet」を選択します。

    • debugger_settingイメージ

    オプションウィンドウのカテゴリ「I-jet」をクリックし、「インタフェース」タブの「インタフェース」ラジオボタンで「SWD」を選択し、「OK」ボタンをクリックします

    • debagger_i-jetイメージ
  • 4.ビルド、書き込み

    ファームウェアのビルドを実⾏し、MCUに書き込みます。
    ST版リファレンスボードとI-jetをSWD端⼦で接続し、PCとI-jetをUSBで接続します。
    EWARMの「ダウンロードしてデバッグ」ボタンをクリックし、ファームウェアのビルドと書き込み、デバッガを起動します。

    • ewarm_menu_buttonイメージ

    エラーが無ければデバッガが起動します。EWARMのデバッガメニューの「実⾏」ボタンをクリックし、プログラムを実⾏させます。

    • ewarm_debug_buttonイメージ

    すると、ST版リファレンスボード上の4つのLEDがそれぞれ異なるタイミングで点滅することが確認できます。

おわりに

  • 今回の記事ではST版リファレンスボードで動作するFreeRTOSを使⽤した簡単なマルチタスクのプログラムを作成しました。
    STM32CubeMXを使⽤することにより、FreeRTOSのタスクの設定までGUI上で⾏えることがわかりました。
    今後はFreeRTOSのキューやセマフォ等を使⽤したタスク間同期を⾏うプログラムを紹介していく予定です。
    また、ネクスティ エレクトロニクスの開発部隊では、取り扱い商材を活⽤した⾃社開発、受託開発(ハードウェア、ソフトウェア開発)なども実施しております。
    お客さまの困りごとの解決も含め寄り添って対応しますので、お気軽にお問合せください。