STM32マイコンでFerrRTOSを動かす


概要

STマイクロの環境を使用して、マイコン上でFreeRTOSを使用したLチカ環境を構築します。

環境

項目 使用環境
マイコンボード NUCLEO-F767ZI
コード生成ツール STM32CubeMX
言語 C言語

テンプレートコード生成手順

  1. マイコンの選択
  2. FreeRTOSの追加
  3. クロックの設定
  4. GPIOの設定
  5. コードの生成

1. マイコンの選択

STM32F767ZI を指定します。

2. FreeRTOSの追加

  • MiddlewareFRERTOS にチェックを入れます。
  • 今回interface(API)は CMSIS_V1 としておきます。
  • Tasks and Queues のタブからタスクを追加します。(今回は3つのLEDそれぞれを別タスクで動作させますので、タスクを3つ作りました)

3. クロックの設定

HCLK=216MHzに設定します。(特に理由はありませんが、最速にしました)

4. GPIOの設定

オンボードのLEDが3つ(緑、青、赤)あります。

ピンの割り当ては以下の通りだそうです。
https://os.mbed.com/questions/86685/Cant-find-led3-pin/

    LED1        = PB_0,  // LD1 = GREEN
    LED2        = PB_7,  // Blue
    LED3        = PB_14, // Red

この3つのポートをGPIO_OUTに設定します。

5. コードの生成

GENERATE CODE を押してコードを生成します。

プロジェクトの形式

私は EWARM の環境で使用しますので、 デフォルトのEWARMのままにしています。
CubeIDE等で開発したい方はここの設定を変更してみてください。

タスク内の動作記述

main.cを参照すると、 CumeMXの Entity Function にて指定した名称の関数が用意されています。
この関数がマルチスレッドで動作しています。

各スレッド内に GPIOをトグルさせる処理を記述し、異なるディレイをかけるように記述しました。

main.c
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
    osDelay(500);//ms
  }
  /* USER CODE END 5 */
}

/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the Tssk2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
    osDelay(1000);//ms
  }
  /* USER CODE END StartTask02 */
}

/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the Task3 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
    osDelay(2000);//ms
  }
  /* USER CODE END StartTask03 */
}

動作確認