ESP32-C6でRISC-V入門:ツールチェーン構築からGPIO点滅まで

投稿者: | 2025年9月25日

この記事で得られること

  • RISC-Vで動くESP-IDF開発環境の最短セットアップ

  • esp32c6向けプロジェクト雛形の作成と書き込み

  • LED点滅(GPIO制御)の最小コード

  • gdbによる基本デバッグ手順

  • よくあるエラーの潰し方


前提と対象読者

  • Cの基礎とターミナル操作がわかる人

  • ホストOS:Windows 10/11、macOS、Ubuntu 22.04 いずれか

  • ボード:ESP32-C6搭載開発ボード(例:ESP32-C6-DevKitC)

*オンボードLEDが無い場合は抵抗付きLEDを任意GPIOに接続


準備物

  • USBケーブル(データ対応)

  • Python 3.8+ / Git

  • シリアルポート権限(Linuxはdialout等のグループにユーザーを追加)


ステップ1:ESP-IDFの導入

Windows(最短)

  1. 公式 ESP-IDF Tools Installer を使用

  2. インストール後、ESP-IDF PowerShell を起動

  3. ターゲット設定:


idf.py set-target esp32c6

macOS / Ubuntu


# 任意の作業ディレクトリで

git clone --recursive https://github.com/espressif/esp-idf.git

cd esp-idf

# 安定版ブランチ例(必要に応じて更新)

git checkout release/v5.2

git submodule update --init --recursive

./install.sh esp32c6

# シェルに環境を反映

. ./export.sh

idf.py --version

ヒント:毎回開くシェルで. ./export.shを実行するか、シェルの初期化ファイルに追記。


ステップ2:プロジェクト作成とビルド


idf.py create-project gpio_blink

cd gpio_blink

idf.py set-target esp32c6

idf.py build

成功すればbuild/にファームウェアが生成される。


ステップ3:GPIO点滅の最小コード

main/main.c


#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "driver/gpio.h"

#include "esp_log.h"

static const char *TAG = "BLINK";

// 開発ボードに応じて変更。ESP32-C6 DevKitCの例: GPIO8 など

#ifndef BLINK_GPIO

#define BLINK_GPIO GPIO_NUM_8

#endif

void app_main(void) {

gpio_config_t io_conf = {

.pin_bit_mask = 1ULL << BLINK_GPIO,

.mode = GPIO_MODE_OUTPUT,

.pull_up_en = 0,

.pull_down_en = 0,

.intr_type = GPIO_INTR_DISABLE

};

gpio_config(&io_conf);

bool level = false;

while (1) {

gpio_set_level(BLINK_GPIO, level);

ESP_LOGI(TAG, "LED: %s", level ? "ON" : "OFF");

level = !level;

vTaskDelay(pdMS_TO_TICKS(500));

}

}

main/CMakeLists.txt


idf_component_register(SRCS "main.c"

INCLUDE_DIRS ".")

オンボードLEDが無い場合は、BLINK_GPIOを外付けLEDの接続ピンに合わせる。


ステップ4:書き込みとシリアルモニタ

  1. ボードをUSB接続

  2. ポート確認

  • Windows: デバイスマネージャでCOMx

  • macOS/Linux: ls /dev/tty.* or ls /dev/ttyACM*

  1. フラッシュ+モニタ

idf.py -p <PORT> flash monitor

# 例: idf.py -p COM7 flash monitor

# 例: idf.py -p /dev/ttyACM0 flash monitor

ログにLED: ON/OFFが交互に表示され、LEDが点滅すれば成功。

モニタ終了:Ctrl+]


ステップ5:gdbでRISC-Vをステップ実行(入門)

ESP32-C6はUSB経由のSerial/JTAGに対応。追加アダプタ無しで基本デバッグが可能な構成が多い。


# ビルドにデバッグ情報を含める(デフォルトでOK)

idf.py -p <PORT> flash

# gdb起動(別ターミナル)

idf.py gdb

# 典型操作

(gdb) target remote :3333

(gdb) break app_main

(gdb) continue

(gdb) next

(gdb) print level

OpenOCDが裏で起動し、3333に接続。接続不可時はドライバやポートの競合を確認。


付録:省電力の最小サンプル(おまけ)


#include "esp_sleep.h"

void app_main(void) {

// 省電力が見たい場合はLED点滅の代わりにこちらを有効化

esp_sleep_enable_timer_wakeup(5 * 1000 * 1000); // 5秒

esp_deep_sleep_start();

}

実電流計測は次回記事で実施。USB測定器やDMMでの注意点も扱う。


トラブルシューティング速攻表

  • Failed to open port:ポート名誤り。占有アプリ(ターミナル/別モニタ)を終了。Linuxはsudo usermod -aG dialout $USER後に再ログイン。

  • Permission denied(macOS):初回接続でアクセサリ許可ダイアログを承認。/dev/cu.usbmodem*を使用。

  • Timed out waiting for packet header:ブートモード移行失敗。BOOTボタン押下→ENリセットやAuto-RSTを確認。

  • LEDが点かない:GPIO番号の再確認。外付けなら抵抗向きとGND/3V3の誤配線を確認。

  • gdb接続不可:他プロセスが3333使用。OpenOCDログでエラーを特定。


次回予告

  • 割り込みとタイマで正確な点滅周期を作る

  • FreeRTOSタスク設計とSystemViewでのトレース

  • Light/Deep-sleepの実測と削減テク


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です