動作環境
Ubuntu 18.04 LTS
STM32CubeMX v5.2.1
STM32CubeIDE v1.0.1
FreeRTOS Kernel V10.0.1
基板:STM32L476RGT6 64 PINS
概要
- FreeRTOSでSTM32L476をLチカする
Ubuntu 18.04 LTS > STM32L476 > 環境構築 (STM32CubeMX + STM32CubeIDE) + Lチカ || TrueStudioとの連携は失敗
ではRTOSなしでLチカをしたが、RTOSを用いるLチカを実施してみた。
参考
上記は2017年の記事で、自分の環境とはいくつか違う部分があった。FreeRTOSのバージョンの違いに起因するのだろうか?
実施
以下におおまかな流れを示す。一部、上記の @46sayu さんの手順を参考にしているが、自分の環境と異なる部分は適宜変更をした。
- STM32CubeIDEを起動する
- STM32Projectを新規作成する
- MCU/MPU Selectorにて「STM32L476RG」で検索 (Part Number Search)
- MCUs/MPUs Listにて「STM32L476RG」を選択しプロジェクトを作成
- Project Name: 任意 (例: L476_RTOS_LedDrive_190703)
- Next
- Finishにてプロジェクト作成
- Pinoutにて「21(PA5)」をGPIO_Outputに変更
- あとでこのピンをLチカする
- Pinout & Configurationにおいて左メニューの「MiddleWare」を選択
- FREERTOSを選択
- ModeのInterfaceを変更
- DisableからCMSYS_V1へ
- ConfigurationのTasks and Queuesを選択
- TasksにてAddして、以下のように変更する
- TaskName: LedTask (任意の名前)
- Priority: osPriorityAboveNormal
- Entry Function: StartLedTask (任意の名前)
- OKを押してタスクを追加する
- Timerbase Sourceを変更する
- File -> Save Allする
- 「Do you want generate Code?」にてYesを選択
- Src/にfreertos.cが追加される
以上でRTOSの準備はできた。
LEDタスク
Src/main.cの中にLedTaskがある。
main.c
void StartLedTask(void const * argument)
{
/* USER CODE BEGIN StartLedTask */
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END StartLedTask */
}
上記を以下のようにする。
main.c
void StartLedTask(void const * argument)
{
/* USER CODE BEGIN StartLedTask */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
osDelay(1000); // msec
}
/* USER CODE END StartLedTask */
}
1秒ごとのLED点灯、消灯になる。
ビルドから実行まで
- `9 ビルドする
- `10 Debug Asにて「STM32 MCU C/C++ Application」を選択する
- `11 Edit configurationにてOKを押す
- `12 デバッグ画面になるのでResumeを押して実行する
LD2という部分が1秒おきに点灯、消灯します。
実行例
緑色に点灯しているのがLD2です。
所感
RTOSがこんなに簡単に使えるというのはすごい。
リンク
以下の記事の方が画像が多くわかりやすいかもです。