inflearn logo
知識共有
inflearn logo

STM32(Blue Pill)ファームウェア開発入門 - 追加部品なしで学ぶCubeIDE & FreeRTOS

私たちが毎日使っているスマートウォッチ、ワイヤレスイヤホン、ロボット掃除機、自動車、ドローン、キオスク、医療機器には、ユーザーからの入力を受け取り、状況を判断し、装置を制御する小さなコンピューターが組み込まれています。 このようなシステムを組み込みシステム(Embedded System)と呼びます。 しかし、組み込みシステムを初めて学ぼうとすると、思った以上に難しいものです。インターネットでLEDを点灯させる例は簡単に見つけられますが、 "ボタンを押すと電子機器はどのように反応するのか?" "決められた時間ごとに、どのように正確に動作させるのか?" "複数の機能をどのように同時に実行するのか?" "電源を切って入れ直しても、設定値をどのように記憶しておくのか?" といった、実際の電子機器が動作する原理を体系的に学ぶのは容易ではありません。 この講義では、複雑な理論やコードを暗記するのではなく、小さな開発ボードを実際に動かしながら、組み込みシステムの核心となる原理を一つずつ理解していきます。 LEDやボタンを制御する最も基本的な実習から始め、Interrupt、Timer、PWM、ADC、Memory、Watchdogなど、実際の電子機器を作る際に使用される重要な機能を段階的に学習します。 最後には、これまで個別に学んできた機能をRTOS(Real-Time Operating System)を活用して、複数の機能が同時に動作する一つのシステムとして構築します。 単に特定の開発ボードの使い方を学ぶのではなく、これからさまざまな電子機器や開発ボードに触れる際に、ハードウェアがソフトウェアによってどのように動作するのかを理解し、自分で実装できる基礎力を身につけることが、この講義の目標です。

9名 が受講中です。

難易度 入門

受講期間 無制限

stm32
stm32
stm32cubeide
stm32cubeide
embedded-systems
embedded-systems
C
C
FreeRTOS
FreeRTOS
stm32
stm32
stm32cubeide
stm32cubeide
embedded-systems
embedded-systems
C
C
FreeRTOS
FreeRTOS

受講後に得られること

  • 電子機器がソフトウェアで動作する仕組み

  • 電子機器システムの主要機能を理解する

  • ソフトウェアデバッグ能力

  • マルチタスク(複数の機能が同時に動作)プログラミング

STM32ファームウェアを自分で開発する

GPIOからFreeRTOS総合プロジェクトまで

STM32を買ったけれど、LED Blinkの次に何を学べばよいのか途方に暮れていませんか?

GPIOを一度オンにしてみたり、インターネット上のサンプルコードをコピーしてADCやPWMを動かしてみたりするところまでは、難しくありません。

しかし、いざ自分でプログラムを作ろうとすると、疑問が生じます。

Interruptはなぜ使うのだろうか?
TimerはHAL_Delayと何が違うのだろうか?
ADCの値は実際にどのように読み取るのだろうか?
PWMの周期とDuty Ratioはどのように決まるのだろうか?
電源を切って入れ直してもデータを残すにはどうすればよいのだろうか?
FreeRTOSのTask、Priority、Queueはなぜ必要なのだろうか?

この講義は、こうした疑問に答えるために作られました。

STM32F103C8T6ベースのBlue PillとSTM32CubeIDEを使用して、GPIOから割り込み、タイマー、ADC、PWM、フラッシュメモリ、FreeRTOSまでを自分で実装します。

単にHAL関数の使い方を列挙する講義ではありません。

1つの機能を学んで実際に動かし、変数とMCUの動作を確認した後、最後にはこれまで学んだ機能を組み合わせてFreeRTOSベースの小さな組み込みシステムを完成させます。


LED点滅で止まらないでください

STM32を初めて学ぶ場合、通常は次のように始めます。

HAL_GPIO_TogglePin()を利用してLEDを点滅させ、HAL_Delay()の数値を変更しながら動作を確認します。

しかし、実際の組み込みプログラムではこれだけでは不十分です。

ボタンやセンサーのイベントを即座に処理し、正確な時間間隔でタスクを実行し、アナログ信号を読み取り、PWMを生成し、必要なデータをFlashに保存する必要があります。

システムが少し複雑になると、1つのwhile(1)の中ですべての機能を処理するのも難しくなります。

そのため、最後にFreeRTOSが登場します。

この講義は、LED Blinkから出発し、FreeRTOSまで自然につながる学習の流れで構成されています。

GPIO ↓ 外部割り込み ↓ タイマー割り込み ↓ ADC ↓ PWM ↓ 入力キャプチャ ↓ フラッシュメモリ ↓ FreeRTOSタスク ↓ 優先度 / タスク状態 ↓ キュー ↓ FreeRTOS総合プロジェクト

各機能を個別に学んで終わるのではなく、なぜ必要なのかを理解したうえで、次の機能へとつなげていきます。


この講義で得られること

受講前受講後STM32CubeIDEが難しく感じられるプロジェクト作成からデバッグまで自分で進められるHALコードをコピーして使用HAL APIがどのような役割を果たすのか理解できるLED Blink程度しか実装できないGPIO・Interrupt・Timer・ADC・PWMを自分で実装できるInterruptがなぜ必要なのかわからないPollingとInterruptの違いを説明できるTimerの設定値が難しく感じられるPrescaler・Periodの意味を理解できるADCの数値だけを確認するADC値を電圧と温度に変換できるPWMを単純な出力機能としてのみ理解している周期・Duty Ratio・Input Captureまで関連付けて理解できる電源 OFF時にデータが消えるFlash Memoryにデータを保存できるSuper Loopのみを使用するTaskベースのプログラム構造を理解できるRTOSの用語が難しく感じられるScheduler・Priority・Blocked・Suspendedを理解できるTask間でどのようにデータを受け渡すのかわからないQueueでデータを受け渡せる機能を1つずつ実習するADC + Queue + FreeRTOS + LEDの総合プロジェクトを実装できる


高価な機器なしで始めます

組み込み講義を受講していると、オシロスコープやロジックアナライザー、さまざまな種類のセンサーや開発ボードが必要になる場合があります。

この講義は、できるだけ少ない機材でSTM32の主要機能を体験することを目標に構成されています。

基本的に使用する機器は、次のようなものです。

準備物用途STM32F103C8T6 Blue Pill実習用MCUST-LinkダウンロードおよびデバッグUSBケーブル電源および接続Jumper Wire必要なピン接続PCSTM32CubeIDEの実行

別途オシロスコープがなくても、STM32CubeIDEのDebugとLive Expressionsを積極的に活用します。

変数が実際に変化する様子を目で確認しながら、プログラムがどのように動作するのかを理解します。

たとえばADCの授業では、単にコードを実行して終わりにするのではなく、

ADC生値 ↓ 電圧 ↓ 温度

の変化を直接確認します。

FreeRTOSの授業では:

タスクの優先度 タスクの動作回数 キューのデータ数 送信値 受信値

Live Expressionsで確認しながら、RTOSの動作を理解します。


単にコードを打ち込んで真似するだけの講義ではありません

この講義では、新しい機能が登場するたびに、まず**「なぜ必要なのか?」**を説明します。

例えばInterruptを学ぶ前に、Polling方式の問題について考えます。

Timerを学ぶ前に、HAL_Delay()だけを使用した場合の限界を確認します。

FreeRTOSを学ぶ前には、Super Loop構造で複数の機能を同時に処理するとどのような問題が生じるのかをまず確認します。

Queueを学ぶ前に、互いに独立して実行されていた2つのTaskの間でデータを渡さなければならない状況について考えてみます。

したがって、授業の基本的な流れは常に次のとおりです。

問題発見 ↓ 概念理解 ↓ CubeMX設定 ↓ CubeIDEでコード作成 ↓ Debug ↓ 実際の動作確認

関数を暗記することよりも、なぜその関数を使うのかを理解することに重点を置きました。


STM32CubeMXとCubeIDEを一緒に使用します

STM32開発では、MCUのすべてのRegisterを最初から直接設定することもできます。

しかし、入門段階では、GPIOを1つ使うために数多くのレジスタから勉強し始め、肝心の開発全体の流れを見失いやすくなります。

この講義では、STM32CubeMXを利用してPeripheralを設定し、STM32 HAL Libraryを利用してプログラムを作成します。

CubeMX → MCUとPeripheralの設定 CubeIDE → コード作成 HAL Library → MCU機能の制御 Debugger → 実際の動作確認

これを通じて、STM32プロジェクトが生成され、Peripheralが初期化され、ユーザーコードが実行される一連の流れを学びます。


GPIOから始めます

最初からRTOSを扱うことはしません。

最も基本的なGPIOから始めます。

GPIOとは何か、MCUのピンをどのようにInputとOutputとして使用するのか、Source方式とSink方式とは何かを理解した後、実際のLEDを制御します。

次に、単純な出力からイベント処理へと進みます。

GPIO Output ↓ External Interrupt ↓ Timer Interrupt

このように機能が一つずつ拡張されていきます。


Pollingだけを使用するわけではありません

ボタンの状態を継続的に確認する方法と、割り込みを利用して必要な瞬間にのみ処理する方法には違いがあります。

External Interruptの実習では、Rising EdgeとFalling Edgeを理解し、Callback関数がどのように呼び出されるかも実際に確認します。

Timer Interruptでは、ピンがなくても一定時間ごとにイベントが発生する仕組みを実習します。

したがって、単なるコード作成だけでなく:

イベント発生 ↓ 割り込み ↓ コールバック ↓ ユーザーコード実行

という組み込みプログラムの重要な流れを理解できます。


ADCで実際の値を読み取ります

Digital信号だけを扱うわけではありません。

STM32のADCを利用して、アナログ値をデジタル値に変換する過程も学習します。

STM32内蔵温度センサーを使用し、別途センサーを追加せずにADCを実習します。

内部温度センサー ↓ ADC ↓ ADC生値 ↓ 電圧 ↓ 温度

単にADCの数値を読み取るだけで終わらず、ADC値が実際の物理量にどのように変換されるのかまでつなげて理解します。


PWMは理論と実習に分けて理解します

PWMはLEDの明るさ制御程度のものとして説明されることもありますが、実際の組み込みシステムでは非常に重要な機能です。

講義ではPWMの:

Frequency
Period
Duty Ratio

関係をまず理解します。

その後、CubeMXのTimer設定を利用して、実際にPWMを生成します。

Input Captureを通じてRising EdgeとFalling EdgeをCaptureし、入力信号の周期とDuty Ratioを理解するプロセスも体験します。

つまり、

PWMを作る

で終わるのではなく、

PWMとは何かを理解する ↓ PWMを生成する ↓ PWMの時間を測定する

まで続きます。


電源が切れても値を残してみます

RAMの変数は電源を切ると消えてしまいます。

では、製品の設定値や使用回数のように、電源を切って入れ直しても保持する必要があるデータは、どこに保存すればよいのでしょうか?

Flash Memoryの実習では、データを:

ロック解除 ↓ 消去 ↓ 書き込み ↓ 読み出し

順番で保存します。

Boot Counterの例を通じて、MCUがResetされるたびに値が増加し、電源を切って入れ直しても以前の値が残っていることを確認します。

これにより揮発性メモリと不揮発性メモリの違いを実際のコードで体験します。


そしてFreeRTOSを始めます

周辺機器の基本を体験した後、FreeRTOSへ進みます。

最初から難しいRTOSの機能をすべて扱うわけではありません。

まず問いかけます。

「なぜRTOSが必要なのか?」

Super Loopで複数の機能を実行する際に発生し得る問題を確認し、プログラムをTaskに分割する理由から理解します。

スーパーループ タスク A → タスク B → タスク C → 繰り返し

で、

FreeRTOS Task A ─┐ Task B ─┼→ Scheduler Task C ─┘

構造へと拡張します。


SchedulerとTask Stateを目で確認します

FreeRTOSで重要なのは、単にTaskを複数作ることではありません。

Taskがいつ実行され、いつ待機するのかを理解する必要があります。

講義では:

実行中 レディ ブロック サスペンド

状態を学習します。

osDelay()を呼び出したとき、CPUが停止するのではなく、該当するTaskがBlocked状態になり、別のTaskを実行できることも確認します。


Priorityは実際の実行にどのような影響を与えるのでしょうか?

2つのTaskのPriorityが同じ場合と、一方のTaskのPriorityを高くした場合を直接比較します。

LedTask Normal CounterTask Normal

で、

LedTask Normal CounterTask AboveNormal

に変更します。

Live Expressionsで各Taskの作業回数を観察しながら、Priorityの高いTaskがCPUの実行機会をどのように得るのかを確認します。

また、SuspendとResumeを利用して:

実行中 / レディ ↓ 中断 ↓ 再開 ↓ レディ

このプロセスも実習します。


Task間でデータを渡します

Taskを複数作成したら、次の疑問が生じます。

「SensorTaskが生成した値をControlTaskで使用するにはどうすればよいでしょうか?」

ここでQueueが登場します。

ProducerTask │ │ Put ▼ Queue │ │ Get ▼ ConsumerTask

ProducerとConsumerの概念を理解し、FIFO方式でデータを受け渡します。

また、ProducerがConsumerより速い場合:

Queueデータ増加 ↓ Queue Full ↓ Put失敗の可能性

状況も直接確認します。

Queueを単なるAPIではなく、TaskとTaskの間をつなぐデータ経路として理解できるように構成しました。


最後には1つのEmbedded Systemを完成させます

最後の第14講では、これまで学んだ内容を一つにまとめます。

プロジェクトのテーマは:

内部温度に応じてLEDの点滅速度を制御する

です。

STM32の内部温度センサーをADCで測定します。

SensorTaskで測定した温度を、Queueを使用してControlTaskに伝達します。

ControlTaskでは温度を判定し、LEDのトグル間隔を決定します。

LedTaskは決定された間隔でPB2 LEDを制御します。

内部温度センサー ↓ ADC ↓ センサータスク ↓ センサーキュー ↓ 制御タスク ↓ 点滅間隔_ms ↓ LEDタスク ↓ PB2 LED

MCUの温度が低いときは、LEDがゆっくり点滅します。

ドライヤーでMCUを加熱して内部温度が上昇すると:

温度 ↑ ↓ 点滅間隔 ↓ ↓ LED点滅速度 ↑

LEDがより速く点滅します。

授業で学んだADC、Queue、Task、Scheduler、osDelay()とGPIOが、1つのシステム内でつながる瞬間です。


この講義の学習ロードマップ

講義の主な内容 第1講 組み込みシステムとBlue Pillを知る 第2講 Blue Pillの開発環境を準備する 第3講 GPIOとHAL Libraryを理解する 第4講 GPIO OutputでLEDを制御する 第5講 External Interruptを理解する 第6講 Timer Interruptで時間を制御する 第7講 ADCでアナログ信号を読み取る 第8講 PWMとSPWMを理解する 第9講 PWM生成とInput Captureの実習 第10講 Flash Memoryにデータを保存する 第11講 RTOSが必要な理由と初めてのFreeRTOS実習 第12講 Task Priorityと状態制御 第13講 QueueでTask間のデータ伝達を行う 第14講 FreeRTOS総合プロジェクト

前半ではMCU Peripheralを一つずつ理解し、後半ではFreeRTOSを利用して複数の機能を一つのシステムとして連携させます。


このような方におすすめです

受講対象 おすすめの理由 STM32を初めて始める方 開発環境から段階的に始めます Arduinoの次のステップが気になる方 HALベースのSTM32開発の流れを体験できます 電気・電子・コンピューター関連の大学生 MCUの実習とRTOSの基本的な流れを学べます 卒業制作を準備している方 GPIO・ADC・PWM・Flash・RTOSの基本をつなげて学べます STM32のサンプルコードをコピーして使っていた方 コードがなぜ必要なのか、概念から説明します FreeRTOSを初めて学ぶ方 Task → Scheduler → Priority → Queueの順に進めます 組み込みファームウェアに興味がある非専攻の方 できるだけ実際の例と図を使って説明します ハードウェア設計の後にファームウェアまで学びたい方 MCUを直接動かすソフトウェアの流れを学べます


前提知識はどの程度必要でしょうか?

専門的な組み込み経験は必要ありません。

ただし、以下程度のC言語の基礎知識があれば、受講しやすくなります。

変数
if / else
for / while
関数
配列の基本概念

PointerやRTOSをあらかじめ詳しく知っている必要はありません。

講義で使用するコードが何を意味するのか、必要な部分から説明します。


この講義で扱う範囲

この講義の目標は、STM32のすべてのPeripheralを一度に扱うことではありません。

組み込みファームウェアを初めて学ぶ方がGPIOからFreeRTOSまでを一連の流れで経験することに重点を置きます。

そのため、GPIO、External Interrupt、Timer Interrupt、ADC、PWM、Input Capture、Flash Memory、FreeRTOS Task、Scheduler、Priority、Suspend/Resume、Queueを中心に進めます。

UART、SPI、I2C、CAN、USBなどの通信Peripheralや、Semaphore・Mutexのような高度なRTOS同期機能は、今回のコースの範囲から除外しました。

機能を多く列挙するよりも、各機能を実際に動作させ、次の概念へとつなげることを優先しました。


第1講と合わせて受講すると

「電子回路(開発ボード)を直接設計する ― 回路図からPCB Artworkまで」では、STM32を使ってハードウェアを作るプロセスを扱いました。

本講義ではSTM32を使用してハードウェアを動かすファームウェアを扱います。

2つの講義の関係は次のとおりです。

第1講義 回路設計 ↓ Schematic ↓ PCB Artwork ↓ 開発ボード完成 第2講義 開発環境 ↓ GPIO / Interrupt / ADC / PWM ↓ Flash ↓ FreeRTOS ↓ 組み込みシステム完成

ハードウェアとファームウェアの両方を学びたい方は、2つのコースを続けて学習できます。


単にLEDを点灯させるだけでは終わりません

この講義で重要なのは、コードの長さではありません。

STM32を学びながら、次の質問に自分で答えられるようになることが目標です。

なぜInterruptを使用するのか?

なぜTimerが必要なのか?

ADCの数値は何を意味するのか?

PWMの周期とデューティ比はどのように決まるのか?

なぜFlashを使うのか?

なぜプログラムを複数のTaskに分けるのか?

優先度が異なると、スケジューラはどのタスクを実行するのか?

Task間のデータはどのように伝達するのか?

これらの質問に答えられるなら、単にサンプルを 따라実行したのではなく、組み込みプログラムの構造を理解し始めたということです。


講義を終えると

最初は:

LEDをどうやって点灯する?

から始まります。

そして最後には:

センサーがデータを測定し   ↓ Taskがデータを伝達し   ↓ 別のTaskが判断し   ↓ 出力装置が反応する

1つのEmbedded Systemを自ら実装します。

STM32のすべての機能を暗記することが、この講義の目標ではありません。

MCUをどのように設定し、どのようにコードを記述し、どのように動作を確認し、複数の機能をどのように1つのシステムとして接続するのかを経験すること。

それがこの講義の目標です。


GPIOから始めてFreeRTOSまで。

STM32ファームウェア開発の最初の流れを実際に体験してみましょう。

こんな方に
おすすめです

学習対象は
誰でしょう?

  • 電子製品がどのように動くのか気になっていた方

  • 電子・コンピューター・AI関連の専攻を始める学生

  • Arduinoの次のステップに興味がある方(実務向けのMCU実装をお望みの方)

  • 卒業制作・キャップストーンデザインを準備する学生

  • 組み込み(電子製品)開発に興味はあるものの、どこから始めればよいか分からない方

前提知識、
必要でしょうか?

  • コンピューターの基本操作能力

  • C言語の基礎(ご存じなくても大丈夫です。)

  • 電子回路の基礎(ご存じなくても大丈夫です。)

こんにちは
jungukko5750です。

キャリア認証

51

受講生

8

受講レビュー

3

回答

4.8

講座評価

2

講座

講師紹介

こんにちは。
電子回路と組み込みシステムを研究・教育している電子工学博士(現職教授)です。

サムスン電子、中小企業の研究開発、政府R&D課題の遂行など、多様な産業現場を経験し、現在は大学で電子工学とAI分野を教えながら、学生と共にハードウェア設計および組み込みシステムを研究しています。

これまで数多くの学生を指導しながら、共通して発見した問題がありました。

多くの人がSTM32やESP32、Nordicのような開発ボードを使用してプログラムを作成することはできますが、開発ボード自体がどのように作られているかはよく知らないという点です。

インターネットで回路をそのまま真似して作ることはできますが、なぜそのように設計したのかを理解できなければ、新しい製品を自ら開発することは困難です。

そこで、この講義を作ることになりました。

この講義では、単に回路をなぞって描くのではなく、

  • なぜこのような回路を使用するのか

  • 部品はどのように選定するのか

  • PCBはどのように設計するのか

  • 実際の製品はどのように製作されるのか

を共に学び、一つの開発ボードが完成する全過程を直接経験することができます。

私は難しい理論よりも"実際に作りながら学ぶ教育"を大切に考えています。

皆さんが講義を終えた時には、単に開発ボードを使う人ではなく、

自分だけの電子回路と開発ボードを直接設計・製作できるエンジニアになっているはずです。


主な経歴

  • 電子工学博士

  • サムスン電子勤務

  • 政府R&D課題の遂行

  • 電子回路および組み込みシステム開発

  • STM32ベースのハードウェア設計

  • PCB設計および製品開発

  • 大学電子工学・AI分野の講義

  • 産学連携および企業技術開発の遂行


関心分野

  • 電子回路設計

  • PCBアートワーク設計

  • STM32および組み込みシステム

  • センサーおよびIoTシステム

  • デジタルヘルスケアデバイス

  • AIベースの組み込みシステム

  • 製品開発および量産

もっと見る
講座掲載日: 
最終更新日: 

受講レビュー

まだ十分な評価が集まっていない講座です。
ぜひ最初のレビューをお寄せください。

jungukko5750の他の講座

知識共有者の他の講座はこちら

似ている講座

同じ分野の他の講座を見てみましょう!

期間限定セール、あと5日日で終了

¥13,200

90%

¥16,542