前回の記事で「なんかプログラムが動かないことがある」なんて言いましたが、今回はその原因が分かりました。
ズバリ、書き込み用ツールとして使っていた dfu-util
が GD32VF マイコンに対応していなかったということです。なんか怪しかったんだよなぁ...
発見の経緯
前に述べたかと思いますが、Mac は GD32VF マイコン開発用として公式に存在する Platformio のツールチェインが使えません。ダウンロードしようとしてもエラーになります。
そこで、公式に使用できる Linux マシン(自宅の Ubuntu を入れた MacBook Air)で実行・書き込みをしてみたところ、こちらも時折動く、くらいの状況でした。コンパイラに不備はないし...
つまり、できたプログラム自体には不具合はないのではないかと思ったわけです。
GD32VF マイコンのツールたちを見ているとこちらに dfu-util の専用 fork があるんですね。ひょっとして...
これをビルドして Mac で作ったバイナリと Ubuntu で作ったバイナリをそれぞれ書き込んでみたところ、どちらも正常に動作するという結果になったのでした。。。
というわけで
上のツール(GD32 DFU Utils) をビルドしましょう。Mac で libusb を使う必要があるのですが、一癖あります。
$ brew install libusb
$ git clone https://github.com/riscv-mcu/gd32-dfu-utils
$ cd gd32-dfu-utils
ここまで来ても configure
できません。「Version 1.0.0 以上の libusb が必要なんだけど(怒」と言われるのですが、さっきインストールしたはずです。
configure の改造
そこで、強行突破してしまいましょう。4137 行目と 4141 行目のエラー処理をコメントアウトして、エラーを握りつぶします。
# as_fn_error $? "*** Required libusb-1.0 >= 1.0.0 not installed ***" "$LINENO" 5
これで、configure
だけはできるようになります。
$ ./configure
Makefile の改造
エラーを握りつぶしてしまったので、この後実際に make
しようとしてもできません。こちらも Makefile
を改造する必要があります。
まずは src ディレクトリに入ります。
$ cd src
まず、そのままだと libusb のヘッダが見つからんと怒られてしまうので COMPILE
変数の中身に、-I
を強引に追加します。121 行目。
COMPILE = $(CC) -I /usr/local/Cellar/libusb/1.0.23/include/libusb-1.0 $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
ここのバージョンはみなさんがインストールしたものに合わせてください。
続いてリンク時にも dylib が無いと怒られるので、こちらも LINK
変数に追加。128 行目。
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -L /usr/local/Cellar/libusb/1.0.23/lib -lusb-1.0 -lusb-1.0.0
これで OK。あとは make
して、dfu-util
dfu-prefix
dfu-suffix
を取り出せば良いのです。パスの通ったところに置きましょう。
書き込みしてみよう
ふぅ、これでやっとこれまでどうしても動かなかった delay_1ms
関数とかが使えるようになります(というか、そもそもバイナリを正常に書き込むことができるようになります)。
公式のファームウェアもそのまま使えるので、これでやっとスタートラインに立てたということになります。
まずは前回 src/startup.s
でコメントアウトした部分を戻します。そして、main.c を以下のようにしてみました。
#include <gd32vf103.h>
#include <systick.h>
int main(void){
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_ALL);
while(1) {
delay_1ms(1000);
GPIO_OCTL(GPIOC) ^= GPIO_PIN_13;
}
return 0;
}
しかし、このままでは delay_1ms
がうまく動いてくれず、ディレイ時間がよく分からないことになります。そこで以下のコードを start.s
に追加します。
/* argc = argv = 0 */
call _init # ADD ME
li a0, 0
li a1, 0
call main
tail exit
これで make && make flash
とすればいいです。お疲れさまでした。
こういうのって夜中に解決するのよね...眠い...
コメント
同じ環境でいじってみており、大いに参考にさせていただいております。
ありがとうございます。
↑のmacでの問題ですが、 configure を見ると、pkg-config がないと、pkg_failed=yes になってしまい、configure: error: *** Required libusb-1.0 >= 1.0.0 not installed *** になってしまうようです。
私の mac では brew install libusb pkg-config をやったあとに ./configure && make でできました。同じ現象かはわかりませんが、ご参考まで。
アドバイスありがとうございます。
私の Mac の方でも pkg-config が入っているのですが、どうやら認識されないようで、pkg-config --libs libusb が見つからないと起こられるんですよねー...
肝心の pkg-config は /usr/local/lib/pkgconfig にある .pc ファイルを読み込むようで、何故だかデフォルトではこのパスを探しに行かない...
なので ./configure と make それぞれのコマンド先頭に PKG_CONFIG_PATH=/usr/local/lib/pkgconfig を付けることで解決しました。
おかげさまで色々と勉強になりました。