nrf51822ベースのmbedデバイス(mbed HRM1017やBLE nanoなど)を使うとき、通常はSoftdeviceとプログラムを結合したhexファイルを使って書き込みます。
しかし、この結合に利用するプログラムmergehexが使えない場合、どうやって書き込むば良いのか?Flash Memoryに書き込むデータは実はそのまま残っているのではないか?そう考えて調査してみました。(詳細はPDF版参照)
mergehexを使えないケースの例。
- Windows以外の環境でmergehex相当の作業を行いたい場合
Nordic nRF51 SDKやIoT SDKを使いたいが、nRF-51-Toolsをダウンロード出来るライセンスが無い。2015/02/21(ライセンス不要となっていることが分かったので、削除)- nordic SDK (Available from http://developer.nordicsemi.com/)
- IoT SDK (https://www.nordicsemi.com/eng/Products/Bluetooth-Smart-Bluetooth-low-energy/nRF51822)
結局、Softdevice→プログラムの順でhexファイルを書き込めば結合しなくても書き込めることが分かりました。ただし、プログラムのhexファイルのアドレス指定の調整が必要な場合があります。
全てのケースでうまく行くかどうかは分かりませんが、Nordic IoT SDK 0.7.0のipv6_icmpとS110使用のSDK上でarm gccでコンパイルした別のプログラムで試したところ、以下でうまく行きました。
- コンパイラにKeilを使っている場合はそのまま書き込めば動く
- まずSoftdevice hexファイルをDrag&Dropで書き込む
- 次にプログラムhexファイルをDrag&Dropで書き込む。
- コンパイラにarmgccを使っている場合はアプリケーションのhexファイルのアドレス指定を変更すれば動く
- まずSoftdeviceを書き込む。
- 次に以下の文字列変換を行う。(I32HEXに準拠させる。)
:020000021000EC -> :020000040001F9
:020000022000DC -> :020000040002F8
:020000023000CC -> :020000040003F7
:020000024000BC -> :020000040004F6
:020000023000CC -> :020000040003F7
:020000024000BC -> :020000040004F6
たとえば、1行目は次の様に変換される。
:020000021000EC :1080000000400020B5BC0100FDBC0100FFBC010028 :108010000000000000000000000000000000000060 |
→
|
:020000040001F9
:1080000000400020B5BC0100FDBC0100FFBC010028 :108010000000000000000000000000000000000060 |
- もっとしっかり変換したい場合は、スクリプトなどで処理する必要があります。Pythonで作るとこうなりました。
- 修正後のプログラムhexファイルをDrag&Dropで書き込む。
mbed I/FのFirmwareで形式(02)にも対応してくれると良いのですが...
- 多分、以下がソースです。対応するのは難しくは無さそうです。
(276-298行を312行-にコピー、シフトビット数を24,16から12,4に変更する。)
https://github.com/NordicSemiconductor/CMSIS-DAP/blob/master/interface/Common/src/intelhex.c
0 件のコメント:
コメントを投稿