2026年8月8日土曜日

FDK HY0020で遊んでみる(Zephyrで動かしてみる、デバッグプローブで書き込み・デバッグ)

Raspberry Pi デバッグプローブでHY0020に書き込みができたので、Zephyrを動かしてみます。

HY0020はnRF52832を搭載していますので、Zephyrをサポートしています。

まずはLチカを目指します。
サンプルボードのテンプレートをベースにスタートする例が多いですが、デバイスツリーに余計なものがあったりと、Zephyrの学習には少し冗長なので、なるべくシンプルな状態からスタートできるようにする方針で進めます。

VSCodeにnRF ConnectのExtensionをインストールし、それを使って開発環境を構築します。

nRF Connect for VSCodeのインストール

VSCodeを開き、画面左のExtensionアイコンからExtensionの検索を行います。
「nRF Connect for VS Code」を開き、インストールします。



インストールしてExtensionを有効にすると、下記のように画面左にnRF Connect for VS Codeのアイコンが追加されます。

SDKのインストール

インストールした後の初回のみ、SDKのインストールが必要です。
Welcome -> Manage SDKs -> Install SDK -> nRF Connect SDK -> 好きなバージョンを選択

しばらく待つとインストールされます。

プロジェクトの雛形を作成

nRF Connect for VS Codeのアイコンをクリックするとメニューが開きます。
Welcome -> Create a new application -> Create a blank application をクリックして新規プロジェクトを作成します。
作成するパスの入力を求められるので、任意のパスを入力します。


続いて、新規ボードを作成します。以下のように設定して作成します。


これでカスタムボードができました!
続いてBuild configurationを設定します。

左の Application -> (プロジェクト名) -> Add build configuration を選択。
Build configuration の設定画面が開くので、ボードに先ほど設定したボード名を入れる。
その他はそのままでOK。



画面下のGenerate Build Configuration ボタンをクリック

これでビルドの準備が整いました。

このままビルドしてもエラーが出るので、ファイルを作成していきます。

Lチカの準備:プログラム作成

デバイスツリーの追記

作成したボードのデバイスツリーを作成します。
/boards/(ベンダー名)/ボード名.dts
を開いてルートノード /{ ... }; に以下を追記します。
/ {
aliases {
// プログラムからled0という名前で呼び出せるようにする。
led0 = &my_led;
};

leds {
compatible = "gpio-leds";
my_led: led_0 {
// HY0020でLEDを接続するピン番号を指定
gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
label = "User LED";
};
};
};

Kconfig(pro.conf)の記載

Zephyrは必要な機能だけを有効化してメモリを節約するOSです。GPIO(ピンの入出力)機能を使うためのスイッチをオンにします。

  1. プロジェクト直下にあるprj.confを開きます。

  2. 以下の1行を追記して保存します。

    CONFIG_GPIO=y

main.cの記載

いよいよC言語でプログラムを書きます。Zephyrの最新の書き方(Devicetreeと連携した安全なGPIO操作)で実装します。

  1. src/main.cを開き、中身をすべて以下のコードに書き換えます。

    #include <zephyr/kernel.h>
    #include <zephyr/drivers/gpio.h>

    /* DTS aliases で定義した led0 を取得*/
    #define LED0_NODE DT_ALIAS(led0)

    /* ピンの情報を構造体として取得(ビルド時に紐づけられる)*/
    static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

    int main(void)
    {
    /* 1. デバイス(GPIOコントローラ)の準備ができているか確認 */
    if (!gpio_is_ready_dt(&led)) {
    return 0;
    }

    /* 2. ピンを出力モードに設定 */
    if(gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE) < 0) {
    return 0;
    }

    /* 3. 無限ループで点滅(Lチカ) */
    while(1){
    gpio_pin_toggle_dt(&led); /* ピンの状態を反転 */
    k_msleep(1000); /* 1000ms待機 */
    }

    return 0;
    }


    プロジェクトのビルド

    1. nRF Connectの「APPLICATIONS」パネルから Add Build Configuration をクリックします

    2. Board の選択欄で、作成したhy0020(Custom boardsカテゴリ)を選択します

    3. Build Configuration ボタンを押してビルドを実行します

    ターミナルにエラーが出ず、[100%] Built target zephyr_final などと表示されれば成功です。


    書き込みとデバッグ

    VSCodeのCortex-DebugというExtensionを使って書き込み・デバッグをしてみます。
    上記でビルドしたアプリケーションを開いておきます。

    Cortex-Debugのインストール

    Cortex-Debugがインストールされていなければインストールしましょう。
    VSCodeのExtensionから、Cortex-Debugをインストールします。


    launch.jsonの作成

    プロジェクトにデバッグ設定ファイルを作成します。
    1. VS Codeの左側のアクティビティバーから 「実行とデバッグ(Run and Debug / 再生マークと虫のアイコン)」 を開きます

    2. 「launch.json ファイルを作成します」というリンクをクリックし、環境としてCortex Debug を選択します

    3. 生成された .vscode/launch.json の中身を、以下の内容にすべて書き換えて保存します

      実行ファイルのパスは適宜指定してください。

    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Debug nRF52 (Pico Probe)",
    "type": "cortex-debug",
    "request": "launch",
    /* VS CodeにOpenOCDの起動と管理を任せる */
    "servertype": "openocd",
    "cwd": "${workspaceFolder}",
    "executable": "${workspaceFolder}/build/${workspaceFolderBasename}/zephyr/zephyr.elf",
    /* Homebrew版のOpenOCDと、Nordic版のGDBを組み合わせる */
    "serverpath": "/opt/homebrew/bin/openocd",
    "gdbPath": "/opt/nordic/ncs/toolchains/185bb0e3b6/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb",
    "searchDir": [
    "/opt/homebrew/share/openocd/scripts"
    ],
    "configFiles": [
    "${workspaceFolder}/openocd.cfg"
    ],
    "runToEntryPoint": "main",
    "showDevDebugOutput": "none"
    }
    ]
    }

    openocdの設定

    プロジェクトのルートディレクトリ(Zephyr_blinky)フォルダの直下、CMakeLists.txt などと同じ場所)に、新しくopenocd.cfgという名前のファイルを作成し、以下の内容を入力して保存します。

    # 1. デバッガのインターフェースを指定 (Pico Probe)
    source [find interface/cmsis-dap.cfg]

    # 2. 通信方式をSWDに指定
    transport select swd

    # 3. 通信速度を指定
    adapter speed 4000

    # 4. ターゲットチップを指定 (nRF52)
    source [find target/nrf52.cfg]


    書き込み・デバッグ

    1. VS Code左側の「実行とデバッグ」タブを開きます。

    2. 画面左上のドロップダウンに Debug nRF52 (Pico Probe) が選択されていることを確認します

    3. その横の 緑色の再生ボタン(Start Debugging) をクリックするか、キーボードのF5キーを押します

    これだけで、以下の処理が自動で行われます

    • Cortex-DebugがOpenOCDを起動し、Pico Probeに接続

    • Zephyr.elf をHY0020のFlashメモリに自動書き込み(Flash)

    • プログラムをリセットして実行を開始

    • C言語の main() 関数の最初の行で自動的に一時停止(ブレーク)

    あとはVS Code上部のデバッグツールバーを使って、ステップ実行(F10/F11)や変数の確認など、モダンなC言語デバッグがフル機能で利用できます。


    Tips

    デバッグを開始した時、ブレークポイントを設定したにも関わらず止まってくれないことがあります。
    そんな時はprj.confに以下を追記します。
    CONFIG_DEBUG_OPTIMIZATIONS=y

    これで実際のコードの場所で止まってくれます。

0 件のコメント:

コメントを投稿