概要
STマイクロの環境を使用して、マイコン上でFreeRTOSを使用したLチカ環境を構築します。
環境
項目 | 使用環境 |
---|---|
マイコンボード | NUCLEO-F767ZI |
コード生成ツール | STM32CubeMX |
言語 | C言語 |
テンプレートコード生成手順
STM32F767ZI を指定します。
- Middleware の FRERTOS にチェックを入れます。
- 今回interface(API)は CMSIS_V1 としておきます。
- Tasks and Queues のタブからタスクを追加します。(今回は3つのLEDそれぞれを別タスクで動作させますので、タスクを3つ作りました)
HCLK=216MHzに設定します。(特に理由はありませんが、最速にしました)
オンボードの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に設定します。
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 */
}
動作確認
FreeRTOSで3スレッドLチカ(Qiita埋め込み用動画) pic.twitter.com/dO0AF1caEc
— takeru0x5569 (@cyebu1103) March 2, 2021