QMKをICEでデバッグ


ICE?

この記事でいうICEとは、ブレークポイントやウォッチやステップ実行のこと。

ST-LINK?

STMicroelectronicsのICEプローブ。PC→(USB接続)→ST-LINK→(SWD接続)→STM32とつながる。

環境

  • STM32F072の評価ボード STM32F072B-DISCO
    • ボード上にST-LINKが載っている。
    • STM32F072側のFlashに書き込まれているファームウェアは出荷時のデモを想定。もし違っていても、SWDがつながる状態ならOK。SWD接続に必要なA13 / A14ピンを使ってしまうファームもたまによくある。
    • ST-LINK側のファームウェアはアップデートしておく。アップデータ
  • Ubuntu on WSL2
  • Ubuntu on WSL2からcode .で開いたリモートモードのVSCode

接続

評価ボードのST-LINK側のUSB mini-BをPCにつなぐ。ドライバはSTMicroelectronicsから。

評価ボードのジャンパはldd(左側中段)とST-LINK / DISCOVERY(右上)両方とも装着。

インストール(Windows側)

  • OpenOCD (ICE用のgdbserver。いろんなICEプローブとマイコンに対応)
    1. バイナリを取ってくる
    2. openocd -f interface/stlink.cfg -f target/stm32f0x.cfg -c "bindto 0.0.0.0"を実行
    3. openocdがTCPポートをLISTENしはじめたら、ファイアウォールを開ける。gdbを待機しはじめたらOK。
    4. openocdがgdbを待機せず、すぐ終了してしまう? その場合、STM32F072側のファームウェアをDFUで(つまりSTM32F072側のUSB mini-B経由で)書き込んで出荷時に戻す。

インストール(Ubuntu on WSL2側)

  • gdb-multiarch (ARMをターゲットにできるgdb)

    • sudo apt install gdb-multiarch
  • VSCodeのエクステンション Native Debug

ビルド

~/qmk_firmwareディレクトリ上で、

make *keyboard*:*layout* OPT=g

これで.buildディレクトリにデバッグ用の*keyboard*_*layout*.elfファイルができる。tasks.jsonに設定しておくといい。

A13 / A14ピンの罠

今回*keyboard*としてretro_75を使ったところ、SWD接続に必要なA14ピンを使ってしまっている。retro_75のconfig.hの45行目を以下のように書き換えて、A14の代わりにC0ピンを使った。

keyboards/retro_75/config.h
#define MATRIX_COL_PINS { A5, A4, A3, F0, C15, C14, C13, A6, B11, B10, B2, B1, B0, A7, C0, A15 }

launch.jsonの設定

まず、WSL2側から見えるWindows側のIPアドレスを調べる。WSL2側からWindows側のIPアドレスを調べる方法

もし172.26.48.1だとすると、VSCodeのlaunch.jsonは以下のとおり。

.vscode/launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Attach to OpenOCD",
            "type": "gdb",
            "request": "attach",
            "executable": "${workspaceFolder}/.build/*keyboard*_*layout*.elf",
            "target": "172.26.48.1:3333",
            "remote": true,
            "cwd": "${workspaceFolder}",
            "gdbpath": "gdb-multiarch",
            "autorun": [
                "load"
            ]
        }
    ]
}

なお、WSL2側から見えるWindows側のIPアドレスは固定ではない模様。だるい。

ブレークポイントを設定

マトリックスをスキャンするたびに実行される場所にブレークポイントを設定する。quantum/matrix.cread_cols_on_row()あたりが手頃。

実行

(gdb) Attach to OpenOCDをデバッグ開始。

ブレークポイントで止まったよ!

コールスタックも見えるよ!