さぁ、Mac でも自力で書き込みができるようになったのでテンションが上がってきました。本記事はこのマイコンの欠点を多少なりとも和らげる方法です。
ブートエントリーピン欲しくない?
このマイコンの欠点は、プログラム中に明示的に書かなければ DFU ブートローダーにエントリーしないことです。
もっと根本的に言うと、正しいプログラムをブートローダーが認識すると、DFU に入らず直接ユーザープログラムを実行しにかかる、ということです。
でも、普通のマイコンみたいに、起動時に特定のピンのレベルによってブートローダーを起動させたいですよね。
ということで、今回はチョイ記事ですがその実装をしたよ!と言う内容です。
起動時にブートエントリーするプログラム
つまるところ、条件分岐でブートローダーに飛ぶプログラムを書けば良いのです。このようなプログラムに必要な動作は概ね以下と言ったところでしょうか。
- とあるピンを入力にする
- ピンのデータを読み、その値によって
GO_DFU()
する
まあ簡単ですねハッキリ言って。んで、ここをレジスタ手打ちで行こうと思ったのですが、最悪ミスるとまた起動不能になって面倒くさいので、ここはライブラリの手を借ります。こんな感じ。
#include <ft900.h>
#include <ft900_startup_dfu.h>
void entry_dfu_if_low(uint8_t gpio) {
gpio_dir(gpio, pad_dir_input);
gpio_pull(gpio, pad_pull_pullup);
if( gpio_read(gpio) == 0 ) {
GO_DFU();
}
}
後は、main 関数の一番上にこれを呼んでおけば良いわけです。今回は GPIO38 をエントリーピンにしました。ここのルーチンを抜けた後は GPIO38 を別の用途に使うことが出来ます。
int main(void) {
entry_dfu_if_low(38);
...
...
while(1) {
...
}
}
使ってみた感想ですが、内部プルアップが効いていないですね。やはりマイコンの内部プルアップは信用してはいけなかった...
起動時に GPIO38 を Low にすると DFU ブートローダーが起動します。High だと main 関数の下に書かれたユーザープログラムが起動すると言った感じですね。