Contents
1. 本教材の特徴(執筆時点)
- 対象:マイコン上で C 言語を動かしたい初心者・大学生・技術系新人エンジニア
- 構成:全 10 章+付録。
- 開発環境のセットアップ
- 基本文法と制御構文
- ポインタとメモリ管理
- ビット演算・レジスタマッピング
- 割込み処理の基礎
- GPIO / LED 制御
- タイマ/PWM の利用
- UART 通信
- 実機デバッグ(GDB・VS Code)
- 総合演習とコードレビュー
- 学習サイクル:読む → 手を動かす → 動作確認 を各章で繰り返す設計。
- 付属リソース
- 演習問題(解答例付き)とチェックリスト
- 30 分前後の短編動画(全 20 本以上、章ごとに対応)
- GitHub リポジトリ
naoyoshinori/embedded-c-starterkitにサンプルコードを常時公開
※注意:リンク先や更新日などは執筆時点の情報です。将来的に変更される可能性がありますので、最新情報は公式サイトやリポジトリをご確認ください。
2. 学習ロードマップとスケジュール例(4 週間プラン)
| 週 | 主な学習テーマ | 推奨教材・動画 |
|---|---|---|
| 1 | 開発環境構築、Hello World | 第 1 章 + 環境構築動画(30 分) |
| 2 | 基本文法・ポインタ基礎 | 第 2〜3 章 + 文法解説動画(45 分) |
| 3 | ビット操作・割込み実装 | 第 4〜5 章 + 割込みハンドラ動画(35 分) |
| 4 | 周辺機器制御(GPIO/タイマ/UART)とデバッグ | 第 6〜9 章 + デバッグ実演動画(50 分) |
学習成果物例
- Week 1:
hello.cを GitHub にプッシュ - Week 2:四則演算電卓
calc.c、コードレビューを受ける - Week 3:LED 点灯と割込みでトグルする
led_irq.c - Week 4:UART ログ出力付きデバイス制御
periph_demo.cとデバッグレポート(PDF)
進捗管理ツールの活用
| ツール | 用途 |
|---|---|
| Trello | カードで「未着手」「実装中」「レビュー待ち」などステータスを可視化 |
| Notion | 学習時間・理解度(1‑5)を記録し、週次の振り返りページを作成 |
3. ハイブリッド開発環境の構築手順
3-1. WSL2 (Ubuntu) に必要なツールをインストール
|
1 2 3 4 5 6 7 8 9 10 11 |
# PowerShell(管理者)で WSL のインストール wsl --install -d Ubuntu # Ubuntu 起動後に実行 sudo apt update && sudo apt upgrade -y sudo apt install build-essential gdb gcc-arm-none-eabi binutils-arm-none-eabi -y # バージョン確認(例) gcc --version # 12.2.0 以上推奨 arm-none-eabi-gcc --version # 10.3.1 以上推奨 |
3-2. Visual Studio Community と連携させる手順
| 手順 | 内容 |
|---|---|
| 1 | Microsoft Store から Visual Studio Community 2022 をインストール |
| 2 | インストーラで「Linux 用 C++ 開発」ワークロードを選択 |
| 3 | ツール → オプション → クロスプラットフォーム → Linux の設定 で WSL Ubuntu を追加 |
| 4 | 新規プロジェクト作成時に「Linux コンソール アプリケーション」を選択し、ビルド構成を Debug/Release に設定 |
| 5 | デバッグ構成で Remote GDB Debugger を指定し、パス /usr/bin/gdb(WSL 内)を入力 |
3-3. VS Code のデバッグ設定例 (.vscode/launch.json)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch Embedded", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/periph_demo.elf", "miDebuggerPath": "/usr/bin/gdb-multiarch", "cwd": "${workspaceFolder}", "preLaunchTask": "make", "externalConsole": false } ] } |
ポイント:WSL 上のツールチェーンと Windows の IDE がシームレスに連携できるため、Linux コマンドはそのまま VS Code から呼び出せます。
4. C 言語基礎文法とメモリ管理の要点
4-1. 基本構文まとめ
| 項目 | 説明 |
|---|---|
| 変数宣言 | 型名+識別子。例:int counter = 0; |
| 定数 | const 修飾で変更不可にする。例:const float VCC = 3.3f; |
| 制御構文 | if / else, switch, for, while, do‑while |
| 演算子 | 算術、ビット、論理、比較、代入の順に理解する |
4-2. メモリモデルとポインタ安全策
- スタック vs ヒープ:組込みではスタック領域が限られるため、動的確保は必要最小限に。
- NULL チェック:
malloc後は必ずif (ptr == NULL)でエラー処理。 volatile修飾子:ハードウェアレジスタや割込みで変更される変数には必ず付与し、最適化による削除を防止。
ポインタとレジスタアクセスの例(ARM Cortex‑M)
|
1 2 3 4 5 6 7 8 9 |
#define GPIOA_BASE ((volatile uint32_t*)0x40020000U) #define GPIO_MODER (*(GPIOA_BASE + 0)) // offset 0x00 static void gpio_init(void) { /* PA5 を出力に設定 (MODER[11:10] = 01) */ GPIO_MODER &= ~(0x3U << (5 * 2)); // ビットクリア GPIO_MODER |= (0x1U << (5 * 2)); // ビットセット } |
5. ビット演算・共用体・割込み処理の実装例
5-1. ビットマスクとシフト
|
1 2 3 4 5 6 7 8 9 |
#define LED_PIN (1U << 5) // PA5 = 0b0010_0000 #define BTN_PIN (1U << 3) // PA3 = 0b0000_1000 /* LED ON */ GPIO_ODR |= LED_PIN; /* LED OFF */ GPIO_ODR &= ~LED_PIN; |
5-2. 共用体によるレジスタマッピング
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
typedef union { uint32_t WORD; struct { uint16_t LOW; // 下位 16 ビット uint16_t HIGH; // 上位 16 ビット }; } REG32; volatile REG32 *TIM1_CR = (REG32 *)0x40012C00U; /* プリスケーラ設定(下位レジスタ) */ TIM1_CR->LOW = 0x0040; |
5-3. 割込みハンドラとデバウンス処理(STM32F4 系)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* EXTI3 の割込みハンドラ */ void EXTI3_IRQHandler(void) { if (EXTI->PR & BTN_PIN) { // フラグ確認 EXTI->PR = BTN_PIN; // クリア(書き込みでクリア) GPIO_ODR ^= LED_PIN; // LED トグル } } /* ボタン入力のソフトウェアデバウンス */ bool button_pressed(void) { static uint32_t last_tick = 0; if ((GPIO_IDR & BTN_PIN) == 0) { // 押下検知 if (HAL_GetTick() - last_tick > 20) { // 20 ms デバウンス last_tick = HAL_GetTick(); return true; } } return false; } |
ポイント:ビット演算でレジスタ操作を最小化し、割込みハンドラはできるだけ短く保つことでリアルタイム性を確保します。
6. 周辺機器制御と実機デバッグフロー
6-1. GPIO・タイマ・UART のサンプルコード(STM32F4)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/* ---------- GPIO ---------- */ static void gpio_init(void) { RCC->AHB1ENR |= (1U << 0); // GPIOA クロック有効化 GPIOA->MODER &= ~(0x3U << (5 * 2)); // PA5 の設定クリア GPIOA->MODER |= (0x1U << (5 * 2)); // 出力に設定 } /* ---------- タイマ(TIM2)---------- */ static void timer_init(void) { RCC->APB1ENR |= (1U << 0); // TIM2 クロック有効化 TIM2->PSC = 8399; // プリスケーラ (84MHz/8400=10kHz) TIM2->ARR = 9999; // 1 秒周期 TIM2->DIER |= (1U << 0); // Update 割込み有効化 NVIC_EnableIRQ(TIM2_IRQn); TIM2->CR1 |= (1U << 0); // カウンタ開始 } /* ---------- UART(USART2)---------- */ static void uart_init(void) { RCC->APB1ENR |= (1U << 17); // USART2 クロック有効化 /* GPIOA の AF7 設定(PA2, PA3) */ GPIOA->MODER &= ~((3U << (2 * 2)) | (3U << (3 * 2))); GPIOA->MODER |= ((2U << (2 * 2)) | (2U << (3 * 2))); USART2->BRR = 0x1117; // 115200 bps @84MHz USART2->CR1 = (1U << 2) | (1U << 3); // TE, RE 有効化 USART2->CR1 |= (1U << 13); // UE(UART 有効化) } /* UART 送信関数 */ static void uart_putc(char c) { while (!(USART2->SR & (1U << 7))) {} // TXE 待ち USART2->DR = (uint16_t)c; } |
6-2. デバッグ手順(GDB + VS Code)
- OpenOCD でターゲットに接続
bash
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg - GDB 起動(WSL 内)
bash
arm-none-eabi-gdb build/periph_demo.elf
(gdb) target remote localhost:3333
(gdb) monitor reset halt
(gdb) load
(gdb) break main
(gdb) continue - VS Code からデバッグ開始
launch.jsonに上記と同じmiDebuggerPathとプログラムパスを設定。- UI 上の「▶」でブレークポイント・変数ウォッチが利用可能。
デバッグ時に意識したいこと
| 項目 | コツ |
|---|---|
| シリアルログ | uart_putc で状態を随時出力し、GDB が使えない場面でもトレースできる |
| レジスタ監視 | VS Code の Watch に GPIOA->ODR や TIM2->CNT を追加 |
| 割込みステップイン | GDB の stepi で ISR 内部まで逐次実行し、フラグクリア漏れを検証 |
7. 学習進捗管理と次のステップ
7-1. 今すぐできるアクションプラン
| フェーズ | アクション |
|---|---|
| ① 環境構築 | WSL2 と VS Community をインストールし、GitHub リポジトリをクローン。hello.c をビルド・実機で走らせる。 |
| ② 基本文法の定着 | 演習問題 5 件(変数・制御構文)を解き、プルリクエストでコードレビューを受ける。 |
| ③ ビット操作体験 | led_irq.c を作成し、割込みハンドラで LED トグルを実装。デバッグログを残す。 |
| ④ 周辺機器統合 | UART とタイマを組み合わせた「1 秒ごとに文字列送信」サンプルを完成させる。 |
7-2. 次の学習領域(基礎が固まったら)
| スキル | 推奨教材・リソース |
|---|---|
| FreeRTOS 入門 | FreeRTOS 公式ガイド + FreeRTOS/Source のサンプルプロジェクト |
| CMSIS‑DSP ライブラリ | ARM Docs の CMSIS‑DSP チュートリアル、FFT デモコード |
| FatFS ファイルシステム | FatFS ユーザーガイド + SD カード実装例(GitHub) |
| テスト自動化 | Unity テストフレームワークでユニットテストを組む方法 |
これらは「マイコン上での高度な機能」へステップアップするための土台です。まずはシンプルなタスク切り替えやデジタル信号処理を体感し、次にファイル入出力など永続化要素へ拡張すると学習効率が上がります。
8. まとめと読者への呼びかけ
- 本ガイドは 「環境構築 → 基礎文法 → ハードウェア制御 → デバッグ」 の流れで、初心者でも実機にコードを書き込めるまでを網羅しています。
- 各章の演習と動画は 短時間で完結 するよう設計されているので、忙しい社会人・学生でも無理なく進められます。
- 学習が終わったら必ず GitHub にコードをプッシュし、レビューを受ける ことで、実務に近いフィードバックサイクルを体験してください。
今すぐできること(5 分で始めよう)
- 本ページ下部のリンクから GitHub リポジトリをクローン
bash
git clone https://github.com/naoyoshinori/embedded-c-starterkit.git
cd embedded-c-starterkit README.mdに記載された「Hello World」手順を実行し、WSL 上でビルド- ビルドが通ったら VS Code でデバッグ構成 (
launch.json) を作成し、ブレークポイント を設定してみる
これだけで「開発環境のセットアップ完了」から「コードの動作確認」までの一連の流れを体感できます。次は章ごとの演習に取り組んで、実機への書き込みまで挑戦してください。
学び続ける姿勢 が最も重要です。疑問点やエラーは必ず検索・質問し、コミュニティで情報を共有することで、より深い理解へと繋がります。
本稿は執筆時点の教材・ツール情報に基づいて作成しています。最新情報は公式リポジトリやメーカーサイトをご確認ください。