「ハマりどころ」で記事を作るのってめったに無いですが、非常に苦しんだので掲載します。
参考資料
本記事シリーズで参考にしている資料です。また、書き込みソフトも作りましたのでそれも合わせて。
- Renesas RA2A1グループ ユーザーズマニュアル ハードウェア編
- ピン配置やペリフェラル設定は全てこちらに載っています。
- Renesas RA Family System Specifications for Standard Boot Firmware
- Application Note です。
- ブートローダの仕様で、プログラマを作るのにこちらを参照しました。
ハマりどころ
本題来ました。正直このシリーズを書こうと思ったキッカケです。マイコンを殺すハマりどころですのでたちが悪いんですよ。
プログラマソフトでの接続シーケンス
上で述べたアプリケーションノートには割りと詳しめに、接続シーケンスやコマンドの送受信方法が書いてあります。とても読みやすいと思いますが...1つだけ注意点があります。
まあまずは問題の箇所を見ましょう。
まずは 0x00(Low pulse) を2回送るようです。実際にそうするとマイコンから 0x00 が返ってきました。
お次に 0x55
(Generic Code) をそのまま送るのか、と思いきやそうではありません。以下に示すコマンドパケットに乗せて送る必要があります。コマンドパケットのフォーマットは以下の通り。
概ね記載されているとおりのデータ列を遅ればいいです。あえて述べるなら、SUM は LNH から直前までのデータの和を取り、8bit 変数において2の補数としたものです。つまり和を取ったものに対してビット反転をして、1を加算すればよいということです。
以上を踏まえると、[0x01, 0x00, 0x01, 0x55, 0xAA]
を送れば良いのです。
ここもまたややこしいことなのですが、通常こういうデータを送るとステータスコードを載せたデータパケットが返ってくるのですが、今回の Generic Code に限っては裸の 0xc3 が返ってきます。
結構ハマったんだよねこれ。
Flash領域中のオプション・メモリプロテクション領域
マイコンってよくコンフィグレーション用の領域ってあるじゃないですか。例えば STM32 にもあります。BOD とか WDT、クロック周波数の設定が書いてありますよね。まあこの設定ミスったら死ぬんだけど(例えば 3.3V 電源なのに BOD しきい値を 3.6V に設定したらご臨終)。
このようなコンフィグレーション領域が、RA マイコンでは コード Flash 領域中のよく分からない所にあります。
このマイコンではコード Flash 領域が 0x00000000 〜 0x0003FFFF にマッピングされているのですが、この領域が 0x400 〜 0x43B にあります(ユーザーズマニュアルの記載をよく見るとどうも 0x439 までらしいが細かいことは気にしない...)。0x400
というと 1KB の位置にありますので、気づかずに書き込み等をするとまぁ割りと早い段階でこの位置に達しますよね...
これをミスると、例えば Flash 領域がロックされて書き換えられなくなったり、ウォッチドッグタイマが暴走して無限にリセットがかかる状態になったりして実質マイコンが死にます。いや、何でそこにしたし。
ですのでリンカスクリプトを書く際は注意が必要で、例えば僕は割り込みベクタテーブル以外のコードは 0x440 から置くことにしようと思います。
また、これは SCI ブートローダの挙動にも影響を与えます。
こちらは SCI ブートローダーのブートシーケンスです。見ると、SECMPUAC = FFFFh じゃないとシリアルプログラミングモードに入らずリセットしてしまうようです。つまりうっかりこの値を書き換えてしまうと詰みです。窓から投げ捨てるしかありません。南無三。
〆
ということで、つらいつらいハマりどころでした。僕はまんまとハマって、手持ちの RA マイコンちゃんを全ておじゃんにしてしまいました...
現状書き込みソフトを Python で作って入るのですが、如何せん実機がないので試し用がありません。というか試すことすら怖いです...(またマイコンを殺してしまうのではないかという恐怖心)。
ともかく、実機が到着したら当たって砕けろの精神でアタックしていきたいと思います。
また、マイコンぶっ殺案件がまた出てきたら追記します。追記が無いように祈っていますが......