5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

STM32マイコンでFerrRTOSを動かす

Posted at

概要

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

環境

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

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

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

1. マイコンの選択

STM32F767ZI を指定します。

image.png

2. FreeRTOSの追加

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

image.png

image.png

3. クロックの設定

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

image.png

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に設定します。

image.png

5. コードの生成

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

image.png

プロジェクトの形式

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

image.png

タスク内の動作記述

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 */
}

動作確認

5
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?