SNSへはこちら

Nuvotonマイコンを試食(1) - とりあえずの導入(失敗編)

最近半導体が不足している中、秋月で台湾の Nuvoton 社から出ている ARM Cortex-M0 の 32bit マイコンを購入したのでレビューします。
買ったのはこちらのマイコンボード。とはいえ今は在庫ないね。本当はチップ単体が良かったけど入手性としてはこのボードでした。

とりあえず目標としては、大体のペリフェラルをコマンドラインで動作させることとしますか。

今回の記事はコマンドライン環境で動かそうと試行錯誤した結果、失敗したということを示すものです。もちろん次回以降は成功した方法を示しておきますよ。
あくまでも試行錯誤の過程を示しておきます。

参考資料

  • マイコンボードのデータシート
    • 回路図などあり。上の秋月のページからダウンロード。一方で開発環境として Keil とかがのっていてけしからん
  • マイコンそのもののリファレンスマニュアル
    • NuMicro NUC100/NUC120 Series のものを用意してください。

構成

  • デバッガ:NuLink
    • CMSIS-DAP とは異なる。SWD を使用していない??要調査
    • とにかくよくわからないもの扱い。
  • MCU: NUC120LE3AN (Medium Density)
    • CPU コアは Cortex-M0 (SysTick タイマー付き)
    • 動作クロックは 48MHz
    • Flash: 128kBytes
    • RAM: 16kBytes

digi-key で探すと、当該チップは 600円台。フラッシュ容量にしては優秀かと思う。

Flashメモリ構成

いわゆる ROM のことですが、単にプログラムを格納する不揮発性メモリである以上に意味を持ちます。

LDROMとAPROM

プログラムメモリ領域には2つの分類があります。

LDROM

Loader Program Memory ということらしいです。いわゆるブートローダー。後に示す User Configuration でブートローダーを使うか否かを設定できます。
今回の記事シリーズでは一旦使わないので解説は省略。僕自身仕様を理解していないし。

APROM

Application Program Memory。いわゆるユーザープログラムを書く場所。通常のマイコンプログラムはここに格納されます。LDROM が無効化されているときは Flash 領域がすべてこれになります。

User Configuration

この2つ以外のその他ですが、いわゆるヒューズです。起動時に読み込まれる不揮発性の設定が格納されています。
ただこれは ROM 領域というよりかは、別領域に用意されています。このコンフィグを書き換える動作をデバッガ側で意識的にしなければ気にする必要はありません。そう、NXP の CRP やルネサスマイコンのようにハマらなくていいのだ。

主なものを挙げると、リセット後の CPU クロックソース、ブラウンアウトリセット(BOR)、LDROM からブートするか、Flash のセキュリティロックなどです。ここを間違うとちょっと面倒なことになるかもしれません。ただ、ざっと見た限りここの値を間違ったからと言って即座に死ぬということはなさそうです。

OpenOCDで接続

では「どうせ ARM マイコンだから簡単に行けるやろ」と舐めた結果を御覧ください(というか僕は悪くないと思う)。

とりあえずデバッガである NuLink の方の USB コネクタに接続して OpenOCD サーバーを起動。

$ openocd -f interface/nulink.cfg -f target/numicro.cfg
Open On-Chip Debugger 0.11.0+dev-g6448f70 (2021-03-24-20:48)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
hla_swd
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 1000 kHz
Info : Nu-Link firmware_version 163, product_id (0x00012009)
Info : Adapter is Nu-Link
Info : IDCODE: 0x00012009
Warn : UNEXPECTED idcode: 0x00012009
Error: expected 1 of 1: 0x0bb11477

なんか IDCODE が異なるって怒られてますね。
詳細はわかりませんが、実チップは 0x00012009 という値を返しているみたいなので、cfg ファイルを改造してみましょうか。

/usr/local/Cellar/open-ocd/HEAD-6448f70/share/openocd/scripts/target (僕の環境の場合)にある numicro.cfg をホームディレクトリにコピって来て編集します(17行目)。

    set _CPUDAPID 0x00012009 # 16進数表記のものをこのように書き換える

んで実行してみましょう...

$ openocd -f interface/nulink.cfg -f ~/numicro.cfg
Open On-Chip Debugger 0.11.0+dev-g6448f70 (2021-03-24-20:48)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
hla_swd
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 1000 kHz
Info : Nu-Link firmware_version 163, product_id (0x00012009)
Info : Adapter is Nu-Link
Info : IDCODE: 0x00012009
Info : NuMicro.cpu: hardware has 32 breakpoints, 0 watchpoints
Info : starting gdb server for NuMicro.cpu on 3333
Info : Listening on port 3333 for gdb connections

うまく行ったっぽいです!ではメモリを読み出す前に情報を得ることとしましょう。先程の openocd のコマンドの直後に -c 'flash banks' というパラメータをつけると、以下のアドレスマップ一覧が得られます。

$ openocd -f interface/nulink.cfg -f ~/numicro.cfg -c 'flash banks'
...(略)
#0 : NuMicro.flash_aprom (numicro) at 0x00000000, size 0x00000000, buswidth 0, chipwidth 0
#1 : NuMicro.flash_data (numicro) at 0x0001f000, size 0x00000000, buswidth 0, chipwidth 0
#2 : NuMicro.flash_ldrom (numicro) at 0x00100000, size 0x00000000, buswidth 0, chipwidth 0
#3 : NuMicro.flash_config (numicro) at 0x00300000, size 0x00000000, buswidth 0, chipwidth 0

これはデータシートのメモリマップと一致していますし、通信はいい感じに成功しているようですね(後述のように気のせい)。

User Configurationの値

じゃあ早速プログラム領域を弄りたい所ですが、User Configuration の値はどうなっているのでしょうか。

まずは OpenOCD を起動し、gdb を起動し読みます。

$ arm-none-eabi-gdb
GNU gdb (GNU Arm Embedded Toolchain 10-2020-q4-major) 10.1.90.20201028-git
(gdb) tar ext:3333
Remote debugging using :3333
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
warning: Overlapping regions in memory map: ignoring
0x00000000 in ?? ()
(gdb) p/x *(unsigned int *)0x300000
$1 = 0x12009

あれ、そういえばこの 0X12009 と言う値、どのアドレスでも読まれるぞ...?そういえばさっきの IDCODE もこの値でしたね。とすると、多分通信がうまく行っていないのでしょうか。いや絶対うまく行っていません。
たぶんですが、このマイコンボードに搭載の NuLink との接続がうまく行っていない説ありそうです。

Nuvoton はここで OpenOCD のパッチを配布しているようですが、これを適用した OpenOCD のビルドをして、そこから書き込もうとしても無理でした。
苦労が水の泡...

$ src/openocd -s tcl/ -f interface/nulink.cfg -f target/numicroM0.cfg
Open On-Chip Debugger 0.10.0-dev-00477-g57b40002-dirty (2022-02-13-22:26)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : clock speed 1000 kHz
Info : NULINK is Nu-Link1
Error: claim interface failed(-3)
in procedure 'init'
in procedure 'ocd_bouncer'

と、今回は暗い内容でしたが失敗記録の内容です。
実際はその後の手段(荒業?)によって接続および所望のプログラム書き込みが成功していますが、それは次の記事でご覧頂きましょう。

ARM マイコンと言えども、こうやってハマる時があるんだなあ。久々に煮詰まったいい経験でした。