今回はインターバルタイマーで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が行ってくれるので楽チンできますね。
いかがでしたか?
うまく動作確認できましたか?
お疲れさまでした。