STM32 FreeRTOS Ver2 インターバルタイマーを使う

STM32 FreeRTOS Ver2 インターバルタイマーを使う

今回はインターバルタイマーでLチカしてみます。

投稿時の開発環境を記しておきます。

PC:Windows10 OS
IDE: STM32CubeIDE Version1.6.0
Configurator: STM32CubeMX Version6.2.1
Board: STM32Nucleo-F401RE

インターバルタイマーとは

マイコンを使っていると一定の時間で、仕事をさせたいことがあります。
そんな時にインターバルタイマーを使います。

今回は1秒毎にLEDをつけたり消したりしてみます。

プロジェクトを作成する

IDEを起動し、File- New – STM32 Project を選択し、Target Selection ウィンドウが出たら Board Selector タブを選択し Boards List から NUCLEO-F401RE を選択し Next ボタンを押します。

Project 名に F401RtosV2Timer と入力し、Finishボタンを押します。
Initialize all peripherals with their default Mode ? と聞いてくるので Yesを押します。

RTOSを使えるように設定する

Pinout & Configuration – Categories – Middleware – FREERTOS を選択し、

Mode の Interface で CMSIS_V2 を選択します。

その下の Configuration – Timers and Semaphores タブを選択し、 一番上(Timers)のAddボタンを押します。

New Timer のウィンドウが出てくるので、そのまま OK ボタンを押します。

タイムベース ソースを変更する

Categories – System Core – SYS を選択し、SYS Mode and Configuration – Mode で

Timebase Source を Systick から TIM10 に変更しておきます。

(FreeRTOSでは Systick 以外を使うことが推奨されているからです)

ビルドしてエラーがないことを確認しておきます。

コーディングと動作確認

main.c の次の2つの関数の下にタイマーのスタート処理を追加します。

myTimer01Handle = osTimerNew(Callback01, osTimerPeriodic, NULL, &myTimer01_attributes);
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

タイマーのスタート処理を書きます。

osTimerStart(myTimer01Handle, 1000U);

第1引数には osTimerNew()の戻り値を、第2引数にはインターバルをmsec単位で指定します。
今回は1秒毎に関数を呼ぶので、1000Uを指定しました。

インターバルタイマー関数 本体のコーディングを行います。
お馴染みの HAL_GPIO_TogglePin() を使ってLEDにつないでいる信号 (GPIOA5)に 0/1 を書き込みます。

void Callback01(void *argument)
{
  /* USER CODE BEGIN Callback01 */
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  /* USER CODE END Callback01 */
}

ビルドしてエラーがないことを確認してプログラムを実行します。

LD2が1秒周期で点滅すれば成功です。

RTOSの設定を行うことで、多くの作業をIDEが行ってくれるので楽チンできますね。

いかがでしたか?

うまく動作確認できましたか?

お疲れさまでした。

FreeRTOS_V2カテゴリの最新記事